UDP経由でクエリを受信し、UDP経由で応答を送信するサーバーを作成しようとしています。私が走っている問題は、私が自分のレスポンスを送ろうとすると、「101 Network is unreachable」というエラーが出るということです。ソケットUDP:Sendto()のRecvfrom()からの送信者情報を使用できない
hereという質問に基づいて、hints.ai_flags = AI_PASSIVE;
行を取り出して解決しようとしましたが、サーバーは決して正常にメッセージを取得しませんでした。私はaddrinfo
のマニュアルページを見て、AI_PASSIVE
フラグが設定されている場合は、ソケットはrecvfrom()
しかできませんが、設定されていない場合はソケットはsendto()
となります。私は一人のソケットから両方をやっている人々と一緒にオンラインの例を見てきました。私は何が欠けていますか?
関連するコード:
struct addrinfo hints;
struct addrinfo *serverinfo;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
int status = getaddrinfo(NULL, port, &hints, &serverinfo);
int sock = socket(serverinfo->ai_family, serverinfo->ai_socktype, serverinfo->ai_protocol);
status = bind(sock, serverinfo->ai_addr, serverinfo->ai_addrlen);
freeaddrinfo(serverinfo);
// poll until there's an incoming packet
struct sockaddr sender;
socklen_t sendsize = sizeof(sender);
bzero(&sender, sizeof(sender));
recvfrom(sock, message, sizeof(message), 0, &sender, &sendsize);
// message processing
sendto(sock, response, sizeof(response), 0, (struct sockaddr *)&sender, sendsize);
はい、私は(それは私が問題を発見した方法です)、すべてのこれらの呼び出しのエラーチェックを持っています。簡潔さのためにここには省略されています。
'はgetaddrinfo(3)'ページには、 'hints.ai_protocol'を、'初期化を示してhints.ai_canonname'、 'hints.ai_addr'、と' hints.ad_next'呼び出す前に 'はgetaddrinfo(3) '。それらは重要かもしれません、それらを初期化してみてください。 (与えられた構造体全体をゼロにすることができます;これが単なるコメントです...) – sarnold
どちらの方法でも同じエラーが発生しますか?意味A-> B-> A(エラー取得)とB-> A-> B(エラーが発生しますか?) – noMAD