IOCP菜鸟问题1,请高人明示,谢谢,在线等....
务器端3个工作线程(N1/N2/N3),负责网络数据收发,其他忽略
某个时间里,假设MA/MB均要发送大于一个数据包的业务数据,MA/MB先发送满包数据假设如下
MA:abcdef MB 123456
服务器端的3个线程可能有以下接收状态
N1=abcd N2=ef1234 N3=56
问题1:如何保证线程写入缓冲区的数据顺序与接收顺序一致?
由于线程调度的无序性,尽管从网卡上读取数据不会乱序,但是线程往缓冲区写数据可能乱序(ef1234abcd56),可网上有人说线程往缓冲区写数据不会乱序,如果是这样,原理是什么?
问题2:对于线程N2,他收到了2个不同用户的数据(不会发生N2收到2个用户的不同数据片段这种情况吗?),那么在往缓冲区写数据的时候,该段数据的发送IP地址(发送方ID)无法确定,在缓冲区组包的过程中,如何确定1234数据来自哪个用户?
问题3:用户端传送数据到服务器后,服务器启动线程处理,得到结果后,服务器端使用什么机制通知工作线程有数据要发送(通知IOCP工作线程有数据要发送),是PostQueuedCompletionStatus吗?
问题4:如果服务器端使用for(){send();}发送数据,假如网络很卡或服务器忙,可能将服务器send缓冲区写满,这会造成什么危害?
接上问题5:服务器端比较安全的数据发送办法是send一条数据后,等待用户端确认,之后再发送下一条数据,服务器端工作线程中一般有如下编码:
DWORD WorkerThread
{
.....
switch( pIoContext->m_OpType )
{
// RECV
case RECV_POSTED:
{
接收一个网络数据包----------a
投递一个新的接收请求
}
break;
case SEND_POSTED:
{
发送一个网络数据包----------b
投递一个新的发送请求
}
break;
.....
}
问题是:对于同一个socket,发送是在b处执行的,接收回执消息是在a处执行的,系统如何将a处得到的消息通知给send,使之继续发送剩余数据?
[解决办法]
你没有理解ICOP异步的机制.
1.这个问题确实存在.二种方法:一次投太多IO 只投一个. 如果你非要投多个.你得加入序列号.这样太麻烦.而且服务器本来并发大,没必要投多个.
2.每个一客户端 IOCP会返回一个key.地址,通过它你可以找到是哪个发的.
3.都可以.
4.你服务器用异步.理解异步不会出现阻塞.
5.你要用一问一答的模式.这是设计上的问题,不应该在网络层上来处理.你这样处理不了的.你应该加入缓存区来处理数据.有就用3.的方法去发送数据.