Jar*_*ary 5 c sockets udp sendto
我遇到了sendto的问题.
我有一个接收器接收带有recvfrom的UPD数据包,然后使用sendto回复发送者.
不幸的是,我得到了错误11(资源暂时不可用).我正在使用两个插座.
第一个数据包实际上是发送但后来没有发送:
sendto ::成功
错误:0.
sendto ::资源暂时不可用
错误:11.
sendto ::资源暂时不可用
...
这是我的代码的摘录:
int sockfd, sockSend;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
perror("socket");
if ((sockSend = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
perror("socket");
if (fcntl(sockfd, F_SETOWN, getpid()) < 0) {
perror("fcntl");
}
if (fcntl(sockfd, F_SETFL, O_RDONLY | O_NONBLOCK | FASYNC) < 0) {
perror("fcntl");
}
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
< 0)
perror("bind");
Run Code Online (Sandbox Code Playgroud)
在SIGIO处理程序中:
len = sizeof(recv_addr);
char buffer[payload];
bzero(buffer, payload);
n = recvfrom(sockfd, buffer, payload, MSG_DONTWAIT, (struct sockaddr *)&recv_addr, &len);
while (n > 0) {
sprintf(response, "%d\n%d\n%d\n", items, target_buf, pb_sp);
sendto(sockSend, response, strlen(response), 0, (struct sockaddr *) &recv_addr, sizeof(recv_addr));
// sleep(1);
perror("sendto :");
printf("error: %d.\n", errno);
}
Run Code Online (Sandbox Code Playgroud)
这个问题可能是因为端口仍然很热,我需要等待才重新使用它吗?我试图改变端口,但它没有帮助.
更新:如果睡眠(1)被注释掉,那么数据包实际上会被发送!
非常感谢你的帮助.
ike*_*ami 10
你得到的错误:
EAGAIN或EWOULDBLOCK:套接字标记为非阻塞,请求的操作将被阻止.POSIX.1-2001允许在这种情况下返回错误,并且不要求这些常量具有相同的值,因此便携式应用程序应检查这两种可能性.
您将套接字设置为非阻塞(O_NONBLOCK).套接字仍在忙于发送上一条消息.在第一次完成发送之前,您无法发送另一个.这就是睡眠有帮助的原因.
不要将其设置为非阻塞,或者在说完之后再试一次select.
| 归档时间: |
|
| 查看次数: |
50084 次 |
| 最近记录: |