我有一个函数,每次我想发送 UDP 数据包时都会调用该函数。
如果我采取以下步骤,事情就会很好:
- 创建套接字
- 设置套接字选项
- 发送数据包
- 关闭套接字
但是,我不想每次调用该函数时都会产生不断创建套接字的开销。
有处理这个问题的首选方法吗?我只想创建一次套接字,然后继续重复使用它。我尝试通过引入“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/