套接字发送recv函数

ckv*_*ckv 4 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);
Run Code Online (Sandbox Code Playgroud)

现在我做

m_Socket++;//change to some other number ideally expecting send recv to fail.
Run Code Online (Sandbox Code Playgroud)

即使现在,send recv套接字函数也会成功,而不会抛出SOCKET_ERROR.我希望它必须抛出错误.

难道我做错了什么.

ava*_*kar 13

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

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

  • 这是一个很好的答案.我不知道这个场景. (2认同)