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

标签 c sockets udp vxworks bsd

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

如果我采取以下步骤,事情就会很好:

  1. 创建套接字
  2. 设置套接字选项
  3. 发送数据包
  4. 关闭套接字

但是,我不想每次调用该函数时都会产生不断创建套接字的开销。

有处理这个问题的首选方法吗?我只想创建一次套接字,然后继续重复使用它。我尝试通过引入“first_time”标志来做到这一点 - 但当我采用这种方法时,sendto() 函数开始失败,并出现 errno 0x23

由于我在 VxWorks 中工作 - 我不清楚这个错误代码是 ENOTSUP (VxWorks 错误代码)还是 EWOULDBLOCK (sendto 错误代码)。不管怎样,我不是解决问题的人。

请参阅下面的代码。

<小时/>
/* 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);
}

最佳答案

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

关于c - 如何正确重用套接字来发送UDP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28491089/

相关文章:

c - Linux管道(): Reading from a pipe doesn't always unblock writers

java - 缓冲区读取器意外行为

javax.mail.MessagingException : Could not convert socket to TLS

DNS 服务器拒绝连接

C# 如何确保所需的 UDP 数据到达客户端/服务器?

c - C中结构中的二维数组

c - Google 自定义搜索结果 C 语言

c - 函数调用后指针未指向正确的数组元素

java - 关闭ServerSocket的正确方法

java - UDP 数据包内容在传输时发生变化