套接字的有效性

时间:2010-06-15 14:56:03

标签: c++ windows sockets 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; 
    }

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

5 个答案:

答案 0 :(得分:6)

将套接字传递给任何一个Windows套接字函数(例如getsockopt()),如果套接字无效,它将返回SOCKET_ERROR,而WSAGetLastError()将返回WSAENOTSOCK }。

请务必注意INVALID_SOCKET不等于0(实际值,您不应该具体使用((SOCKET)(~0))

答案 1 :(得分:3)

当任何一方(预期或意外)断开连接时,套接字可能变为“无效”,但由于网络干扰而无法突然显示(除非它断开连接,请在上面阅读)。

您可以通过检查send()recv()的返回值为-1(SOCKET_ERROR)来检测到这一点

答案 2 :(得分:1)

套接字不会失效。但是在你听()之后你必须接受()一个连接。这种联系可能会在某些时候丢失。它可以通过写入套接字失败或recv()返回错误来检测。然后你回收回来听()。

答案 3 :(得分:1)

首先,假设INVALID_SOCKET(您未显示)实际上定义为0,这是不正确的。与其他系统调用一样,socket在失败时返回-1(0是可以返回的有效fd)。

然后,当您接受连接后,您的send / writerecv / read来电将返回-1。如果您正在尝试编写,errno将设置为EPIPE以指示套接字已关闭(由您的客户端)。没有办法只询问套接字是否已关闭。

答案 4 :(得分:0)

套接字(父)将一直有效,直到文件指针未被释放。(只有在你调用close时才会发生)虽然你不能使用它,因为它没有连接到任何客户端。