2016-06-14 10 views
1

ポートXでリッスンしているサーバーがクライアントから要求を受信した後、別のプロセスからの応答とsendto呼び出しによるソケットを送信できます。また、クライアントはsendto(サーバーアドレス)呼び出しで要求を送信することに注意してください。ここでサーバーは別のプロセスとソケットから応答を送信できますか?

は手順は次のとおりです。

  1. サーバーは、ソケットを開き、IPアドレス(ABCD)とポートにバインドします(x)の
  2. クライアントがソケットを開き、IPアドレス(KLMN)にそれを結合し、 port(z)を呼び出し、sendtoコールでサーバに要求を送信します。
  3. サーバー(別のプロセスで)ソケットを開き、IPアドレス(ABCD)とポート(Y)にバインドし
  4. サーバは、クライアントとサーバの両方が知っている

のsendtoとクライアントへのソケットの上から応答を送信しますお互いのIPアドレスとポート番号。

サーバーが別のプロセスから応答を送信したときに、そのクライアントが応答を受け取っていないことに気づいています。そうでなければ、そうする。

+0

... –

+0

は、「私は、サーバーが別のプロセスからの応答を送信するときにクライアントが応答を受信しないことに気付いています」。あなたのコードのバグのために、そうした理由はありませんか?あなたが記述したものは、正しくコーディングされていれば可能です。しかし、コードを表示していないので、私たちはさらにあなたを助けることはできません。 – kaylum

+0

あなたのソケットが 'TCP'指向の場合、子プロセスを生成することができ、受け入れられた接続のファイル記述子は継承されます。次に 'send()'と 'recv()'を使います。しかし、それはUDPソケットを使用しているようです。 'UDP'ソケットでは、ソケットを作成してバインドするだけです。 'listen()'ポートはありません。次に 'sendto()'と 'recvfrom()'を使います。あなたのケースでは、クライアントから送信されたメッセージを 'recvfrom() 'するために、すでにソケットの作成とバインディングを継承した子を生成する必要があります。 'sendto()'はdestaddrを無視します。 – alvits

答えて

1

これは実行できますが、いくつかの大きな警告があります。

  1. クライアントがソケットをバインドし、ソケットをするとsend()recv()を使用して」connect()のではなく、sendto()recvfrom()を使用する必要があります。これにより、recvfrom()が読み込んでいるIP /ポートに向かう限り、どこからでも着信パケットを受信できます。

  2. クライアントとサーバーの間のパスにファイアウォールまたはNATがある場合、送信IP /ポートが、クライアントが元々その要求を送信したIP /ポートと一致しないため、応答をブロックする可能性があります。私はあなたが失われていると思います

+0

ソケットは、まだバインドされていない場合、 'sendto()'によって自動バインドされます。 – EJP

+0

iptablesの助けを借りてsnat)、サーバーがクライアントに応答を送信すると、クライアントがメッセージを送信するときに受信された宛先ポートにポートが変更されました。依然としてクライアントはメッセージを受信しません。しかし、サーバーが受信した同じソケットから応答を送信すると、クライアントはそれを受け取ります。 – Kumar

関連する問題