套接字的有效性

ckv*_*ckv 2 c++ sockets windows winsock

我使用以下代码行创建了一个套接字,我得到一个有效的套接字,并在客户端和服务器机器之间建立连接.由于网络干扰或任何其他原因,套接字是否可能无效.

如果是这样,我们如何检查套接字是否有效.

    SOCKET SocServer; 

    //To Set up the sockaddr structure 
    ServerSock.sin_family = AF_INET; 
    ServerSock.sin_addr.s_addr = INADDR_ANY     
    ServerSock.sin_port = htons(PortNumber);//port number of 5005 

    // To Create a socket for listening on PortNumber 
    if(( SocServer = socket( AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET ) 
    { 
        return FALSE; 
    } 

    //To bind the socket with wPortNumber 
    if(bind(SocServer,(sockaddr*)&ServerSock,sizeof(ServerSock))!=0) 
    { 
        return FALSE; 
    } 

    // To Listen for the connection on wPortNumber 
    if(listen(SocServer,SOMAXCONN)!=0) 
    { 
        return FALSE; 
    }
Run Code Online (Sandbox Code Playgroud)

我知道我可以检查INVALID_SOCKET,换句话说就是套接字是0.还有其他出路,因为我的SocServer将有一个值2500,我想检查这个套接字是否有效.

Has*_*kun 6

将您的套接字传递给任何一个Windows套接字函数(例如getsockopt()),如果套接字无效,它将在返回SOCKET_ERRORWSAGetLastError()返回WSAENOTSOCK.

重要的是要注意INVALID_SOCKET不相等0(实际值,你不应该具体使用((SOCKET)(~0))

  • 别忘了`accept()`也会返回INVALID_SOCKET (2认同)