请教各位:IOCP中的GetQueuedCompletionStatus()函数是否只能接受wsasend,wsarecv投递的消息呢?
在我的测试环境中GET函数不能接受普通的send, recv投递的消息。分不够另开贴。
(我正在开发一个数据库服务器,该服务器设计用IOCP实现监听。C/S两端可能是异构系统)
在我的测试环境中GET函数不能接受普通的send, recv投递的消息。分不够另开贴。
(我正在开发一个数据库服务器,该服务器设计用IOCP实现监听。C/S两端可能是异构系统)
============================
只能接受带Overlapped结构的调用。其中包括WSASend,WSASendTo,WSARecv,WSARecvFrom,AcceptEx,ConnectEx等等。
我要开发的是一个类似中间件服务器的东西,两端是异构系统
client端可能是C#,java,php或者其他的脚本语言,
这种情况下,我还想使用IOCP的话有什么解决方案?
(Client端可能是LINUX + java)
如果是这样,那么Linux平台下的Firefox如何访问?
还有就是,一般的商用中间件服务器难道都是阻塞式的I/O?
client端可能是C#,java,php或者其他的脚本语言,
这种情况下,我还想使用IOCP的话有什么解决方案?
(Client端可能是LINUX + java)
=========================
你的实现只在于你自己的选择,跟别人(对端)如何实现没有任何关系。只要网络协议一致即可。
网络协议是一致的,实现的都是自定义的网络协议
但是关键问题是:客户端Java没有办法投递WSASend的消息to sangermax:
服务器端是用IOCP,客户端可以直接连接没有问题
但是如何投递异步消息?
在我的测试环境下,connect到服务器没问题,但是Java没法投递wsasend, wsarecv消息
所以服务器的线程池里GET函数无法返回。不知道我描述清楚了没有
=================================
说了,与对端的实现方式无关,WSASend也是Send,你所需要关心的只是他们Send过来的数据,而不是去管他们具体使用send科学还是sendto,又或者使用write等等。
客户端用win32写一个可以发送异步消息的dll给Java本地调用。
但是如果是Linux下的Java就没办法了。
我的线程池里的GET函数对于客户端的普通send没法返回,
这个问题怎么解决?
这个问题怎么解决?
=======================
先要弄清楚的是,你使用I/O完成端口,仅限于你的实现。也就是说你在接收客户端的信息时,需要调用的是WSARecv,提交了一个接收请求之后,客户端才能发送数据,否则并不会因为客户端到来的send/WSASend通讯你有数据接收。这是前置处理的。由于需要重叠操作,所以你必须指定使用重叠操作函数能可能得到重叠I/O完成的通知。换句话说,如果你调用的是recv,这是一个立即函数,仅只能阻塞或者立即接收。至于客户端使用send你无法收到消息,这个仅判断为个人的想当然。首先你需要使用的是支持重叠操作的Winsock2,并且所使用的Socket是由WSASocket带Overlapped申明的。然后,需要将进行完成操作的SOCKET与完成端口进行绑定。