IOCP有关问题,请高人或自认为是高手的大侠指点!诚信.
IOCP问题,请高人或自认为是高手的大侠指点!诚信在线等......
前言:问题有点钻牛角,为了方便起见,具体数字使用的都过小,大侠不要在这里找问题
问题叙述:
客户端:send的缓冲区大小为10字符,假设发送数据为0123456789,IP数据包大小为3字符,则10字符数据需要分4个包发送:012 345 678 9
服务器应用程序缓冲区假设为2字符,问题如下
问题1、客户端的第一个数据包012能否一次发送全部3个字符的数据?
分析:个人认为,网络可以一次传输3字符数据,2个字符01被输入到应用缓冲区中,第三个字符2在TCP协议栈里保存着,这种看法正确吗?
问题2:在IOCP中,如果GetQueuedCompletionStatus返回了,说明内核收到数据了,按照TCP/IP协议,服务器收到网络数据,要给对方(客户端)发送ACK,那么这个ACK是何时给用户端发出的呢?很明显,内核不能在收到数据后,马上发送ACK,否则,用户端的下一个数据包345可能马上就到,如果工作线程繁忙,会出现2个线程同时收到一个用户的数据情况(线程A收到012,线程B收到345),由于线程切换的随机性,用户数据可能乱序(345写在012前面),而且这种情况没法处理,按我的理解,一定是 GetQueuedCompletionStatus处理完数据后,投递下一个wsarecv后,内核才给用户端发送ACK消息,但是测试发现不是这样的,2个工作线程(A和B),如果在工作线程中不投递wsarecv,数据012和345都能由A和B线程分别收到的!只是后面的数据收不到了,IOCP通知对方(用户端)发送下一个数据包的?
问题3:如果服务器缓冲区容量小于一个网络数据包,一次收到的数据有部分数据在TCP协议栈里保存,比如012包里的字符2,GetQueuedCompletionStatus为什么不返回? 如果返回了会发生多个工作线程同时收到一个用户数据的情况,所以他他一定不返回,但是根据IOCP原理,收到网络数据后,GetQueuedCompletionStatus一定返回!!!
------解决方案--------------------
我不是高手,也不是自认为的高手,建议楼主把标题换一下!
谁愿意当自认为的高手??
前言:问题有点钻牛角,为了方便起见,具体数字使用的都过小,大侠不要在这里找问题
问题叙述:
客户端:send的缓冲区大小为10字符,假设发送数据为0123456789,IP数据包大小为3字符,则10字符数据需要分4个包发送:012 345 678 9
服务器应用程序缓冲区假设为2字符,问题如下
问题1、客户端的第一个数据包012能否一次发送全部3个字符的数据?
分析:个人认为,网络可以一次传输3字符数据,2个字符01被输入到应用缓冲区中,第三个字符2在TCP协议栈里保存着,这种看法正确吗?
问题2:在IOCP中,如果GetQueuedCompletionStatus返回了,说明内核收到数据了,按照TCP/IP协议,服务器收到网络数据,要给对方(客户端)发送ACK,那么这个ACK是何时给用户端发出的呢?很明显,内核不能在收到数据后,马上发送ACK,否则,用户端的下一个数据包345可能马上就到,如果工作线程繁忙,会出现2个线程同时收到一个用户的数据情况(线程A收到012,线程B收到345),由于线程切换的随机性,用户数据可能乱序(345写在012前面),而且这种情况没法处理,按我的理解,一定是 GetQueuedCompletionStatus处理完数据后,投递下一个wsarecv后,内核才给用户端发送ACK消息,但是测试发现不是这样的,2个工作线程(A和B),如果在工作线程中不投递wsarecv,数据012和345都能由A和B线程分别收到的!只是后面的数据收不到了,IOCP通知对方(用户端)发送下一个数据包的?
问题3:如果服务器缓冲区容量小于一个网络数据包,一次收到的数据有部分数据在TCP协议栈里保存,比如012包里的字符2,GetQueuedCompletionStatus为什么不返回? 如果返回了会发生多个工作线程同时收到一个用户数据的情况,所以他他一定不返回,但是根据IOCP原理,收到网络数据后,GetQueuedCompletionStatus一定返回!!!
------解决方案--------------------
我不是高手,也不是自认为的高手,建议楼主把标题换一下!
谁愿意当自认为的高手??