【发布时间】:2011-08-09 21:33:42
【问题描述】:
我遇到了 sendto 的问题。
我有一个接收者使用 recvfrom 接收 UPD 数据包,然后使用 sendto 回复发送者。
不幸的是,我收到 errno 11(资源暂时不可用)。我正在使用两个套接字。
第一个数据包实际上是发送的,但不是后面的:
发送到 :: 成功
错误: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");
在 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);
}
这个问题会不会是因为端口仍然很热,我需要等待才能重用它?我尝试更改端口,但没有帮助。
更新:如果 sleep(1) 被注释掉,那么数据包实际上会被发送!
非常感谢您的帮助。
【问题讨论】:
-
您是否使用两个具有相同端口的套接字?如果有,原因是什么?
-
也许
SO_REUSEADDR会有所帮助。或者你可以只保持端口打开而不是打开和关闭它,或者如果可行的话,每次都使用一个新的随机分配的端口号。 -
我添加了更多代码。我有 2 个套接字,但只有一个绑定到一个端口(在特定端口上接收数据),另一个可以从任何端口发送数据。
-
R:我只是尝试使用 SO_REUSEADDR,但没有帮助。假设端口是什么意思?我不认为它正在关闭,因为我没有调用 close()?
-
我意识到使用 sleep() 可以解决问题,但如果没有它,我不确定如何解决问题。