2015-06-04 152 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