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

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

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).
И вообще непонятно, зачем нужно терминировать процесс сервера, если произошел всего лишь некритический отказ в коммуникации с одним из клиентов (другие-то активные клиенты в чем виноваты перед сервером, что он их всех сразу "кидает" из-за разрыва связи с каким-то одним ?)


Наверх

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