iocp中连续调用WSASend可以发送的最大字节数?
瀚海一漂 2015-07-02 12:33:29 在做iocp的实验,server端开一个Accept线程,接受客户端连接。本机cpu八核,开了一个work线程。测试客户端同时开1000个线程连接到server端。
server程序主要测试WSASend函数,在客户端连接上来之后,直接使用WSASend调用100次,向客户端发送数据(只是server端发送,client其实并不接收),
在客户端连入后,已经关闭了SO_SENDBUF发送缓冲区,基本上每一个WSASend都返回了SOCKET_ERROR,检测WSAGetLastError得到的是WSA_IO_PENDING,
实验结果是,连续使用WSASend是跟连续发送所有发送的字节数总大小有关系:
比如连续使用n次WSASend函数,而每次发送的WSABUF当中的buf大小指定为m字节。在本机测试n次WSASend都返回SOCKET_ERROR,错误原因是WSA_IO_PENDING,
但是只有之前的k(k<=n)次WSASend的所发送的总字节数(k*m字节)<=18608(逐步试验出来的),之前的都发送成功,且在work线程当中,GetQueuedCompletionStatus能够返回成功,
后续的WSASend全部在iocp上没有通知,GetQueuedCompletionStatus阻塞。继续等待客户端主动退出的时候,后续没有通知的(n-k)个WSASend返回socket错误。
基本上感觉莫名其妙,根据msdn上面的,进行很大size的WSASend,因为关闭了缓冲区,WSASend当中的缓冲区被锁定到非分页内存,连续WSASend可能导致缓冲区用尽
很多童鞋会返回WSA_NOBUF错误,进行很多次数后,根本不返回WSA_NOBUF。
对于连续WSASend是否有最大限制这种情况呢,未找到相关资料。
是否有大神碰到过呢,求指导。