sendto に問題があります。
recvfrom で UPD パケットを受信し、sendto を使用して送信者に返信する受信者がいます。
残念ながら、errno 11 (リソースが一時的に利用できません) が表示されます。ソケットを2つ使用しています。
最初のパケットは実際に送信されますが、その後のパケットは送信されません:
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");
そして、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) がコメントアウトされている場合、パケットは実際に送信されます!
どうもありがとうございました。