【问题标题】:Address family not supported by protocol UDP - C协议 UDP 不支持的地址系列 - C
【发布时间】:2016-05-10 08:57:47
【问题描述】:

我正在尝试创建一个 UDP 交互客户端/服务器。 我在尝试使用此代码发送消息时遇到一些问题。 在执行期间我遇到了这个错误:

sendto 函数后的“协议不支持的地址族”。 提前致谢!

int prepare_udp_socket(char *pong_addr, char *pong_port)
{
    struct addrinfo gai_hints, *pong_addrinfo = NULL;
    int ping_socket;
    int gai_rv;
    int np;

            /*** Specify the UDP sockets' options ***/
            memset(&gai_hints, 0, sizeof gai_hints);
            gai_hints.ai_family=AF_INET;
            gai_hints.ai_socktype=SOCK_DGRAM;
            gai_hints.ai_flags=0;
            gai_hints.ai_protocol = IPPROTO_UDP;

            if ((ping_socket = socket(gai_hints.ai_family, gai_hints.ai_socktype, gai_hints.ai_protocol)) == -1)
                fail_errno("UDP Ping could not get socket");
            /*** change socket behavior to NONBLOCKING ***/
            if(fcntl(ping_socket,F_SETFL, O_NONBLOCK)==-1)
                fail_errno("set NONBLOCKING socket fail");

            //call getaddrinfo() in order to get Pong Server address in binary form 
            gai_rv=getaddrinfo(pong_addr, pong_port, &gai_hints, &pong_addrinfo);

            if(gai_rv!=0){
                printf("Getaddrinfo failed\n");
                exit(1);
            }   
            /*** connect the ping_socket UDP socket with the server ***/    
        if(connect(ping_socket, pong_addrinfo->ai_addr, pong_addrinfo->ai_addrlen)!=0){
              fail_errno("Can't connect");
            }     
            freeaddrinfo(pong_addrinfo);
            return ping_socket;
        }

    double do_ping(int msg_size, int msg_no, char message[msg_size], int ping_socket, double timeout)
    {
        int lost_count = 0;
        char answer_buffer[msg_size];
        ssize_t recv_bytes, sent_bytes;
        int offset;
        struct sockaddr_storage pong_addr;
        size_t pong_addr_len = sizeof(struct sockaddr_storage);
        struct timespec send_time, recv_time;
        double roundtrip_time_ms;
        int re_try = 0;
        /*** write msg_no at the beginning of the message buffer ***/
    if(sprintf(message,"%d\n",msg_no)<0){
            fail("sprintf(...) failed");
        }
        do {
            debug(" ... sending message %d\n", msg_no);
        /*** Store the current time in send_time ***/
        if(clock_gettime(CLOCK_MONOTONIC,&send_time)!=0){
          fail_errno("clock_gettime failed with sendTime");
        }
        /*** Send the message through the socket ***/
        **if((sent_bytes = sendto(ping_socket, &message, msg_size,0,(struct sockaddr*)&pong_addr,pong_addr_len)) == -1){
            fail_errno("Cannot send bytes throught the socket");**
        }

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    问题出在您的do_ping 函数中,sendto 期望地址和长度作为其第 5 和第 6 个参数,它们是输入参数,这意味着您需要指定要发送的目标主机的地址数据包到,您必须将地址初始化为有效的地址。你所做的实际上就像'recvfrom`。

    另外,message 是指向函数内部 char 的指针,所以不要在 sendto 中使用 &amp;message,只需传递 message

    struct sockaddr_storage pong_addr;
    // pong_addr is not initialized here, initialize pong_addr to a valid address, like the one you got from `getaddrinfo` call
    size_t pong_addr_len = sizeof(struct sockaddr_storage);
    
    // then call sendto to send to the address
    if((sent_bytes = sendto(ping_socket, message, msg_size, 0, (struct sockaddr*)&pong_addr, pong_addr_len)) == -1){
        fail_errno("Cannot send bytes throught the socket");**
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 2018-11-01
      • 2017-03-29
      • 2018-09-19
      • 1970-01-01
      • 2012-03-21
      • 2013-12-20
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多