![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Socket [D2, D3, D4, D5, D6, Win95/98, WinME, NT4, Win2k]
anmak © (2001-11-02 16:49:00)Как возобновить работу умершего сокета?
Есть кусок кода в котором происходит облом.
FD_ZERO(fds);
FD_SET(S,fds);
case select(S+1,@fds,nil,nil,@one_second) of
SOCKET_ERROR: // error detected
begin
__close(s);
writeln("server down");
halt(1);
end;
Тык вот как вместо
__close(s);
writeln("server down");
halt(1);
заставить сервер работать поновой неотваливая узе зацепленные коннекты.
Digitman (2002-01-22 14:22:00) [1]если имеется "остаток", вновь возникнет событие OnRead(). В его обработчике считывай очередную ожидаемую порцию, размером не больше чем ReceiveLength. Т.е., всякий раз при возникновении события OnRead() система сообщает тебе о доступности в буфере приема гнезда данных, действительно принятых на этот момент от партнера по коннекту, размером в ReceiveLength байт. Ты же сам в данный конкретный момент (момент обработки события OnRead) волен принимать решение о том, порцию какого необходимого размера тебе нужно считать из буфера (но не более, чем ReceiveLength байт)
KPOT (2002-01-22 13:59:00) [2]Pishu malen"kuju programmku s Socketami, niznaju kak pral"na dejstvovat" v takoj situacii:
inogdana onReceive Socket.ReceiveLength bol"she chem vozvrachaemoje znachenie Socket.ReceiveBuf. Ja tak ponimaju chto znachit prislali mne bol"she chem ja s4ital :((
Kak i kogda ja mogu s4itat" ostatok ???
Zaranee blagodaren
anmak (2001-11-05 14:12:00) [3]да действительно.. зачем?
большое спасибо я киляние убрал
Digitman (2001-11-05 12:50:00) [4]После __close(s) (надо понимать, в нем происходит CloseSocket(s) ?) ни о какой "реанимации" текущего соединения с клиентом не может быть и речи - ты сам разорвал соединение с клиентом, не разобравшись в истинных причинах SOCKET_ERROR. В этом коде нигде нет анализа причин возникшей ошибки (см. WSAGetLastError).
И вообще непонятно, зачем нужно терминировать процесс сервера, если произошел всего лишь некритический отказ в коммуникации с одним из клиентов (другие-то активные клиенты в чем виноваты перед сервером, что он их всех сразу "кидает" из-за разрыва связи с каким-то одним ?)