【问题标题】:C++ bind UDP Socket Address Family not suppoerted不支持 C++ 绑定 UDP 套接字地址系列
【发布时间】:2016-12-22 23:52:34
【问题描述】:

在 PowerPC 架构上运行 Linux 系统,该架构通过以太网连接到另一个设备,获得 UDP 连接(基于包), 我尝试设置一个套接字并将其绑定到我的端口8813。但是每当我输入一个不同于0 的端口时,绑定就会失败。

代码如下:

int connector::initUDPSocket(){
    struct hostent *server;
    //Construct Socket
    struct sockaddr_in {
        __uint8_t sin_len;
        sa_family_t sin_family;
        in_port_t sin_port;
        struct in_addr sin_addr;
        char sin_zero[8];
    }
    ;
    sockaddr_in socketaddress;
    socklen_t addrlen = sizeof(struct sockaddr_in); /* length of addresses */


    udpsocket=socket(AF_INET,SOCK_DGRAM ,0);

    if(udpsocket<=0)
    {
        printf("No Socket opened!");
        return 1;
    }
    else
    {
        printf("ONE Socket opened!");

        memset((char *) &socketaddress,0, sizeof(socketaddress));


        socketaddress.sin_family = AF_INET;
        socketaddress.sin_addr.s_addr=htonl(inet_addr("192.168.0.10"));//<=That's the external devices address;// htonl(inet_addr("192.168.0.1"));//<=That's my devices address;//htonl(INADDR_ANY);//INADDR_ANY;//
        socketaddress.sin_port = htons(8813);//8813;//htonl(8813);//htons(0); //<=Only the last one works


        int bind_result=bind(udpsocket,(struct sockaddr *)&socketaddress,sizeof(socketaddress));
        if( bind_result == SOCKET_ERROR)
        {

            printf(LFL_CRI,"BIND failed! Error: %s",strerror(errno)); //Returns "BIND failed! Error: Address family not supported by protocol"
        }
        else
        {
            printf(LFL_CRI,"BIND worked!");
                //Nun den Listener für den DatenStream aufsetzen.
                char      SockAddrBuffer[sizeof(struct sockaddr_storage)];
                socklen_t SockAddrBufferSize = sizeof(SockAddrBuffer);
                int numofbytes=recvfrom(udpsocket, udp_buffer, UDP_BUFFERSIZE, 0, (struct sockaddr *)SockAddrBuffer, &SockAddrBufferSize);
                if (numofbytes >0)
                {
                    printf("%i bytes received",numofbytes);
                }
            }

        }
        return 0;
    }
}

到目前为止我发现了什么:

  • Ping 192.168.0.10 是可能的

  • 数据似乎没有被防火墙阻止; iptables -nvL 提到没有丢包。我为此添加了一条新规则,在应用此规则之前,连接外部设备时,包裹的数量或丢弃的包裹数量会增加。

  • 在我的 Windows PC 上使用测试工具(只需调试,如果端口上有传入流量;将外部设备连接到它),我收到数据;所以,外部设备肯定会发送数据

  • 绑定到端口0 有效; netstat -au 提到了在程序运行时侦听端口 2 的工具

  • 错误信息:BIND failed! Error: Address family not supported by protocol

所以,这里有两个问题:

  1. 我做错了什么?

  2. 我对“绑定”有什么误解。听“系统分配给我的程序的一些随机端口”有什么意义?我的意思是,如果我设置了一个 http-Server,我想监听端口 80 而不是端口“RANDOM”。这有什么用?

【问题讨论】:

  • 为什么要重新定义sockaddr_in?包括&lt;netinet/in.h&gt; 以获得适合您的工具链的工具。如果它被排除在工具链之外,可能是有充分理由的。
  • 在某些地方您使用printf 而不是fprintfudpsocket 未声明,我猜它应该是整数。你能创建MCVE吗?

标签: c++ linux sockets udp bind


【解决方案1】:

您在代码中重新定义了struct sockaddr_in。如果与系统定义的方式有任何不同,任何尝试使用此结构的代码都将无法正常工作。

您需要#include &lt;netinet/in.h&gt; 才能获得此结构的正确定义。

【讨论】:

  • 谢谢,这正是问题所在:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-12
  • 2013-11-21
  • 2014-05-27
  • 2019-02-01
  • 2016-09-22
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多