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

我有一个简单的客户端服务器程序,但主要问题是,一旦在客户端和服务器之间建立连接,如果客户端关闭程序,服务器会重复执行最后一条消息,这有时会产生巨大的问题。 所以我想要的是,如果有任何函数可以调用以获取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 

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

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

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

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

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