每次我想发送UDP数据包时都会调用一个函数。
如果我采取以下措施,事情会很有效:
但是,每次调用函数时,我都不想承担不断创建套接字的开销。
有没有一种首选的方法来处理这个问题?我只想创建一次套接字,然后继续重复使用它。我通过引入" 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);
}
答案 0 :(得分:0)
您使用的是原始套接字,而不是您所说的UDP。创建套接字时尝试使用SOCK_DGRAM标志。