给定以下伪代码/*完成端口*/
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。
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。
问题2应该不会报错,反正是投递了WSARecv这个操作而已,对方没有send的话,那就等待这个操作到来好了
1.可以成功,没有不成功的理由
2.完全没问题,自然而然连接上后,双方都WSARecv等待对方数据