[英]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.