Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修复';无法分配请求的地址?';_C++_Sockets_Udp_Ip_Bind - Fatal编程技术网

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
中添加了接口,并在设置中添加了另一个网络适配器,这似乎使侦听器能够毫无怨言地绑定。我想我需要进一步了解本地接口的工作原理。如果您将您的评论移动到回答部分,我将接受。非常感谢。