sendto()从错误的源端口发送
sendto() sends from the wrong source port
我目前正在执行一项网络任务。我们希望客户端自动为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()
实现了我所期望的。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- C++ sendto() 给出"invalid conversion from ‘int (*)(int, int, int)throw ()’ to ‘int’"错误
- sendto()从错误的源端口发送
- C++套接字编程:sendto()和recvfrom()错误代码10038和in 'server'绑定失败,10038
- Win32 c++ sendto()返回错误8:WSA_NOT_ENOUGH_MEMORY
- sendto错误:无效参数
- socket()和sendto()在没有互联网连接时不会返回错误代码