使用C++,创建一个server类,可以设定ip和端口,使得能够接收到信息并且打印信息,要求将.h和.cpp分开
时间: 2024-09-19 11:01:47 浏览: 32
client_svr.rar_C++ Builder_TCPIPclient_svr_c builder 通信
首先,我们需要创建一个名为`Server.h`的头文件,用于声明服务器类及其成员函数。在这个文件中,我们将定义一个名为`Server`的类,它有一个构造函数,用于设置IP地址和端口号。此外,我们还需要声明一个名为`start`的成员函数,用于启动服务器并接收客户端发送的消息。
```cpp
// Server.h
#pragma once
#include <iostream>
#include <string>
#include <boost/asio.hpp>
class Server {
public:
Server(const std::string& ip, unsigned short port);
void start();
private:
boost::asio::io_context io_context_;
boost::asio::ip::tcp::acceptor acceptor_;
void handle_accept(std::shared_ptr<boost::asio::ip::tcp::socket> socket, const boost::system::error_code& error);
};
```
接下来,我们需要创建一个名为`Server.cpp`的源文件,用于实现`Server`类的成员函数。在这个文件中,我们将实现`Server`类的构造函数、`start`函数以及`handle_accept`函数。
```cpp
// Server.cpp
#include "Server.h"
#include <memory>
Server::Server(const std::string& ip, unsigned short port)
: io_context_{}, acceptor_{io_context_} {
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::make_address(ip), port);
acceptor_.open(endpoint.protocol());
acceptor_.bind(endpoint);
acceptor_.listen();
}
void Server::start() {
acceptor_.async_accept([this](auto&& ec, auto&& socket) {
if (!ec) {
std::make_shared<Server>(std::move(socket))->start();
}
handle_accept(std::move(socket), ec);
});
io_context_.run();
}
void Server::handle_accept(std::shared_ptr<boost::asio::ip::tcp::socket> socket, const boost::system::error_code& error) {
if (!error) {
std::array<char, 1024> buffer;
boost::system::error_code read_error;
size_t length = socket->read_some(boost::asio::buffer(buffer), read_error);
if (!read_error) {
std::cout << "Received message: " << std::string(buffer.data(), length) << std::endl;
}
}
start(); // Continue accepting new connections
}
```
现在,我们已经创建了一个名为`Server`的类,它可以设置IP地址和端口号,并能够接收客户端发送的消息。要使用这个类,你可以在你的主程序中包含`Server.h`头文件,并创建一个`Server`对象,然后调用其`start`方法来启动服务器。例如:
```cpp
#include "Server.h"
int main() {
Server server("127.0.0.1", 8080);
server.start();
return 0;
}
```
阅读全文