0

0

C++ socket编程入门_C++ TCP客户端与服务端实现

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-27 14:08:02

|

142人浏览过

|

来源于php中文网

原创

首先实现TCP服务端与客户端通信,服务端绑定8080端口监听并接收客户端连接,客户端向127.0.0.1:8080发起连接,双方通过socket收发“Hello”消息,使用g++编译后依次运行server和client可完成一次基础通信。

c++ socket编程入门_c++ tcp客户端与服务端实现

想快速上手C++网络编程?从TCP客户端与服务端开始是最直接的方式。本文带你一步步实现一个基础但完整的C++ TCP通信程序,适用于Linux环境(如Ubuntu、CentOS),使用标准的socket API。

1. 理解TCP通信基本流程

TCP是面向连接的协议,通信前必须建立连接。服务端监听端口,客户端主动发起连接。一旦连接成功,双方可通过套接字读写数据。

服务端流程:

  • 创建套接字(socket)
  • 绑定地址和端口(bind)
  • 开启监听(listen)
  • 接受客户端连接(accept)
  • 收发数据(recv/send)
  • 关闭连接(close)

客户端流程:

立即学习C++免费学习笔记(深入)”;

  • 创建套接字
  • 连接服务端(connect)
  • 收发数据
  • 关闭连接

2. C++实现TCP服务端

以下是一个简单的TCP服务端代码示例:

#include 
#include 
#include 
#include 
#include 

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

    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        return -1;
    }

    // 配置地址结构
    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");
        close(server_fd);
        return -1;
    }

    // 开始监听
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        close(server_fd);
        return -1;
    }
    std::cout << "Server listening on port 8080...\n";

    // 接受连接
    if ((client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        close(server_fd);
        return -1;
    }

    // 接收数据
    int valread = read(client_fd, buffer, 1024);
    std::cout << "Received: " << buffer << std::endl;

    // 发送响应
    const char *response = "Hello from server";
    send(client_fd, response, strlen(response), 0);

    // 关闭连接
    close(client_fd);
    close(server_fd);
    return 0;
}

3. C++实现TCP客户端

对应的服务端,客户端代码如下:

Smart Picture
Smart Picture

Smart Picture 智能高效的图片处理工具

下载
#include 
#include 
#include 
#include 
#include 

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

    // 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation error");
        return -1;
    }

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

    // 将IP地址转换为二进制格式
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        perror("Invalid address / Address not supported");
        return -1;
    }

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

    // 发送消息
    send(sock, message, strlen(message), 0);
    std::cout << "Message sent\n";

    // 接收响应
    int valread = read(sock, buffer, 1024);
    std::cout << "Response: " << buffer << std::endl;

    // 关闭连接
    close(sock);
    return 0;
}

4. 编译与运行方法

将服务端代码保存为 server.cpp,客户端保存为 client.cpp

使用g++编译:

  • g++ server.cpp -o server
  • g++ client.cpp -o client

先运行服务端:./server

再打开另一个终端运行客户端:./client

如果一切正常,服务端会打印收到的消息,客户端会收到“Hello from server”。

基本上就这些。这个例子展示了最基础的TCP通信过程。实际开发中还需要处理错误重连、多客户端并发(可用多线程或select)、数据粘包等问题。但掌握这个模板,你就已经迈出了C++网络编程的第一步。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1348

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

572

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

545

2023.07.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

swoole入门物联网开发与实战
swoole入门物联网开发与实战

共15课时 | 1.2万人学习

swoole项目实战(第二季)
swoole项目实战(第二季)

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号