![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поведение сокета при отправке данных [D5, WinXP]
VID © (2004-06-06 14:38:00)Есть соединение клиента с сервером. Находятся на разных машинах, в разных сетях.
Внезапно сервер был выключен, даже можно сказать "убит" (принудительное завершение процесса).
И клиент думает что он до сих пор подключён к серверу.
Вопрос: что произойдёт при попытке отправки данных этим клиентом, уже не существующему серверу методом
Client.Socket.SendText() ?
Сгенерирует ли клиент событие OnError , или же всё произойдёт тихо, так будто бы всё нормально ?
If an error occurs while writing to the connection, SendText terminates the connection and raises an ESocketError exception.Не вселяет особого оптимизма.
Вот реализация отправки данных:
function TCustomWinSocket.SendBuf(var Buf; Count: Integer): Integer;
var
ErrorCode: Integer;
begin
Lock;
try
Result := 0;
if not FConnected then Exit;
Result := send(FSocket, Buf, Count, 0);
if Result = SOCKET_ERROR then
begin
ErrorCode := WSAGetLastError;
if (ErrorCode <> WSAEWOULDBLOCK) then
begin
Error(Self, eeSend, ErrorCode);
Disconnect(FSocket);
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(ErrorCode), ErrorCode, 'send']);
end;
end;
finally
Unlock;
end;
end;
Result := send(FSocket, Buf, Count, 0);
Если ли гарантия что send вернёт SOCKET_ERROR в описанном выше случае ?
И ещё, что такое WSAEWOULDBLOCK ? ( if (ErrorCode <> WSAEWOULDBLOCK) then)
Digitman (2004-06-07 08:13:00) [1]
> Если ли гарантия что send вернёт SOCKET_ERROR в описанном
> выше случае ?
есть
> что такое WSAEWOULDBLOCK
в дан.случае - код ошибки, показывающий, что ожидаемый результат операции записи не может получен немедленно - буфер записи гнезда заполнен и не может разместить затребованное для передачи число байт, указанных параметром ф-ции
VID (2004-06-06 14:41:00) [2]Клиент неблокирующий. Сервер тоже.