如何正确重用套接字发送UDP数据包?

时间:2015-02-13 01:28:32

标签: c sockets udp vxworks bsd

每次我想发送UDP数据包时都会调用一个函数。

如果我采取以下措施,事情会很有效:

  1. 创建套接字
  2. 设置套接字选项
  3. 发送信息包
  4. 关闭套接字
  5. 但是,每次调用函数时,我都不想承担不断创建套接字的开销。

    有没有一种首选的方法来处理这个问题?我只想创建一次套接字,然后继续重复使用它。我通过引入" first_time"尝试这样做。 flag - 但是当我采用这种方法时,sendto()函数开始失败,错误为 0x23

    由于我在VxWorks工作 - 我不清楚这个错误代码是ENOTSUP(VxWorks错误代码)还是EWOULDBLOCK(发送错误代码)。无论哪种方式,我都不是解决方案。

    请参阅下面的代码。


    /* Global Scope */
    int send_socket = 0;
    int first_time = 1;
    
    void myFunction(...)
    {
      if (first_time == 1)
      {
        first_time = 0;
        send_socket = socket(PF_INET , SOCK_RAW , IPPROTO_UDP);
        if(send_socket < 0)
            perror("socket() error");
    
        /* Inform the kernel do not fill up the packet structure. */
        /* We will build our own... */      
        if(setsockopt(send_socket, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0)
          perror("setsockopt() error");
      }
    
      //  ... populate buffer ...
    
      if(sendto(send_socket, 
                *buffer, 
                my_ip_header->total_length, 
                0, 
                (struct sockaddr *)&sin, 
                sizeof(sin)) < 0)
      {
        perror("sendto error");
      }
    
      // Normally I'd close the socket right here...
      // But I don't want to do this, because I want to use it later!
      // close(send_socket);
    }
    

1 个答案:

答案 0 :(得分:0)

您使用的是原始套接字,而不是您所说的UDP。创建套接字时尝试使用SOCK_DGRAM标志。