2009-03-31 6 views
5

私はUDPデータを取得するために、LinuxでCに次の典型的なコードを持っている:上記のすべてのコードの作品Cで送信者のUDPポートを取得するにはどうすればよいですか?

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
mysock.sin_family = AF_INET; 
mysock.sin_addr.s_addr = INADDR_ANY; 
mysock.sin_port = my_port; 
bind(sock, &mysock, sizeof(mysock); 
recvfrom(sock, buf, PKTSZ, 0, &client, len); 

が、今私は、送信者のUDPポートを見つける必要性を持って、構造やシステムがあります私はudpパケットを受信したときに私はそのような情報を取得するために使用することができますか?

おかげ

答えて

6

のrecvfrom()は5番目の引数(sockaddr構造体の*)であなたにそれを返すことになっています。

EDIT: 使用この

struct sockaddr_in client; 

recvfrom(... (struct sockaddr*)&client ...); 

client.sin_portのようなものは、送信者のポートである必要があります。

+0

私は前にその引数を見ていますが、struct sockaddrはsa_dataの中に埋め込まれていない限り、送信者のudpポート情報を持っていません。 –

1

UDP送信者ポートは一時的です。私はあなたがそれを報告以外の目的に使うことはできないと思います。

+0

私は自分自身を明確にしないかもしれません、私はすぐにデータを送り返すことができるように、送信者のudpポートを知る必要があるので、一時的であることは大丈夫です。 –

+0

リッスンudpソケットにのみデータを戻すことができます。送信元ソケットもリスニングソケットである可能性は低いです。この動作が必要な場合は、両側にudpソケットをlistenする必要があります。 – Indy9000

11

recvfrom(sock、buf、PKTSZ、0、&クライアント、len);

送信者のソケットアドレスは、コードの変数クライアントに格納されています。送信者のポートにアクセスするには、の代わりにのsockaddr_inを使用してください。例:

sockaddr_in client; 
int len = sizeof(client); 
recvfrom(sock, buf, PKTSZ, 0, (struct sockaddr *)&client, (socklen_t *)&len); 
int port = ntohs(client.sin_port); 

参照: Beej's Guide to Network ProgrammingMSDN

+0

reinterpret_castはここに属しません。 OPはキャストが訂正されるまで、C(not C++) – sigjuice

+0

も同義語 - ダウンボートを求めました – Alnitak

0

5番目の引数がstruct sockaddr_inにキャストすることができ、sin_portがリモートポート番号があります。

0

クライアントをsockaddr_inにキャストすると、私の問題が解決され、すばやく対応してくれてありがとうと思っています。

+2

正しい答えを選んで少し寄付:) – dwc

関連する問題