我使用以下代码行创建了一个套接字,并获得了一个有效的套接字,并在客户端和服务器之间建立了连接。由于网络干扰或任何其他原因,套接字是否可能无效。
如果是,我们如何检查套接字是否有效。
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,我想检查这个套接字是否有效。
答案 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
/ write
或recv
/ read
来电将返回-1。如果您正在尝试编写,errno
将设置为EPIPE
以指示套接字已关闭(由您的客户端)。没有办法只询问套接字是否已关闭。
答案 4 :(得分:0)
套接字(父)将一直有效,直到文件指针未被释放。(只有在你调用close时才会发生)虽然你不能使用它,因为它没有连接到任何客户端。