C++ 如何修复';无法分配请求的地址?';
C++ 如何修复';无法分配请求的地址?';,c++,sockets,udp,ip,bind,C++,Sockets,Udp,Ip,Bind,netstat-a-n确认没有使用IP地址和端口。当我使用gdb并中断调用bind的方法时,我看到使用的是正确的IP地址和端口以及合理的套接字地址长度16。这是用于UDP侦听器的。远程IP是静态的,从配置文件读取 这是代码 void CSocket::Bind(IpEndPoint& endPoint) { int bindResult = bind( socketHandle, endPoint.GetSockAddrPtr(), endPoint.GetAd
netstat-a-n确认没有使用IP地址和端口。
当我使用gdb并中断调用bind的方法时,我看到使用的是正确的IP地址和端口以及合理的套接字地址长度16。这是用于UDP侦听器的。远程IP是静态的,从配置文件读取
这是代码
void CSocket::Bind(IpEndPoint& endPoint)
{
int bindResult = bind( socketHandle, endPoint.GetSockAddrPtr(),
endPoint.GetAddrLength());
if(bindResult < 0)
{
TRACE_ERROR("Failed to bind to socket. %s. IpAddress %s Port %d AddrLength %d",
strerror(errno), endPoint.GetIpAddressString(),
ntohs(endPoint.GetPort()), endPoint.GetAddrLength());
void CSocket::Bind(IpEndPoint和endPoint)
{
int bindResult=bind(socketHandle,endPoint.GetSockAddrPtr(),
endPoint.GetAddrLength());
if(bindResult<0)
{
跟踪错误(“绑定到套接字失败。%s.IpAddress%s端口%d地址长度%d”,
strerror(errno),endPoint.GetIpAddressString(),
ntohs(endPoint.GetPort()),endPoint.GetAddrLength();
这是gdb的
断点1,CSocket::Bind(this=0x819fa24,ipAddress=“192.0.2.77”,
端口=4185)在插座处。cpp:126
这是上面代码中的TRACE_错误
错误:无法绑定到套接字。错误号99(无法分配请求的地址)。
IP地址192.0.2.77端口4185地址长度16
我一直在重新阅读,但没有找到任何线索。这是UDP,因此不需要绑定连接。防火墙已关闭。我还应该查看其他位置吗?下面是@Aconcagua所说的内容:您要绑定本地地址(而不是“未使用”的地址)。您不能只创建本地地址。您可以使用
INADDR\u ANY
绑定到任何地址,或者需要绑定分配给本地接口之一的地址。这可能是问题所在。(bind
设置本地地址,connect
设置远程地址——或者,对于UDP,您可以使用sendto
指定每个数据包的远程地址)–Gil Hamilton我将了解ip地址作为字符串如何转换为所需的struct sockaddr
对象。您要绑定到的地址真的是本地地址吗?如果是远程主机,请使用connect。端口是否已在使用中?(…)只是一个提示:我个人更喜欢错误代码而不是错误字符串-而且我可能不是唯一一个…使用例如%d(%s)”、errno、strerror(errno)可能是个好主意
以满足这两个分数。@Aconcagua谢谢。按照您的建议添加了错误代码。如果UDP是无连接的,为什么UDP需要连接?
遵循@Aconcagua的说法:您想绑定一个本地地址(而不是“未使用”的地址)。您不能只创建本地地址。您可以使用INADDR\u ANY
绑定到任何地址,或者需要绑定分配给本地接口之一的地址。这可能是问题所在。(bind
设置本地地址,connect
设置远程地址——或者,对于UDP,您可以使用sendto
指定每个数据包的远程地址)@Gil Hamilton在/etc/network/interfaces
中添加了接口,并在设置中添加了另一个网络适配器,这似乎使侦听器能够毫无怨言地绑定。我想我需要进一步了解本地接口的工作原理。如果您将您的评论移动到回答部分,我将接受。非常感谢。