-3

だから私は現在、ピアツーピアのインスタントメッセンジャーであるC++プログラムを書いています。そのため、プログラムが起動すると、指定されたポートで着信接続をリッスンしますが、ユーザーがIPアドレスを入力して別のホストへの接続を開始できるようにします。現在、ソケットconnect()関数AFAIKはsend()関数とほとんど同じように機能しますが、サーバーがaccept()で応答するか、サーバーが接続を拒否するまで、SYNパケットを送信します。したがって、主な質問は.......ソケットを作成してからlisten()関数を呼び出すと、同じポートで接続関数を呼び出すとエラーが発生しますか?もしそうなら、SYNパケットを作成してからsend()を呼び出す方法はありますか指定されたホストに送信する機能?このプログラムを実行しているホストはクライアントとサーバーの両方として機能するため、このプログラムはクライアントサーバーモデルからの逸脱です。

4

2 に答える 2

2

ソケットは、またはのいずれlistenconnectです。両方を行うことはできません。

各ホストをクライアントとサーバーの両方にしたい場合は、それぞれに 2 つのソケットが必要です。

connect(2)少なくとも MacOS X では、 man ページで何をしようとしているのかについての特定のエラー メッセージがあります。

[EOPNOTSUPP] ソケットがリッスンしているため、接続は許可されません。

于 2013-03-11T18:10:24.313 に答える
2

現在、ソケット connect() 関数 AFAIK は send() 関数とほとんど同じように機能しますが、サーバーが accept() で応答するまで、またはサーバーが接続を拒否した場合は SYN パケットを送信します。

それは最初から正しくありません。connect()は問題なく SYN を送信しますが、ACK 応答はピア TCP スタックから送信されます。これは、サーバー アプリケーションがaccept(). これは、リッスン バックログ キューが原因です。

だからあなたの動機はすでに疑わしいです。

ソケットを作成してから listen() 関数を呼び出した場合、同じポートで connect 関数を呼び出すとエラーが発生しますか?

はい。そんなことはできません。あなたはこの質問に動機を与えていませんが、そうする必要さえありません。インバウンド接続を listen しているアウトバウンド接続に同じローカル・ポートを使用する必要はありません。

SYN パケットを作成し、send() 関数を呼び出して指定されたホストに送信する方法はありますか?

生の IP ソケットを作成する方法がわかれば、手動で SYN を送信できますが、TCP/IP にそれを TCP 接続の一部として認識させることはできません。繰り返しますが、これはあなたの問題とは何の関係もありません。

私はあなたが実際に問題を抱えているとさえ確信していません。必要なのは、リッスン ソケット、受け入れられたソケット、およびアウトバウンド接続用のソケットだけで、すべて通常の方法で作成されます。トリックは必要ありません。

于 2013-03-12T05:00:25.313 に答える