![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
таймаут сокета
AllDer © (2007-09-14 11:59:00)код работает, но если приложение заблокировано файрволом,то
процедура виснет,хотя явно задал что ждать надо 15 секунд
arg := 15000; //
if setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@arg,sizeof(arg))= SOCKET_ERROR then exit;
родная Socket GetLastError говорит 0
дальше recvfrom( неидет
Сергей М. (2007-09-16 12:09:00) [1]
> AllDer (14.09.07 19:22) [16]
> выход загнать это в поток
Не вижу в этом никакой необходимости.
> делать TerminateThread
И тем более плохое решение - терминировать поток без необходимости.
Либо select() либо неблок.режим спасут отца русской демократии)
Zeqfreed (2007-09-14 19:37:00) [2]> AllDer (14.09.07 19:22) [16]
Лучше запускать под VMWare в FreeBSD, где поддерживается таймаут. Ага.
Hint:есть сис. вызов select (о чем, кстати, и в справке написано).
AllDer (2007-09-14 19:22:00) [3]стало быть выход загнать это в поток и
если зависло на время больше чем 15 сек
делать TerminateThread ?
Сергей М. (2007-09-14 14:10:00) [4]
> umbra © (14.09.07 13:58) [14]
То же самое фигурирует и в справке от D5..D7
umbra (2007-09-14 13:58:00) [5]
> для версии WS 1.x, о которой идет речь в справке, эти опции
> не поддерживаются
это цитата с http://msdn2.microsoft.com/en-us/library/ms740476.aspx
Сергей М. (2007-09-14 13:55:00) [6]
> umbra © (14.09.07 13:50) [11]
Прямо так и понимать - для версии WS 1.x, о которой идет речь в справке, эти опции не поддерживаются.
Сергей М. (2007-09-14 13:53:00) [7]
> какая у вас справка , у меня D5, а вас
Д7.
Она ничем не отличается от Д5, и речь в этих справках идет о Winsock 1, поскольку ноги у справки растут еще со времен Win9x/Me, когда Winsoсk2 была еще только в проекте.
И мне непонятно, зачем менять дифолтные значения таймаутов, если для блок.режима есть ф-ция select (работающая на всехплатформах всех версий), где значение каки раз и задается таймаута ..
И чем не угодил неблок.режим - тоже непонятно ..
umbra (2007-09-14 13:50:00) [8]а как тогда понимать следующее:
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.
Zeqfreed (2007-09-14 13:22:00) [9]
SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2).
Написано же — winsock2 должен быть.
AllDer (2007-09-14 13:14:00) [10]Сергей М.
какая у вас справка , у меня D5, а вас )
в пункте 7 был приведен пример с rsdn.ru
(sock, SOL_SOCKET, SO_RCVTIMEO, так что работало значит)
вызываю именно WSAGetLastError
он равен нулю - писал специально что вызваю родную сокетную ошибку
http://www.yandex.ru/yandsearch?text=SOL_SOCKET%2C+SO_RCVTIMEO&rpt=rad
судя по топикам эта конструкция работает, а у нас нет
Сергей М. (2007-09-14 12:46:00) [11]
> да читал
Да нифига ты не читал)
Для какогоlevel допустимы эти опции ? Для IPPROTO_TCP !
А ты их для какого пытаешься применить ? SOL_SOCKET !
Далее (цитата из справки):
specific error code can be retrieved by calling WSAGetLastError
А ты что вместо э\того вызываешь ? GetLastError !
И ты продолжишь утверждать, что читалсправку ?)
AllDer (2007-09-14 12:35:00) [12]да читал
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, после чего сокет должен быть закрыт
umbra (2007-09-14 12:35:00) [13]http://msdn2.microsoft.com/en-us/library/ms740476.aspx
Сергей М. (2007-09-14 12:26:00) [14]Ты справкучитал ?
AllDer (2007-09-14 12:23:00) [15]umbra
странно но в исходниках так и написано было
и подключен winsock;
AllDer (2007-09-14 12:22:00) [16]код не мой , но он рабочий
umbra (2007-09-14 12:21:00) [17]SO_RCVTIMEO не поддерживается в Winsock
Сергей М. (2007-09-14 12:16:00) [18]Ты справку вообще читал ?
Что за абракадабру ты здесь понаписал ?