给定以下伪代码/*完成端口*/
HANDLE io_completion_port;/*TCP链接描述结构*/
typedef struct connection
{
  SOCKET socket;
  OVERLAPPED sending;
  OVERLAPPED receiving;
  WSABUF buffer1;
  WSABUF buffer2;} CONNECTION, *PCONNECTION;/*完成工作线程*/
void worker()
{
   int bytes;
   LPOVERLAPPED overlapped;
   PCONNECTION connection;
   GetQueuedCompletionStatus(io_completion_port, &bytes, &connection, &overlapped, INFINITE);
   /*此后省略处理函数*/
}void main()
{
/*socket已经加入完成端口io_completion_port*/
WSARecv(connection->socket, &(connection->buffer1), 1, 0, &flag, &(connection->receiving), 0);
WSASend(connection->socket, &(connection->buffer2), 1, 0, flag, &(connection->sending), 0);
}
既定目标:实现双工socket
给定条件:现在,worker阻塞等待中
遇到问题:
1.main()中,在同一个socket上的WSARecv和WSASend能否成功(即SOCKET_ERROR&&WSA_IO_PENDING态)?
2.理论上,给定同一个TCP链接,客户机和服务器都调用WSARecv或者WSASend,完成端口会报错吗?比如A在链接上WSARecv,然后B也在链接上WSARecv。

解决方案 »

  1.   

    问题1,试验下就行了,没这样用过,感觉没问题吧
    问题2应该不会报错,反正是投递了WSARecv这个操作而已,对方没有send的话,那就等待这个操作到来好了
      

  2.   


    1.可以成功,没有不成功的理由
    2.完全没问题,自然而然连接上后,双方都WSARecv等待对方数据
      

  3.   

    这些操作都没问题,但是iocp的意愿不是这样去管理链接和内存。多数的做法都是 在GetQueuedCompletionStatus过程中 ,引入内存池和线程池,实现高效的内存管理。