Форум » [x]Harbour » Что-то hb_InetServer косячит? » Ответить

Что-то hb_InetServer косячит?

SADSTAR33: //oSocket:=hb_InetServer( nLocalPort, cLocalAdr ) oSocket:=hb_InetServer( nLocalPort) при передаче второго аргумента в виде строки с ip-адресом в десятично-точечной нотации - выпадает на ошибку Кто нибудь применял второй аргумент? Заодно - тут у меня некоторая документашка по HB_INET* функциям Может кому пригодится

Ответов - 6

SADSTAR33: Есть ли потребность доработать документашку по HB_INET*() до приличного вида? Или где-то уже есть? - тогда скажите мне.

Pasha: А какая ошибка ?

Петр: SADSTAR33 пишет: при передаче второго аргумента в виде строки с ip-адресом в десятично-точечной нотации - выпадает на ошибку Pasha пишет: какая ошибка ? А там одна ошибка может быть - EG_ARG, ошибочный параметр С проверками намудрили, короче косяк в Harbour, если второй параметр не указатель на сокет - RTE Для илюстрации [pre2]PROCEDURE main LOCAL socket, oErr hb_inetInit() BEGIN SEQUENCE WITH {|e| Break( e )} socket := hb_inetServer( 5000, "127.0.0.1" ) RECOVER USING oErr ? oErr:description END ? hb_inetIsSocket( "127.0.0.1" ) socket := hb_inetConnectIP( "127.0.0.1", 5000 ) IF hb_inetIsSocket( socket ) ? hb_inetPort( socket ) socket := hb_inetServer( 4500, socket ) ? hb_inetIsSocket( socket ) ? hb_inetPort( socket ) ENDIF hb_InetCleanup() [/pre2]


SADSTAR33: 1. Pasha пишет: А какая ошибка ? [pre2] Date: 26.10.10 Time: 10:08:50 Error BASE/3012 Argument error: HB_INETSERVER Called from HB_INETSERVER(0) Called from CREATELISTENSOCKET(238) Called from START(141) Called from (b)MAIN(48) Called from _DOCONTROLEVENTPROCEDURE(1715) Called from EVENTS(1444) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1450) Called from MAIN(62) [/pre2] 2. Петр пишет: Для илюстрации Правильно ли я понял, что вы предложили вариант подстановки локального адреса в серверный сокет? Но Локальный адрес не сохраняется. Или я неправильно делаю? [pre] C:\Harbour_projects\Proba_InetErr>proba1.exe Argument error .F. socket:=hb_inetConnectIP( "127.0.0.1", 5000 ) socket.addr= 127.0.0.1 socket.Port= 5000 socket:=hb_inetServer( 4500, socket ) .T. socket.addr= 0.0.0.0 socket.port= 4500 [/pre] 3. А нельзя ли использовать HB_SOCKETBIND() для установки адреса? Или функции HB_SOCKET*() и HB_INET*() смешивать нельзя? И что - переделывать все на HB_SOCKET*()? Или можно поправить HB_InetServer()?

Петр: SADSTAR33 пишет: Правильно ли я понял, что вы предложили вариант подстановки локального адреса в серверный сокет? Но Локальный адрес не сохраняется. Нет, просто это первое, что мне пришло в голову (я имею ввиду адрес). Не сохраняется ни адрес, ни порт. Там по ходу существующий сокет закрывается. SADSTAR33 пишет: А нельзя ли использовать HB_SOCKETBIND() для установки адреса? Или функции HB_SOCKET*() и HB_INET*() смешивать нельзя? И что - переделывать все на HB_SOCKET*()? Или можно поправить HB_InetServer()? HB_INET*() семейство использует C API функции HB_SOCKET*(). HB_InetServer не только можно, но и нужно поправить. Вместо if( ! HB_ISNUM( 1 ) || ( socket == NULL && ! HB_ISNIL( 2 ) ) ) написать if( ! HB_ISNUM( 1 ) || ( socket == NULL && ! HB_ISCHAR( 2 ) ) )

Петр: Петр пишет: написать if( ! HB_ISNUM( 1 ) || ( socket == NULL && ! HB_ISCHAR( 2 ) ) ) Нет [img src=/gif/smk/sm40.gif] Разобрался только с помощью xHarbour Language Reference INetServer( <nPort> , ; [<pRawSocket>] , ; [<cIPAddress>] , ; [<nMaxConnections>]) --> pServerSocket Оказывается у INetServer должно быть 4, а не 3 параметра! И строка с ip-адресом в десятично-точечной нотации - это должен быть третий параметр. Второй параметр или NIL или "сырой" сокет получаемый функцией INetCreate() (документация о которой в xHarbour Language Reference умалчивает о параметре timeout). Вот такая неразбериха. Значит косяки есть в Harbour и в xHarbour. Для Harbour в src/rtl/hbinet.c заменяем const char * szAddress = hb_parc( 2 ); int iListen = hb_parnidef( 3, 10 ); на const char * szAddress = hb_parc( 3 ); int iListen = hb_parnidef( 4, 10 ); Для xHarbour в src/vm/net.c заменяем if( ! ISCHAR( 2 ) ) { Socket->remote.sin_addr.s_addr = INADDR_ANY; } else { Socket->remote.sin_addr.s_addr = inet_addr( hb_parcx( 2 ) ); } iListen = ISNUM( 3 ) ? hb_parni( 3 ) : 10; на if( ! ISCHAR( 3 ) ) { Socket->remote.sin_addr.s_addr = INADDR_ANY; } else { Socket->remote.sin_addr.s_addr = inet_addr( hb_parcx( 2 ) ); } iListen = ISNUM( 4 ) ? hb_parni( 4 ) : 10; P.S. Сбросил bugfix в Harbour SVN



полная версия страницы