117.info
人生若只如初见

Ubuntu中C++如何进行网络通信

在Ubuntu中,C++进行网络通信通常使用套接字(socket)编程。套接字是一种允许不同计算机上的进程通过网络相互发送和接收数据的机制。以下是一个简单的TCP/IP网络通信示例,包括服务器端和客户端的代码。

服务器端

  1. 创建一个TCP套接字。
  2. 绑定套接字到一个IP地址和端口。
  3. 监听连接请求。
  4. 接受连接。
  5. 发送和接收数据。
  6. 关闭连接。
#include 
#include 
#include 
#include 
#include 

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};

    // 创建套接字文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置套接字选项
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    // 定义服务器地址
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // 绑定套接字到地址
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 读取数据
    read(new_socket, buffer, 1024);
    std::cout << "Message from client: " << buffer << std::endl;

    // 发送数据
    send(new_socket, "Hello from server", 17, 0);
    std::cout << "Hello message sent\n";

    // 关闭套接字
    close(new_socket);
    close(server_fd);

    return 0;
}

客户端

  1. 创建一个TCP套接字。
  2. 连接到服务器的IP地址和端口。
  3. 发送和接收数据。
  4. 关闭连接。
#include 
#include 
#include 
#include 
#include 

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};

    // 创建套接字文件描述符
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cout << "
 Socket creation error 
";
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // 将IPv4地址从文本转换为二进制形式
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        std::cout << "
Invalid address/ Address not supported 
";
        return -1;
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cout << "
Connection Failed 
";
        return -1;
    }

    // 发送数据
    send(sock, hello, strlen(hello), 0);
    std::cout << "Hello message sent\n";

    // 读取数据
    read(sock, buffer, 1024);
    std::cout << "Message from server: " << buffer << std::endl;

    // 关闭套接字
    close(sock);

    return 0;
}

编译和运行

  1. 将服务器端代码保存为server.cpp,客户端代码保存为client.cpp
  2. 在终端中编译代码:
g++ -o server server.cpp
g++ -o client client.cpp
  1. 运行服务器:
./server
  1. 在另一个终端中运行客户端:
./client

这样,客户端就会连接到服务器,发送一条消息,并接收服务器的响应。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe671AzsKCA5TAFU.html

推荐文章

  • Ubuntu PHP数据库连接怎样实现

    在Ubuntu系统中,使用PHP连接数据库通常是通过使用PHP的数据库扩展来实现的。以下是几种常见的数据库及其连接方法:
    MySQL/MariaDB 安装PHP MySQL扩展:

  • 如何监控Ubuntu PHP日志

    要监控Ubuntu系统中的PHP日志,您可以使用以下几种方法:
    使用命令行工具 tail命令:实时查看日志文件的最后几行。例如,要实时查看/var/log/php7.0-fpm.lo...

  • Kafka配置Ubuntu有哪些常见误区

    在Ubuntu上配置Kafka时,有一些常见的误区,这些误区可能会导致Kafka无法正常运行或性能不佳。以下是一些常见的误区及其解决方案: JDK版本兼容问题: 误区:使用...

  • 如何在Ubuntu上挂载FTP服务器

    在Ubuntu上挂载FTP服务器,你可以使用curlftpfs这个工具 首先,确保你的系统已经安装了curlftpfs。如果没有,请运行以下命令来安装: sudo apt-get update
    ...

  • VirtualBox支持Debian哪些版本

    VirtualBox支持多个版本的Debian Linux发行版。以下是一些具体版本的信息: Debian 12 (Bullseye):VirtualBox 7.1.6及更高版本支持Debian 12。用户可以从Virtua...

  • Debian僵尸进程的处理方法

    在Linux系统中,僵尸进程是指已经结束但仍在进程表中保留其信息的进程。这些进程通常是由于父进程没有正确处理子进程的结束状态而导致的。以下是处理Debian系统中...

  • Debian与vsftpd的集成方法

    在Debian系统上集成vsftpd(Very Secure FTP Daemon)作为FTP服务器是一个相对直接的过程。以下是一个详细的步骤指南,帮助你在Debian系统上安装、配置和管理vsf...

  • CentOS Stream 8新特性有哪些

    CentOS 8 于 2019 年 9 月 24 日发布,是一个源自 Red Hat Enterprise Linux (RHEL) 的 Linux 发行版。以下是 CentOS 8 的一些新特性:
    1. 默认桌面环境更新...