Текущий архив: 2006.04.09;
Скачать: CL | DM;
Вниз10022 ошибка... Забавно. Найти похожие ветки
← →
Rouse_ © (2005-12-23 00:38) [0]Один из клиентов связывается со мной и сообщает о постоянно возникающей ошибке. Случай именно единичный за два года использования данной реализации транспорта, но никак не могу понять в чем дело.
Ошибка именно 10022Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.
Происходит ошибка после запроса даных на удаленном сервере, но... Но перед этим связь с удаленным сервером была налажена, список содержимого получен, минимальный обмен данными совершен.
По логам происходит как минимум около 12 удачных вопрос-ответ сесий.
Код:procedure TGSClientSocketItem.DoWrite;
var
ID: DWORD;
procedure SocketWrite(const ASocket: TGSClientSocketItem); stdcall;
procedure Complete(const dwError, cbTransferred: DWORD;
const lpOverlapped: LPWSAOVERLAPPED;
const dwFlags: DWORD); stdcall;
begin
if dwError <> 0 then
PostMessage(lpOverlapped.hEvent, SOCKET_NOTIFY_MSG, WSAGetLastError, FD_ERROR);
end;
var
Err: Integer;
Overlapped: _OVERLAPPED;
Buffer: WSABUF;
SndCount: DWORD;
begin
try
FillChar(Overlapped, SizeOf(_OVERLAPPED), #0);
Overlapped.hEvent := ASocket.FServer.FHandle; // Для нотификации об ошибке
Buffer.buf := Pointer(ASocket.FSendStream);
Buffer.len := Length(ASocket.FSendStream);
if WSASend(ASocket.FSocket, @Buffer, 1,
SndCount, 0, @Overlapped, @Complete) = SOCKET_ERROR then
begin
Err := WSAGetLastError;
if Err <> ERROR_IO_PENDING then
begin
ASocket.FServer.Error(Err);
ASocket.DelState(gsWriting);
Exit;
end;
end;
// Ждем пока не отправятся все данные
ASocket.FEvent := WSACreateEvent;
try
Err := WSAWaitForMultipleEvents(1, @ASocket.FEvent,
False, WSA_INFINITE, True);
if Err = WAIT_IO_COMPLETION then
begin
SetLength(ASocket.FSendStream, 0);
if Assigned(ASocket.FServer.FWrite) then
ASocket.FServer.FWrite(ASocket.FServer, ASocket);
end
else
ASocket.FServer.Error(WSAGetLastError);
finally
WSACloseEvent(ASocket.FEvent);
ASocket.DelState(gsWriting);
end;
finally
// Отправка уведомления о завершении потока
PostMessage(ASocket.FServer.FHandle, SOCKET_NOTIFY_MSG,
GetCurrentThread, FD_CLOSETHREAD);
end;
end;
begin
if Length(FSendStream) = 0 then
begin
AddState(gsReadyWrite);
Exit;
end;
AddState(gsWriting);
WriteThread := CreateThread(nil, 0, @SocketWrite, Self, 0, ID);
if WriteThread = 0 then
FServer.Error(GetLastError);
Sleep(10);
end;
Ошибка на выделенном WSASend.
Что подскажут мастера?
← →
Digitman © (2005-12-23 08:25) [1]Хм..
А где ты такое описание ошибки выискал ?
Вот цитата из описания отказа WSAEINVAL (10022) для WSASend из MSDN:
The socket has not been bound with bind or the socket is not created with the overlapped flag.
...
← →
Rouse_ © (2005-12-23 10:31) [2]Оппа...
Протупил...
Не туда глядел. Чичас буду разбираться :) Сенькс.
Страницы: 1 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.012 c