gpt4 book ai didi

c++ - 套接字发送接收函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:40 26 4
gpt4 key购买 nike

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

m_Socket++;

即使现在 send recv socket 函数也能成功,不会抛出 SOCKET_ERROR。我预计它一定会抛出错误。

我是不是做错了什么。

struct sockaddr_in ServerSock;//套接字地址结构绑定(bind)要监听的端口号

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 函数也能成功,不会抛出 SOCKET_ERROR。我预计它一定会抛出错误。

我是不是做错了什么。

最佳答案

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

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

关于c++ - 套接字发送接收函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3052158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com