2015-06-04 159 views
4

我想用WSARecv的精度。WSARecv()和多個緩衝區

基本上,你似乎可以使用該函數與WSABUF數組。

1-在重疊的I/O上下文WITHOUT完成端口,說我在數據報套接字使用的WSARecv()爲48個WSABUFs陣列,它意味着可以接收48個不同的UDP數據包(1包爲每個緩衝區)在一次通話中(說他們到達相同的時刻)? 或者是接收48個數據包的唯一方式是在發出事件(使用與事件重疊的I/O但不重複完成端口)後48次使用WSARecv()。

2-在上下文WITH I/O完成端口/重疊的I/O,不是意味着我可以替換此

int n = 48; 
for (int i = 0; i < n; i++) 
    WSARecv(sock, &buffer_array[i], 1, NULL, 0, &overlapped, completion_routine); 

有了這個?

WSARecv(sock, buffer_array, 48, NULL, 0, &overlapped, completion_routine); 

基本上,這意味着調用帶有48個緩衝區的WSARecv()會發布48個讀取請求嗎?

3-如果沒有,WSABUF的數組的目的是什麼?我的意思是,只有一個正確的尺寸就足夠了嗎?

非常感謝!

+1

'WSABUF數組的目的是什麼?'微軟提供的一些解釋:https://msdn.microsoft.com/en-us/library/windows/desktop/ms740138%28v=vs.85%29。 aspx Scatter/Gather I/O –

+0

是的,我之前讀過那個頁面,但是由於我在網絡編程方面的新東西,我不太清楚什麼是分散/聚集I/O – Yannick

回答

5

One WSARecv() ==一個數據報。如果您事先知道這些事情有多大,您可以使用多個緩衝區將該數據報分成報頭,正文,預告片等。它不會讓您一次收到48個數據報。

+0

我明白了,所以這基本上是將分組分成邏輯在可能的情況下,一次部件接受答案 – Yannick