我目前正致力于网络任务。我们希望客户端自动为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 %d\n", ntohs(udpAddress.sin_port));
printf("Error when binding: %d\n", WSAGetLastError());
char buffer[32];
sprintf(buffer, "TEST\n");
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:%d\n", from_address >> 24, from_address >> 16 & 0xff, from_address >> 8 & 0xff, from_address & 0xff, from_port);
}
我真的很想知道为什么这个端口无效。有谁知道我做错了什么?
另外值得一提的是,似乎每次重新启动应用程序时,端口都会递增,所以我甚至不确定这是否是我自己的错。如果我使用程序PacketSender将数据包发送到服务器,则服务器上报告的端口与程序报告的端口相同,但此端口是自动分配的,而不是选择的。
答案 0 :(得分:1)
我找到了解决问题的方法。当我尝试检查bind()
的返回值时,我不断收到错误提示。事实证明,无论出于何种原因,我都在std
命名空间中,而没有在我自己的代码中明确说明这一点。将bind()
更改为::bind()
后,我能够捕获返回值,并bind()
执行了我的预期。