2012-08-09 68 views
0

我使用winsock作爲一個客戶端與約10線程。Winsock recv在不同的線程

每個線程都有自己獨特的連接到相同的主機和端口。 所有線程都已連接,它們都需要同時讀取一定數量的字節 。我發現我一次只能使用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; 

回答

2

服務器能夠同時寫入10個客戶端嗎?一次recv函數是否意味着每個客戶端都按順序接收數據,或者只有一個客戶端可以工作,而另一個客戶端則失敗?

您可以嘗試創建一個chargen server進行測試。在不同的端口上運行10個副本(因此無需測試/考慮chargen服務器中的線程),並將客戶端連接到每個端口。

+0

我使用indy 9.我稍後會用源代碼更新我的帖子。 – 2012-08-09 22:46:49

+0

我的不好。現在它工作正常。印地有問題。 – 2012-08-10 23:27:33