如何确定套接字是否已关闭

时间:2012-10-16 23:23:45

标签: c winapi sockets

我有一个简单的客户端服务器程序,但主要问题是,一旦在客户端和服务器之间建立连接,如果客户端关闭程序,服务器会重复执行最后一条消息,这有时会产生很大的问题。所以我想要的是,如果有任何函数可以调用以获取SOCKET结构的状态,那么如果客户端关闭程序,服务器将知道停止。我只需要从函数查找错误套接字的函数。顺便说一下,我在Win32 c中编写这个程序。我试过if(mySocket == SOCKET_ERROR)似乎不起作用......除非我用错了。我刚刚开始联网。

if(!sockServer.RecvData( recMessage, STRLEN )){return 0;}
// where
bool Socket::RecvData( char *buffer, int size )
{
    int i = recv( mySocket, buffer, size, 0 );
    if(!i){return false;}
    buffer[i] = '\0';
    return true;
}  //this isn't working

2 个答案:

答案 0 :(得分:2)

如果对等方关闭套接字,read()recv()将返回零。如果“服务器反复执行最后一条消息”,你必须忽略它,这当然会“造成巨大的问题”,而不仅仅是“有时”,而总是

编辑1:您还在进行另一个基本的TCP编程错误:您假设您在一次读取中收到整个消息。 TCP中没有消息,它只是一个字节流,写入和读取之间没有1:1的对应关系(send()recv())。 recv()可以返回零或少至1个字节。您必须组织自己的消息边界,并且必须循环,直到收到可以处理的完整消息。

编辑2:您也忽略了接收方法中的所有错误。您必须查找recv()返回-1`,而不是继续处理您尝试读取的数据的逻辑。至少你应该调用perror()或检查errno或Winsock等价物。

当您收到错误或EOS时,您必须停止循环,关闭套接字,忘记连接,忘记此客户端。

答案 1 :(得分:1)

如何在主消息进程中侦听FD_CLOSE?你正在使用带有FD_CLOSE的WSAAsyncSelect吗?