UDP 経由でクエリを受信し、UDP 経由で応答を送信するサーバーを作成しようとしています。私が直面している問題は、応答を送信しようとすると、「101 ネットワークに到達できません」というエラーが表示されることです。
ここの質問に基づいて、行を取り出してこれを解決しようとしました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);
はい、これらすべての呼び出しに対してエラー チェックを行っています (これが問題の発見方法です)。簡潔にするために、ここでは省略しています。