iocp模型 tcp协议(不考虑udp等其他)
第一个问题:
发送端 单线程 顺序 连续调用2次WSASend的情况下
第一次发送的WSABUF 长度6 内容是ABCDEF
第二次发送的WSABUF 长度6 内容是123456
在GetQueuedCompletionStatus返回的时候
会不会出现:
ABCDEF 这个buf返回的lpNumberOfBytesTransferred不是6,小于6
就是例如是3,意味着只发了前3个字节ABC出去了,后面的DEF需要本人手动再WSASend一次
而123456已经全部发送成功了
最终导致接收端实际收到是字节序是ABC123456DEF ?
还是说 GetQueuedCompletionStatus返回的时候
能保证WSABUF一定是发完了才返回的?
GetQueuedCompletionStatus的第二个参数lpNumberOfBytesTransferred在发送的情况下一定是等于WSABUF中的len的?
假如不保证WSABUF一定是发完了才返回
是不是意味着发送端对于同一个socket,
每次GetQueuedCompletionStatus都必须检查lpNumberOfBytesTransferred,
假如没发完,需要再次WSASend
这样就导致 无法连续多次调WSASend,必须返回一个检查一个,成功才能WSASend下一个?
假如本人需要连续WSASend来提高发送效率,这个问题又应该怎么样设计来解决
(ps,以上本人说的返回都是指GetQueuedCompletionStatus的返回,不是WSASend函数自身的返回)
第二个问题:
WSASend第二个参数是允许提交一个buf数组的,
假如说WSASend不保证提交的数据在GetQueuedCompletionStatus返回的时候是一次性发完的,
那是不是意味着buf数组的每一个buf,都需要检查能否一次性发完
假如中间有一个buf只发送了一半,那接收端的数据就错乱了?
那允许提交一个buf数组这又还有什么意义呢?
第三个问题:
关于具体socket底层的实现的
socket自身有一个buf缓冲,windows下默认了8k(也有人说4k),总之这个是可以通过SO_SNDBUF设置的这么一个值
本人想问的是WSASend提交的WSABUF是直接memcpy到这个8k缓冲区的么?
除了这个8k缓冲区,socket还有没有其他的WSABUF相关的队列么?
WSASend的buf是先进这个WSABUF队列,iocp底层本人从WSABUF队列复制内容到8k缓冲区,复制完的就会触发GetQueuedCompletionStatus返回?(原因是iocp有提到就是说The successful completion of a WSASend does not indicate that the data was successfully delivered.所以本人有这么个猜想)
另外WSASend有时会返回一个10055就是WSAENOBUFS的错误(An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.)这里提到了一个queue,所以也导致本人有这样的猜想,能否存在这个WSABUF队列?完了这个队里有多长?具体底层什么情况下会满?最大值是多少?能否能设置?
iocp模型 tcp协议(不考虑udp等其他)
第一个问题:
发送端 单线程 顺序 连续调用2次WSASend的情况下
第一次发送的WSABUF 长度6 内容是ABCDEF
第二次发送的WSABUF 长度6 内容是123456
在GetQueuedCompletionStatus返回的时候
会不会出现:
ABCDEF 这个buf返回的lpNumberOfBytesTransferred不是6,小于6
就是例如是3,意味着只发了前3个字节ABC出去了,后面的DEF需要本人手动再WSASend一次
而123456已经全部发送成功了
最终导致接收端实际收到是字节序是ABC123456DEF ?
还是说 GetQueuedCompletionStatus返回的时候
能保证WSABUF一定是发完了才返回的?
GetQueuedCompletionStatus的第二个参数lpNumberOfBytesTransferred在发送的情况下一定是等于WSABUF中的len的?
假如不保证WSABUF一定是发完了才返回
是不是意味着发送端对于同一个socket,
每次GetQueuedCompletionStatus都必须检查lpNumberOfBytesTransferred,
假如没发完,需要再次WSASend
这样就导致 无法连续多次调WSASend,必须返回一个检查一个,成功才能WSASend下一个?
假如本人需要连续WSASend来提高发送效率,这个问题又应该怎么样设计来解决
(ps,以上本人说的返回都是指GetQueuedCompletionStatus的返回,不是WSASend函数自身的返回)
第二个问题:
WSASend第二个参数是允许提交一个buf数组的,
假如说WSASend不保证提交的数据在GetQueuedCompletionStatus返回的时候是一次性发完的,
那是不是意味着buf数组的每一个buf,都需要检查能否一次性发完
假如中间有一个buf只发送了一半,那接收端的数据就错乱了?
那允许提交一个buf数组这又还有什么意义呢?
第三个问题:
关于具体socket底层的实现的
socket自身有一个buf缓冲,windows下默认了8k(也有人说4k),总之这个是可以通过SO_SNDBUF设置的这么一个值
本人想问的是WSASend提交的WSABUF是直接memcpy到这个8k缓冲区的么?
除了这个8k缓冲区,socket还有没有其他的WSABUF相关的队列么?
WSASend的buf是先进这个WSABUF队列,iocp底层本人从WSABUF队列复制内容到8k缓冲区,复制完的就会触发GetQueuedCompletionStatus返回?(原因是iocp有提到就是说The successful completion of a WSASend does not indicate that the data was successfully delivered.所以本人有这么个猜想)
另外WSASend有时会返回一个10055就是WSAENOBUFS的错误(An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.)这里提到了一个queue,所以也导致本人有这样的猜想,能否存在这个WSABUF队列?完了这个队里有多长?具体底层什么情况下会满?最大值是多少?能否能设置?