|
100驿站币
我目的想做一个端口转发器
我大概说下我当前的大体方法步骤:
线程池一
1. 创建一个服务 WSAStartup(MAKEWORD(2, 2), &data)
2. 创建一个Socket WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
3. 绑定端口 bind(m_ListenSocket, (sockaddr*)&service, sizeof(sockaddr_in));
4. 监听端口 listen(m_ListenSocket, SOMAXCONN);
5. 创建IOCP CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
CreateIoCompletionPort((HANDLE)tSocket, m_hCompletionPort, (ULONG_PTR)pSockData, 0);
6. 开始监听每个客户端发来的消息
while(1){
bIORet = GetQueuedCompletionStatus(pThis->m_hCompletionPort, &dwTrans, (PULONG_PTR)&pPerSockData, (LPOVERLAPPED *)&pOverLaps, INFINITE);
case IO_TYPE_READ: //接收网络消息
(发往服务端)
}
为了在一个线程中实现服务端发往客户端的高并发
下面我这样搭配可不可行呢(在connect()后面创建完成端口,CreateIoCompletionPort())
线程池二
1. 创建一个服务 WSAStartup(MAKEWORD(2, 2), &data)
2. 创建一个Socket WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
3. 连接到一个服务端 connect(Socket, (struct sockaddr*)&server, sizeof(struct sockaddr));
4. 创建IOCP CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
CreateIoCompletionPort((HANDLE)Socket, m_hCompletionPort, (ULONG_PTR)pSockData, 0);
5. 开始监听服务端发来的消息
while(1){
bIORet = GetQueuedCompletionStatus(pThis->m_hCompletionPort, &dwTrans, (PULONG_PTR)&pPerSockData, (LPOVERLAPPED *)&pOverLaps, INFINITE);
case IO_TYPE_WRITE:
(解析发配给指定客户端)
}
为什么 GetQueuedCompletionStatus() 一直处于阻塞状态 服务端发给客户端消息 无法通过?
|
-
上一篇: 通过按钮复制文件下一篇: 萌新参考别人的通讯录自己写的单链表存储结构的通讯录,大佬给给意见
|