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软件中,它没有列出我的应用程序的任何连接。我对套接字的评论: