[英]Is flag MSG_ERRQUEUE make socket having a non-blocking behavior on linux?
我在 C 中编写了一个程序,用于发送 icmp echo 请求,然后接收 icmp echo 回复。 我试图在我的 recvmsg() function 调用上添加标志 MSG_ERRQUEUE,但它产生的行为好像我使用的套接字是非阻塞的。
我已经验证并且我没有在程序的任何地方将套接字设置为非阻塞,并且我没有设置发送和/或接收超时(SO_RCVTIMEO/SO_SNDTIMEO)。
这是我的代码:
获取地址信息
void get_addr()
{
struct addrinfo hints;
int ret;
bzero(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_RAW;
hints.ai_protocol = IPPROTO_ICMP;
if ((ret = getaddrinfo(env.args.hostname, NULL, &hints, &(env.addr))) != 0)
error_exit("getaddrinfo");
}
套接字设置
void set_socket()
{
int on;
int ttl;
if ((env.sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
error_exit("socket creation");
env.ttl = 64;
if ((setsockopt(env.sockfd, 0, IP_TTL, &(env), sizeof(env))) < 0)
error_exit("socket TTL setup");
on = 1;
if ((setsockopt(env.sockfd, 0, IP_RECVERR, &(on), sizeof(on))) < 0)
error_exit("socket RECVERR setup");
on = 1;
if ((setsockopt(env.sockfd, 0, IP_RECVTTL, &(on), sizeof(on))) < 0)
error_exit("socket RECVTTL setup");
}
发送到()/recvmsg()
int main()
{
int retsend;
int retrecv;
while (1)
{
if ((retsend = sendto(env.sockfd, &(env.icmp_req), sizeof(env.icmp_req), 0, (env.addr->ai_addr), env.addr->ai_addrlen)) < 0)
perror("Error sendto: ");
if ((recvmsg(env.sockfd, &(env.r_data.msg), MSG_WAITALL | MSG_ERRQUEUE)) < 0)
perror("Error recvmsg: ");
retrieve_info();
}
}
在 function retrieve_info()中,我使用struct sock_extended_err *
来存储有关错误的信息,如果cmsg->cmsg_type == IP_RECVERR
使用 recvmsg() 调用中的这两个标志,我在每次调用时都会遇到 EAGAIN 错误!
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.