Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 套接字的有效性_C++_Windows_Sockets_Winsock - Fatal编程技术网

C++ 套接字的有效性

C++ 套接字的有效性,c++,windows,sockets,winsock,C++,Windows,Sockets,Winsock,我已经使用下面几行代码创建了一个套接字,我得到了一个有效的套接字,并且在客户机和服务器机器之间建立了连接。是否存在由于网络干扰或任何其他原因导致插座失效的可能性 如果是,我们如何检查套接字是否有效 SOCKET SocServer; //To Set up the sockaddr structure ServerSock.sin_family = AF_INET; ServerSock.sin_addr.s_addr = INADDR_ANY

我已经使用下面几行代码创建了一个套接字,我得到了一个有效的套接字,并且在客户机和服务器机器之间建立了连接。是否存在由于网络干扰或任何其他原因导致插座失效的可能性

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

    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; 
    }

我知道我可以检查无效的_套接字,也就是说,该套接字为0。因为我的SocServer将有一个值,比如2500,我想检查这个套接字是否有效。

套接字不会失效。但是在你监听()之后,你必须接受()一个连接。该连接可能在某个点丢失。写入套接字失败或返回错误的recv()可能会检测到该错误。然后,您只需循环使用listen()。

当任意一方(预期或意外)断开连接时,套接字可能会变得“无效”,但不会因为网络干扰而突然失效(除非断开连接,请参见上文)


您可以首先检查-1(套接字错误)

send()
recv()
的返回值来检测这一点,假设无效的套接字(您没有显示)实际定义为0,这是不正确的<代码>套接字与其他系统调用一样,在失败时返回-1(0是可以返回的有效fd)


然后,一旦您接受连接,您的
发送
/
写入
接收
/
读取
呼叫将返回-1。如果您正在尝试写入,
errno
将设置为
EPIPE
,以指示套接字已关闭(由您的客户端关闭)。无法直接询问套接字是否已关闭。

将套接字传递给任何一个windows套接字函数(例如,
getsockopt()
),如果套接字无效,它将返回
socket\u错误
,而
WSAGetLastError()
将返回
WSAENOTSOCK


重要的是要注意,
无效的\u套接字
不等于
0
(实际值,您不应该特别使用它是
((套接字)(~0))

好的,这是不正确的,套接字将保持有效(尽管不一定可用),直到其最后一个句柄关闭(在这一点上,句柄是无效的,尽管套接字可能存在)。这就是为什么我写了“\”而不是“无效”,因为我不认为套接字真的是无效的-它只能连接或不连接,后者可以通过检查返回值来检测!谢谢,0和((套接字)(~0))
((SOCKET)(~0))
是(字面上)
而不是0
,即假定
0xFFFFFFFF
SOCKET是32位类型。在任何情况下,您都应该只检查
SOCKET()
WSASocket()的返回值
根据此值。我确实调用accept并与客户端建立连接。但是,通过某种方式,连接似乎断开,因为在TCPView软件中,它没有列出我的应用程序的任何连接。我对套接字的评论: