2012-04-19 8 views
2

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); 

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

+0

'はgetaddrinfo(3)'ページには、 'hints.ai_protocol'を、'初期化を示してhints.ai_canonname'、 'hints.ai_addr'、と' hints.ad_next'呼び出す前に 'はgetaddrinfo(3) '。それらは重要かもしれません、それらを初期化してみてください。 (与えられた構造体全体をゼロにすることができます;これが単なるコメントです...) – sarnold

+0

どちらの方法でも同じエラーが発生しますか?意味A-> B-> A(エラー取得)とB-> A-> B(エラーが発生しますか?) – noMAD

答えて

7

struct sockaddrを使用して、発信元アドレスをrecvfromコールに格納しないでください。IPソケットアドレスを表すことができない場合があります。

IPv4アドレスにはstruct sockaddr_inを、IPv6アドレスにはstruct sockaddr_in6を使用することをお勧めします。どちらかに対処するには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); 
関連する問題