sendto()从错误的源端口发送

sendto() sends from the wrong source port

本文关键字:错误 sendto      更新时间:2023-10-16

我目前正在执行一项网络任务。我们希望客户端自动为TCP套接字分配一个IP和端口,并将UDP套接字绑定到与TCP套接字相同的地址和端口。这样,UDP和TCP共享相同的IP和端口

我在这里检查了几个问题,所有这些问题似乎都表明源端口取决于绑定套接字时指定的地址,然而,这似乎不起作用。

这是我的客户端上的代码,我在其中绑定UDP套接字:

sockaddr_in udpAddress;
udpAddress.sin_family = AF_INET;
udpAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
udpAddress.sin_port = htons(27015);
bind(udpSocket, (sockaddr*)&udpAddress, sizeof(udpAddress));
printf("[UDP] Bound to port %dn", ntohs(udpAddress.sin_port));
printf("Error when binding: %dn", WSAGetLastError());
char buffer[32];
sprintf(buffer, "TESTn");
sendto(udpSocket, buffer, 7, 0, (sockaddr*)&serverAddress, sizeof(serverAddress));

运行应用程序时,会打印以下内容:

[UDP] Bound to port 27015
Error when binding: 0

错误0意味着没有错误,所以这应该没问题。

然而,当我在服务器控制台上检查时,我看到以下打印:

[UDP] 127.0.0.1:64910

由以下代码生成:

#if PLATFORM == PLATFORM_WINDOWS 
typedef int socklen_t;
#endif
sockaddr_in from;
socklen_t fromLength = sizeof(from);
short messageSize = recvfrom(udpSocket, (char*)udpBuffer, udpBufferSize, 0, (sockaddr*)&from, &fromLength);
if (messageSize > 0) 
{
unsigned int from_address = ntohl(from.sin_addr.s_addr);
unsigned int from_port = ntohs(from.sin_port);
printf("[UDP] %d.%d.%d.%d:%dn", from_address >> 24, from_address >> 16 & 0xff, from_address >> 8 & 0xff, from_address & 0xff, from_port);
}

我真想知道为什么这个端口无效。有人知道我做错了什么吗?

同样值得一提的是,似乎每次重新启动应用程序时,端口都会增加,所以我甚至不确定这是否是我自己的错。如果我使用PacketSender程序向服务器发送数据包,则服务器上报告的端口与该程序报告的端口相同,但该端口是自动分配的,而不是选择的。

我已经找到了问题的解决方案。当我尝试检查bind()的返回值时,不断收到一个错误提示。事实证明,无论出于何种原因,我都在std命名空间中,而没有在自己的代码中明确说明这一点。在将bind()更改为::bind()之后,我能够捕获返回值,并且bind()实现了我所期望的。