Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

таймаут сокета   Найти похожие ветки 

 
AllDer   (2007-09-14 11:59) [0]

код работает, но если приложение заблокировано файрволом,то
процедура виснет,хотя явно задал что ждать надо 15 секунд

arg := 15000; //
   if setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@arg,sizeof(arg))= SOCKET_ERROR then exit;

родная Socket GetLastError говорит 0

дальше recvfrom( неидет


 
Сергей М. ©   (2007-09-14 12:16) [1]

Ты справку вообще читал ?

Что за абракадабру ты здесь понаписал ?


 
umbra ©   (2007-09-14 12:21) [2]

SO_RCVTIMEO не поддерживается в Winsock


 
AllDer   (2007-09-14 12:22) [3]

код не мой , но он рабочий


 
AllDer   (2007-09-14 12:23) [4]

umbra

странно но в исходниках так и написано было
и подключен winsock;


 
Сергей М. ©   (2007-09-14 12:26) [5]

Ты справку читал ?


 
umbra ©   (2007-09-14 12:35) [6]

http://msdn2.microsoft.com/en-us/library/ms740476.aspx


 
AllDer   (2007-09-14 12:35) [7]

да читал

The following socket options are available for Windows 2000, Windows NT 4.0,
and Windows Me/98/95:

SO_SNDTIMEO
SO_RCVTIMEO

Details on SO_SNDTIMEO and SO_RCVTIMEO

These two options set up time-outs for the send, sendto, recv, and recvfrom
functions.
You can obtain the same functionality by calling select with a time-out just
before the
I/O call, but these options offer a significant improvement in performance
by avoiding
a kernel transition and the other overhead of the select call. For any code
whose
performance is very critical, applications should use these time-out options
rather than
select.

DWORD    tout    = 60 * 1000;    //1 минута
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*) &tout, sizeof(tout));

Windows recv вернет -1 а WSAGetLastError — WSAETIMEDOUT, после чего сокет должен быть закрыт


 
Сергей М. ©   (2007-09-14 12:46) [8]


> да читал


Да нифига ты не читал)

Для какого level допустимы эти опции ? Для IPPROTO_TCP !
А ты их для какого пытаешься применить ? SOL_SOCKET !

Далее (цитата из справки):

specific error code can be retrieved by calling WSAGetLastError

А ты что вместо э\того вызываешь ? GetLastError !

И ты продолжишь утверждать, что читал справку ?)


 
AllDer   (2007-09-14 13:14) [9]

Сергей М.

какая у вас справка , у меня D5, а вас )

в пункте 7 был приведен пример с rsdn.ru
(sock, SOL_SOCKET, SO_RCVTIMEO,  так что работало значит)

вызываю именно WSAGetLastError
он равен нулю - писал специально что вызваю родную сокетную ошибку

http://www.yandex.ru/yandsearch?text=SOL_SOCKET%2C+SO_RCVTIMEO&rpt=rad

судя по топикам эта конструкция работает, а у нас нет


 
Zeqfreed ©   (2007-09-14 13:22) [10]

SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).

Написано же — winsock2 должен быть.


 
umbra ©   (2007-09-14 13:50) [11]

а как тогда понимать следующее:

BSD options not supported for setsockopt are shown in the following table.

Value                  Type  Meaning
SO_ACCEPTCONN  BOOL  Socket is listening.
SO_RCVLOWAT   int  Receives low watermark.
SO_RCVTIMEO    int  Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
SO_SNDLOWAT  int  Sends low watermark.
SO_SNDTIMEO   int  Sends time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
SO_TYPE      int  Type of the socket.


 
Сергей М. ©   (2007-09-14 13:53) [12]


> какая у вас справка , у меня D5, а вас


Д7.

Она ничем не отличается от Д5, и речь в этих справках идет о Winsock1, поскольку ноги у справки растут еще со времен Win9x/Me, когда Winsoсk2 была еще только в проекте.

И мне непонятно, зачем менять дифолтные значения таймаутов, если для блок.режима есть ф-ция select (работающая на всех платформах всех версий), где значение каки раз и задается таймаута  ..

И чем не угодил неблок.режим - тоже непонятно ..


 
Сергей М. ©   (2007-09-14 13:55) [13]


> umbra ©   (14.09.07 13:50) [11]


Прямо так и понимать - для версии WS 1.x, о которой идет речь в справке, эти опции не поддерживаются.


 
umbra ©   (2007-09-14 13:58) [14]


> для версии WS 1.x, о которой идет речь в справке, эти опции
> не поддерживаются

это цитата с http://msdn2.microsoft.com/en-us/library/ms740476.aspx


 
Сергей М. ©   (2007-09-14 14:10) [15]


> umbra ©   (14.09.07 13:58) [14]


То же самое фигурирует и в справке от D5..D7


 
AllDer   (2007-09-14 19:22) [16]

стало быть выход загнать это в поток и
если зависло на время больше чем 15 сек
делать TerminateThread ?


 
Zeqfreed ©   (2007-09-14 19:37) [17]

> AllDer   (14.09.07 19:22) [16]

Лучше запускать под VMWare в FreeBSD, где поддерживается таймаут. Ага.

Hint: есть сис. вызов select (о чем, кстати, и в справке написано).


 
Сергей М. ©   (2007-09-16 12:09) [18]


> AllDer   (14.09.07 19:22) [16]


> выход загнать это в поток


Не вижу в этом никакой необходимости.


> делать TerminateThread


И тем более плохое решение - терминировать поток без необходимости.

Либо select() либо неблок.режим спасут отца русской демократии)



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
2-1190037815
F@T@L_Err0r
2007-09-17 18:03
2007.10.14
Регулятор громкости


1-1185947117
YCH.Del
2007-08-01 09:45
2007.10.14
Контролы в ячейках TAdvStringGrid


3-1181297910
tsoftware
2007-06-08 14:18
2007.10.14
Теряется фокус у DBGrid


2-1190055058
tymofy
2007-09-17 22:50
2007.10.14
Правила записи record, ...


15-1189617278
Vlad Oshin
2007-09-12 21:14
2007.10.14
Подключение на основе сверхзвуковой ударной волны