基于boost1.70 ,使用tcp socket作为服务器,开启一个线程进行监听
时间: 2024-03-15 17:44:02 浏览: 95
socket 作为服务器端,监听客户端
5星 · 资源好评率100%
好的,可以参考如下代码实现:
```cpp
#include <boost/asio.hpp>
#include <thread>
#include <iostream>
using namespace boost::asio;
using namespace boost::system;
using namespace std::chrono_literals;
class TcpServer {
public:
TcpServer(io_service& ios, short port) : acceptor_(ios, ip::tcp::endpoint(ip::tcp::v4(), port)) {}
void start() {
std::thread t([&]() {
while (true) {
try {
ip::tcp::socket sock(acceptor_.get_io_service());
acceptor_.accept(sock);
std::cout << "New connection from: " << sock.remote_endpoint() << std::endl;
std::thread([&]() {
try {
while (true) {
char buf[1024];
size_t len = sock.read_some(buffer(buf));
write(sock, buffer(buf, len));
}
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
}).detach();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
std::this_thread::sleep_for(1s);
}
}
});
t.detach();
}
private:
ip::tcp::acceptor acceptor_;
};
int main() {
try {
io_service ios;
TcpServer server(ios, 9999);
server.start();
ios.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
```
这里使用了 Boost.Asio 库,创建了一个 `TcpServer` 类,其中 `start()` 方法会在新线程中循环监听客户端连接,处理连接请求。监听到连接请求后,会创建一个新线程处理与该客户端的通信,每次收到消息后直接将其回复。具体实现中,使用了 `ip::tcp::acceptor` 和 `ip::tcp::socket` 类进行监听和数据传输。
在 `main()` 函数中,创建了一个 `io_service` 对象并运行,同时启动了 `TcpServer` 对象的 `start()` 方法。
阅读全文