套接字发送recv函数

时间:2010-06-16 09:43:14

标签: c++ sockets

我使用以下代码行创建了一个套接字。 现在我改变套接字的值,我得到这样的

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。 我希望它必须抛出错误。

我做错了什么。

1 个答案:

答案 0 :(得分:13)

这是因为Windows句柄的特殊性质 - 创建时它们可以被4整除,使用时它们的两个最低位被忽略。将句柄递增1将使m_Socket引用与之前相同的套接字(仅当您增加4时,函数才会返回错误 - 除非有另一个句柄打开该值)。

您不应该以这种方式探测打开的句柄。虽然还有其他方法可以枚举打开的句柄,但您不应该使用它们。不要依赖系统来跟踪你的手柄 - 自己跟踪它们。