Socket send recv 函数

4
我使用以下代码创建了一个套接字。现在我像这样更改套接字的值:
m_Socket++;
即使如此,发送和接收套接字函数仍然成功,没有抛出SOCKET_ERROR。我希望它必须抛出错误。
我做错了什么吗?
结构体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错误。

我认为它必须抛出错误。

我是否做错了什么。


为什么要在 socket 值上 ++?这完全是没有意义的。这个问题的目的是什么? - INS
你在哪个平台上?在Visual Studio 2008中调用m_Socket ++,然后对m_Socket进行任何操作都会导致错误。还有,就像lulian说的那样-为什么? - jilles de wit
1个回答

13

这是由于Windows句柄的特殊性质 - 创建时可被四整除,使用时忽略最低的两个比特位。将句柄增加一会使m_Socket引用相同的套接字(仅当您增加四个时,函数才会返回错误--除非另一个具有该值的句柄处于打开状态)。

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


好知道,我不知道那个。但是还是有一个问题:你为什么要增加一个“socket value”呢? - INS
@Iulian Şerbănoiu,你不会这样做的。 - avakar
2
这是一个很好的答案。我之前不知道这种情况。 - ckv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接