21xrx.com
2024-12-22 16:57:09 Sunday
登录
文章检索 我的文章 写文章
C++网络编程实战范例
2023-07-14 22:23:03 深夜i     --     --
C++ 网络编程 实战 范例

C++网络编程是当今十分常见的领域,我们常常需要使用C++进行web应用开发、网络协议客户端和服务器等方面的工作。本文将以实战为主,给出C++网络编程的范例,帮助大家更好地了解这个领域。

实战范例一:使用C++编写网络协议客户端

我们以HTTP客户端为例,使用C++编写一个简单的HTTP客户端。首先,我们需要定义一个客户端类,包含连接服务器、发送数据和获取响应等方法。如下所示:


#include <iostream>

#include <string>

#include <curl/curl.h>

class HttpClient {

public:

  HttpClient();

  ~HttpClient();

  bool connect(const std::string& url);

  bool send(const std::string& data);

  std::string receive();

  void close();

private:

  CURL* _curl;

  CURLcode _res;

  std::string _response;

};

然后,我们需要实现这些方法:


HttpClient::HttpClient() {

  _curl = curl_easy_init();

}

HttpClient::~HttpClient() {

  curl_easy_cleanup(_curl);

}

bool HttpClient::connect(const std::string& url) {

  curl_easy_setopt(_curl, CURLOPT_URL, url.c_str());

  _res = curl_easy_perform(_curl);

  if (_res != CURLE_OK) {

    std::cerr << "Error: " << curl_easy_strerror(_res) << std::endl;

    return false;

  }

  return true;

}

bool HttpClient::send(const std::string& data) {

  curl_easy_setopt(_curl, CURLOPT_POSTFIELDS, data.c_str());

  _res = curl_easy_perform(_curl);

  if (_res != CURLE_OK) {

    std::cerr << "Error: " << curl_easy_strerror(_res) << std::endl;

    return false;

  }

  return true;

}

std::string HttpClient::receive() {

  curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, HttpClient::writeData);

  curl_easy_setopt(_curl, CURLOPT_WRITEDATA, this);

  _res = curl_easy_perform(_curl);

  if (_res != CURLE_OK) {

    std::cerr << "Error: " << curl_easy_strerror(_res) << std::endl;

    return "";

  }

  return _response;

}

void HttpClient::close() {

  curl_easy_cleanup(_curl);

}

size_t HttpClient::writeData(char* ptr, size_t size, size_t nmemb, void* userdata) {

  HttpClient* client = static_cast<HttpClient*>(userdata);

  std::string data(ptr, size*nmemb);

  client->_response.append(data);

  return size*nmemb;

}

使用这个HTTP客户端,我们可以方便地连接远程服务器、发送数据和获取响应,实现网络协议客户端的功能。

实战范例二:使用C++编写网络协议服务器

我们以TCP服务器为例,使用C++编写一个简单的TCP服务器。首先,我们需要定义一个服务器类,包含初始化、监听连接、发送数据和接受数据等方法。如下所示:


#include <iostream>

#include <sstream>

#include <string>

#include <cstring>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>

#include <netinet/in.h>

class TcpServer {

public:

  TcpServer();

  ~TcpServer();

  bool init(int port);

  bool start();

  bool stop();

  void send(int client_sock, const std::string& data);

  std::string receive(int client_sock);

private:

  int _server_sock;

  int _client_sock;

  sockaddr_in _server_addr;

  sockaddr_in _client_addr;

  socklen_t _client_len;

};

然后,我们需要实现这些方法:


TcpServer::TcpServer() {

  _server_sock = socket(AF_INET, SOCK_STREAM, 0);

}

TcpServer::~TcpServer() {

  close(_server_sock);

}

bool TcpServer::init(int port) {

  memset(&_server_addr, 0, sizeof(_server_addr));

  _server_addr.sin_family = AF_INET;

  _server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  _server_addr.sin_port = htons(port);

  if (bind(_server_sock, (sockaddr*)&_server_addr, sizeof(_server_addr)) == -1)

    std::cerr << "Error: Can not bind to port " << port << std::endl;

    return false;

  

  if (listen(_server_sock, 10) == -1)

    std::cerr << "Error: Can not listen on port " << port << std::endl;

    return false;

  

  return true;

}

bool TcpServer::start() {

  _client_len = sizeof(_client_addr);

  _client_sock = accept(_server_sock, (sockaddr*)&_client_addr, &_client_len);

  if (_client_sock == -1)

    std::cerr << "Error: Can not accept client connection" << std::endl;

    return false;

  

  return true;

}

bool TcpServer::stop() {

  close(_client_sock);

  return true;

}

void TcpServer::send(int client_sock, const std::string& data) {

  int len = data.length();

  const char* buffer = data.c_str();

  int bytes_sent = 0;

  while (bytes_sent < len) {

    int bytes = write(client_sock, buffer+bytes_sent, len-bytes_sent);

    if (bytes < 0)

      std::cerr << "Error: Can not write to socket" << std::endl;

      break;

    

    bytes_sent += bytes;

  }

}

std::string TcpServer::receive(int client_sock) {

  char buffer[1024];

  std::stringstream ss;

  while (true) {

    int bytes_received = read(client_sock, buffer, sizeof(buffer)-1);

    if (bytes_received < 0)

      std::cerr << "Error: Can not read from socket" << std::endl;

      break;

    

    if (bytes_received == 0)

      break;

    

    buffer[bytes_received] = '\0';

    ss << buffer;

  }

  return ss.str();

}

使用这个TCP服务器,我们可以方便地监听连接、发送数据和接受数据,实现网络协议服务器的功能。

总结

本文介绍了C++网络编程的实战范例,分别使用了C++编写了HTTP客户端和TCP服务器。这些代码块可以在工作中被使用,我们也可以根据不同的需求进行扩展和修改。希望这些范例能够帮助大家更好地了解C++网络编程领域。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复