5

UDP 経由でクエリを受信し、UDP 経由で応答を送信するサーバーを作成しようとしています。私が直面している問題は、応答を送信しようとすると、「101 ネットワークに到達できません」というエラーが表示されることです。

ここの質問に基づいて、行を取り出してこれを解決しようとしましたhints.ai_flags = AI_PASSIVE;が、サーバーはメッセージを正常に取得しません。のマニュアルページを見たところ、フラグが設定されている場合、ソケットは のみ、設定されていない場合、ソケットは のみのaddrinfoように聞こえます。ただし、単一のソケットから両方を実行している人々の例をオンラインでたくさん見ました。私は何が欠けていますか?AI_PASSIVErecvfrom()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);

はい、これらすべての呼び出しに対してエラー チェックを行っています (これが問題の発見方法です)。簡潔にするために、ここでは省略しています。

4

1 に答える 1

9

struct sockaddr呼び出しで送信元アドレスを格納するためにa を使用しないでくださいrecvfrom。IP ソケット アドレスを表すことができない可能性があります。

struct sockaddr_inIPv4 アドレスには astruct sockaddr_in6を、IPv6 アドレスにはa を使用することになっていstruct sockaddr_storageます。

struct sockaddr_storage sender;
socklen_t sendsize = sizeof(sender);
bzero(&sender, sizeof(sender));

recvfrom(sock, message, sizeof(message), 0, (struct sockaddr*)&sender, &sendsize);
于 2012-04-19T22:31:34.500 に答える