MFC的TCP通信,怎么将侦听后的套接字传入到线程中
时间: 2024-10-22 07:06:05 浏览: 25
基于java实现Socket套接字一对一聊天系统源码+项目说明.zip
5星 · 资源好评率100%
在MFC(Microsoft Foundation Classes)中创建TCP服务器时,通常会在主应用程序中负责监听套接字,而当有新连接时,你可以选择创建一个新的线程来处理每个客户端连接。这里是一个简单的步骤说明如何将侦听到的套接字传递给新线程:
1. **在主线程中建立监听套接字**:
使用`CAsyncSocket`类创建一个异步套接字,并绑定到特定端口,开始监听:
```cpp
CAsyncSocket serverSocket(INVALID_SOCKET, AF_INET, SOCK_STREAM);
serverSocket.Listen(listeningPort);
```
2. **监听连接事件**:
设置监听事件,一旦有新的连接,`OnAccept()`回调函数会被调用:
```cpp
void CYourClass::OnAccept()
{
// 获取新连接的套接字
CAsyncSocket clientSocket = serverSocket.Accept();
// 创建新的线程来处理客户端连接
std::thread handlerThread(std::bind(&CYourClass::HandleClientConnection, this, std::ref(clientSocket)));
handlerThread.detach(); // 后台运行
}
```
3. **在`HandleClientConnection`函数中处理新线程**:
在这个函数里,你可以从`clientSocket`获取到一个独立的套接字,然后在这个线程内部处理具体的TCP通信:
```cpp
void CYourClass::HandleClientConnection(CAsyncSocket& clientSocket)
{
// 将套接字转换成CAsyncSocket对象
auto clientHandlerSocket = std::make_shared<CAsyncSocket>(clientSocket.GetSafeHandle());
// 在这个新的线程中,可以安全地进行通信
while (!m_bStopListening)
{
char buffer[1024];
int bytesReceived = clientHandlerSocket->Recv(buffer, sizeof(buffer), 0);
// 处理收到的数据...
}
// 关闭套接字等清理工作
clientHandlerSocket->Close();
}
```
4. **注意**:
- 在`OnAccept()`和`HandleClientConnection`之间传递套接字时,应使用引用或共享指针,以避免原始套接字在主线程中被意外修改。
- 要记得管理好线程生命周期,比如添加停止标志`m_bStopListening`,以便在适当的时候关闭线程。
阅读全文