我有一个简单的 winsock 客户端/服务器应用程序。大多数情况下一切正常,但有时即使客户端应用程序终止,recv 也不会返回值。
引用 MSDN:
如果没有发生错误,recv 返回接收到的字节数,buf 参数指向的缓冲区将包含接收到的数据。如果连接已正常关闭,则返回值为零。否则,返回 SOCKET_ERROR 的值,并且可以通过调用 WSAGetLastError 检索特定的错误代码。
在没有与客户端连接的情况下,recv 永远不会返回并永远挂起的原因可能是什么?
相关服务器代码:
const
BUFSIZE = 512;
var
Sock: TSocket;
I : Integer;
Buf : AnsiString;
begin
repeat
SetLength(Buf, BUFSIZE);
//blocking call
I := recv(Sock, Pointer(Buf)^, BUFSIZE, 0);
if I > 0 then
begin
SetLength(Buf, I);
//do s.th. with Buf
end;
until I <= 0; //Connection closed or error
//Sometimes never here
Synchronize(procedure
begin
FOnConnectionClosed(Self, Sock, WSAGetLastError);
end);
end.