c++,socket,使用方法解析,封装demo
时间: 2024-09-29 07:13:08 浏览: 44
在C++中,Socket是一种用于网络通信的重要工具,它允许程序之间通过网络进行数据交换。通常涉及到两个方面:套接字编程(Socket Programming)和网络库(如Boost.Asio或Poco C++ Network)。
**套接字编程基础**:
1. **创建套接字**: 使用`::socket()`函数从指定协议族(如AF_INET for IPv4)和套接字类型(SOCK_STREAM for TCP连接)创建套接字。
```cpp
int socket_id = ::socket(AF_INET, SOCK_STREAM, 0);
```
2. **设置选项**: 可能会设置接收缓冲区大小、监听等属性。
3. **绑定地址**: `::bind(socket_id, address, port)`将套接字绑定到特定的IP地址和端口。
4. **监听**: `::listen(socket_id, backlog)`让套接字开始接受连接请求。
5. **连接或接受连接**: 对于客户端,可以使用`::connect(socket_id, remote_address)`;对于服务器,需要`::accept(socket_id)`等待并建立新的连接。
**使用库简化操作**:
现代C++往往借助网络库来简化套接字编程。比如,Boost.Asio提供了一套高阶API,使得异步I/O变得更加容易:
```cpp
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
std::string host = "localhost";
int port = 8080;
tcp::resolver resolver(io_service);
tcp::resolver::query query(host, std::to_string(port));
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
// 发送数据
std::string message = "Hello, server!";
boost::asio::write(socket, boost::asio::buffer(message));
// 接收数据
std::vector<char> buffer(1024);
boost::asio::read(socket, boost::asio::dynamic_buffer(buffer));
std::cout << "Received: " << buffer.data() << std::endl;
```
**封装示例** (简化版):
```cpp
class SocketHandler {
public:
explicit SocketHandler(tcp::socket& socket)
: socket_(socket), io_service_(&socket_.get_io_service()) {}
void startSending(const std::string& message) {
sendData(message);
}
private:
template<typename WriteBufferType>
void sendData(const std::string& data) {
boost::asio::write(socket_, boost::asio::buffer(data));
}
tcp::socket& socket_;
boost::asio::io_service* io_service_;
};
void createAndUseSocket(int port) {
try {
// 创建socket和处理对象
tcp::socket socket(io_service_);
SocketHandler handler(socket);
// 设置端口并连接
tcp::endpoint endpoint(ip::address::from_string("localhost"), port);
boost::asio::connect(socket, endpoint);
// 开始发送数据
handler.startSending("Hello from client!");
} catch (std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
}
```
阅读全文