Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

таймаут сокета


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]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо