0

非同期 I/O は初めてです。Unix SOCK_STREAM ソケットから大量のデータを読み取る必要があります。ノンブロッキング ソケットを使用しています。複数の read/recv() が必要になる場合があります。その部分は私には問題ありません。

私の疑問は-一度に3〜4台のクライアントがサーバーソケットに巨大なデータを書き込んでいる場合、それぞれが100Kのデータを書き込んでいると言います。最初の読み取りで client1 から一部のデータ (たとえば 40 K) を読み取り、2 回目の読み取りでクライアント 2 からデータを読み取り、3 回目の読み取りで client1 から残りのデータを再び読み取るというシナリオになる可能性がありますか?

よろしくDJ

4

1 に答える 1

1

あなたの質問に対する答えは、client1をclientNにどのように定義するかによって大きく異なります。具体的には、サーバーへの接続をどのように形成しますか。

SOCK_STREAMはコネクション型です。これは、サーバーがリスニングソケットを作成し、それにバインドしてから、クライアントが接続すると、サーバーが接続を受け入れ、本質的に新しいソケットを取得することを意味します。

ここで、client1からclientNがそれぞれ個別の接続を行う場合、サーバーには基本的にN個の異なるソケットがあります。この場合、質問に対する答えはノーです。異なるクライアントからのデータは、異なるソケットで送信されるため、混合されません。

ただし、接続を開く父クライアントがあり、そのソケットがclients1からnによって共有されているような配置がある場合(たとえば、異なるスレッドまたは子プロセスで)、答えは「はい」です-特定のソケットへの書き込みアトミックではなく、データが混在する可能性があります。

ちなみに、UNIXドメインソケットではなくUnixパイプを使用すると、同じパイプに異なるライターが存在する場合でも、特定のしきい値(POSIXによると少なくとも512、実際にはLinux)で書き込みがアトミックであるという利点があります。 65000バイトをサポート)

于 2011-05-30T10:35:38.377 に答える