我使用以下代码行创建了一个套接字。 现在我改变套接字的值,我得到这样的
m_Socket ++;
即使现在,send recv套接字函数也能成功,而不会抛出SOCKET_ERROR。 我希望它必须抛出错误。
我做错了什么。
struct sockaddr_in ServerSock; //用于绑定端口号以侦听
的套接字地址结构char *localIP ;
SOCKET SocServer;
//To Set up the sockaddr structure
ServerSock.sin_family = AF_INET;
ServerSock.sin_addr.s_addr = INADDR_ANY;
ServerSock.sin_port = htons(pLantronics->m_wRIPortNo);
// To Create a socket for listening on wPortNumber
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;
}
// Structure to get the IP Address of the connecting Entity
sockaddr_in insock;
int insocklen=sizeof(insock);
//To accept the Incoming connection on the wPortNumber
pLantronics->m_Socket=accept(SocServer,(struct sockaddr*)&insock,&insocklen);
if(pLantronics->m_Socket == INVALID_SOCKET)
{
shutdown(SocServer, 2 );
closesocket(SocServer );
return FALSE;
}
// To make socket non-blocking
DWORD dwNonBlocking = 1;
if(ioctlsocket( pLantronics->m_Socket, FIONBIO, &dwNonBlocking ))
{
shutdown(pLantronics->m_Socket, 2);
closesocket(pLantronics->m_Socket);
return FALSE;
}
pLantronics->m_sModemName = inet_ntoa(insock.sin_addr);
现在我做
m_Socket++;//change to some other number ideally expecting send recv to fail.
即使现在,send recv套接字函数也能成功,而不会抛出SOCKET_ERROR。 我希望它必须抛出错误。
我做错了什么。
答案 0 :(得分:13)
这是因为Windows句柄的特殊性质 - 创建时它们可以被4整除,使用时它们的两个最低位被忽略。将句柄递增1将使m_Socket
引用与之前相同的套接字(仅当您增加4时,函数才会返回错误 - 除非有另一个句柄打开该值)。
您不应该以这种方式探测打开的句柄。虽然还有其他方法可以枚举打开的句柄,但您不应该使用它们。不要依赖系统来跟踪你的手柄 - 自己跟踪它们。