0

約10スレッドのクライアントとしてwinsockを使用しています。

各スレッドには、同じホストとポートへの独自の接続があります。すべてのスレッドが接続されており、すべてのスレッドが同時に特定のバイト数を読み取る必要があります。一度に 1 つの recv 関数しか使用できないようですが、なぜですか?

function RecvThread ( p : pointer ) : Integer; stdcall;
var
 Sock   : TSocket;
 Addr   : TSockAddrIn;
 res    : Integer;
begin
 Addr.sin_family      := AF_INET;
 Addr.sin_port        := htons(8080);
 Sock                 := Socket(AF_INET, SOCK_STREAM, 0);
 Addr.sin_addr.S_addr := INET_ADDR (pchar('localhost'));
 if (Connect(Sock, Addr, SizeOf(Addr)) = 0) then begin
 while true do begin
  res := recv (sock, buff, 99999, 0); // just example
  if (res < 0) or (res = INVALID_SOCKET) then break;
 end;
 // Free Stuff, Disconnect, etc...
end;
4

1 に答える 1

2

サーバーは 10 個のクライアントに同時に書き込むことができますか? 一度に 1 つの recv 関数は、各クライアントが順番にデータを受信することを意味しますか、それとも 1 つのクライアントだけがまったく機能し、他の 9 つは失敗することを意味しますか?

テストするChargen サーバーを作成してみてください。その 10 個のコピーを異なるポートで実行し (そのため、chargen サーバーのスレッドをテスト/検討する必要はありません)、クライアントをそれぞれ 1 つのポートに接続します。

于 2012-08-09T21:13:03.720 に答える