Автор | Сообщение |
|
| |
Пост N: 17
Зарегистрирован: 28.07.10
|
|
Отправлено: 26.10.10 05:47. Заголовок: Что-то hb_InetServer косячит?
|
|
|
Ответов - 6
[только новые]
|
|
|
| |
Пост N: 19
Зарегистрирован: 28.07.10
|
|
Отправлено: 27.10.10 08:12. Заголовок: Есть ли потребность ..
Есть ли потребность доработать документашку по HB_INET*() до приличного вида? Или где-то уже есть? - тогда скажите мне.
|
|
|
|
| Администратор
|
Пост N: 1679
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.10.10 09:45. Заголовок: А какая ошибка ?..
А какая ошибка ?
|
|
|
|
| постоянный участник
|
Пост N: 979
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.10.10 20:31. Заголовок: SADSTAR33 пишет: пр..
SADSTAR33 пишет: цитата: | при передаче второго аргумента в виде строки с ip-адресом в десятично-точечной нотации - выпадает на ошибку |
| Pasha пишет: А там одна ошибка может быть - EG_ARG, ошибочный параметр С проверками намудрили, короче косяк в Harbour, если второй параметр не указатель на сокет - RTE Для илюстрации 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()
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 28.07.10
|
|
Отправлено: 28.10.10 00:39. Заголовок: Pasha пишет: А кака..
1. Pasha пишет: 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) 2. Петр пишет: Правильно ли я понял, что вы предложили вариант подстановки локального адреса в серверный сокет? Но Локальный адрес не сохраняется. Или я неправильно делаю? 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 3. А нельзя ли использовать HB_SOCKETBIND() для установки адреса? Или функции HB_SOCKET*() и HB_INET*() смешивать нельзя? И что - переделывать все на HB_SOCKET*()? Или можно поправить HB_InetServer()?
|
|
|
|
| постоянный участник
|
Пост N: 980
Зарегистрирован: 09.10.06
|
|
Отправлено: 29.10.10 11:52. Заголовок: SADSTAR33 пишет: Пр..
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 ) ) )
|
|
|
|
| постоянный участник
|
Пост N: 985
Зарегистрирован: 09.10.06
|
|
Отправлено: 31.10.10 23:34. Заголовок: Петр пишет: написат..
Петр пишет: цитата: | написать 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
|
|
|
|