0

私は、C++のUDPソケットを介してメッセージを送信するために送信元ポートと宛先ポートが指定されているこのプロジェクトに取り組んでいます。プロジェクトのTCP部分は正常に機能していますが、これを設定するときに送信元ポートと宛先ポートの両方を指定する方法がわかりません。

私がそれを行う方法を知る方法は、「受信者」がrecvfrom()呼び出しを設定し、「送信者」がsendto()コマンドでも使用するポートを使用することです...しかし、それは同じである必要がありますポート。

したがって、「送信者」のポートyと通信するために「受信者」のポートxが必要な場合、どうすればよいでしょうか。

ありがとう

4

3 に答える 3

1

bind送信側で呼び出すときに送信元ポートを定義できます。例えば:

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) { /*error*/}

sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(source_port);  // here

int res = bind(sockfd,(struct sockaddr*)&sin, sizeof(sin));
if (res < 0) { /*error*/}

そして、宛先ポートは にsockaddr渡されるパラメータに入りますsendto

于 2012-11-21T14:15:30.800 に答える
0

これが 1 対 1 のマッピングである場合、つまり、1 つのソースが 1 つの宛先と通信する場合、単純bind(2)にローカル ポートとリモート IP およびポート ( UDP ソケットを接続できるconnect(2)というよくある誤解に反して) と通信します。両側で(もちろん適切なリモートおよびローカルIP /ポートを使用して)これを行うと、明示的なアドレス指定なしで使用できるようになります。recv(2)send(2)

一方が他方が最初のパケットを送信するのを待つ必要がある場合は、 で受信した送信元アドレス/ポートを抽出し、次にそれに送信しrecvfrom(2)ますconnect(2)

一方、一方がマルチクライアントサーバーとして機能する場合は、クライアントで同じbind(2)/ダンスを行いますが、ローカルポートに対してconnect(2)のみ行い、サーバーで/を使用します。bind(2)recvfrom(2)sendto(2)

于 2012-11-21T14:47:15.353 に答える
-1

同時二重通信が必要な場合は、ソケットをブロッキング モードで使用する必要がありfcntl(...O_NONBLOCK...)ますselect()。これを行う方法の良い例を次に示します http://www.lowtek.com/sockets/select.html

于 2012-11-20T03:04:27.963 に答える