さて、私は知りたいと思っています-TCPを介してサーバーに接続するプログラムがあり、サーバーがプログラムにメッセージを送信しますが、同時にUDPパケットを送信している場合、TCPパケットは私に届きますか? すべてが1つのクラスにあります!
ご協力いただきありがとうございます!
簡単な答え - はい。 一度に多くの接続をすべて送受信できます。複数のソケットがあると仮定します。
サーバーが処理しなければならないクライアントの数や、送受信されるデータで何をしているのかについては言及していません。実装によっては、複数のスレッドも必要になる場合があります (Dariusz Wawer が指摘するように、これは必須ではありませんが、より多くのクライアントを処理できるスケーラブルなソリューションではスレッドを使用する可能性が高いため、言及します)。
詳細については、TCP および UDP ポートに関するこの記事を参照してください: TCP および UDP ポートの説明
優れた C# チュートリアルのサンプルがここにあります: C# チュートリアル - シンプル スレッド TCP サーバー
「同時に」が何を意味するかによって異なります。通常、答えは「はい」です。複数の TCP/IP 接続と複数の UDP ソケットをすべて同時に送受信できます。
数マイクロ秒で問題が発生する可能性があるレイテンシについて本当に心配している場合を除きます。その場合、一方の接続が他方に干渉する可能性があります。
あなたの質問は、実際には、すべてのネットワーク アプリケーション プログラマが知って考慮しなければならないいくつかの問題の境界にあります。
まず第一に、ネットワークから受信したすべてのデータは、オペレーティング システムの内部バッファに格納され、そこで読み取られるのを待ちます。バッファーは無限ではないため、十分に長く待機すると、一部のデータがドロップされる可能性があります。通常、そこに書き込まれるデータのチャンクは単一のパケットですが、常にではありません。TCP/IP 通信での読み取りに使用できるデータの量を予測することはできません。一方、UDP では、常に単一のパケットを読み取る必要があります。そうしないと、データが失われます。recvfrom
UDP パケットの読み取りに使用できます。使用することをお勧めします。
次に、ブロッキングとノンブロッキングのアプローチを使用することは、ネットワーク アプリにとって最も重要な決定事項の 1 つです。それに関する多くの情報がインターネットにあります: C- Unix Sockets - Non-blocking read、 blocking read と non-blocking readの定義は何ですか? またはノンブロッキング チュートリアル。
スレッドに関して:スレッドは、複数の接続ハンドラ アプリケーションを記述する必要はありません。コードを簡素化する場合もあれば、実行速度を向上させる場合もあります。個別のスレッドで個別の接続を処理するなど、スレッドを使用するためのよく知られたプログラミング パターンがいくつかあります。多くの場合、特に経験の浅いプログラマーにとって、スレッドの使用は奇妙なエラーや頭痛の種になるだけです。
私の投稿があなたの質問に答え、別の回答の下で私が行ってきた議論に対処することを願っています.