gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:44:49 27 4
gpt4 key购买 nike

我目前正在处理一项网络作业。我们希望客户端自动获得分配给 TCP 套接字的 IP 和端口,并将 UDP 套接字绑定(bind)到与 TCP 套接字相同的地址和端口。这样,UDP 和 TCP 共享相同的 IP 和端口。

我在这里检查了几个问题,所有问题似乎都说明源端口取决于您在绑定(bind)套接字时指定的地址,但是,这似乎不起作用。

这是我客户端上的代码,我在其中绑定(bind)了 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

Error 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 向服务器发送数据包,服务器上报告的端口与程序报告的端口相同,但此端口是自动分配的,而不是选择的。

最佳答案

我找到了解决问题的方法。当我试图检查 bind() 的返回值时,我一直收到错误提示。事实证明,无论出于何种原因,我都在 std 命名空间中,而没有在我自己的代码中的任何地方明确说明这一点。将 bind() 更改为 ::bind() 后,我能够捕获返回值并且 bind() 完成了我预期的操作。

关于c++ - sendto() 从错误的源端口发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609031/

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