新闻中心

C++如何进行网络编程_使用Socket套接字实现C++ TCP客户端与服务器

2025-12-04
浏览次数:
返回列表
首先介绍TCP Socket通信流程,服务器需创建Socket、绑定地址端口、监听、接受连接并收发数据,客户端则创建Socket后连接服务器并通信;随后给出C++实现的TCP服务器与客户端代码示例,服务器监听8888端口接收消息并回应,客户端发送“Hello from client”并接收响应;最后说明在Linux下使用g++编译运行的方法,并提及Windows平台需初始化Winsock。

c++如何进行网络编程_使用socket套接字实现c++ tcp客户端与服务器

在C++中进行网络编程,最基础和常用的方式是使用Socket(套接字)接口。通过Socket,可以实现TCP或UDP通信。本文重点介绍如何使用C++基于TCP协议实现一个简单的客户端与服务器通信程序,适用于Windows和Linux平台(以Linux为主说明)。

1. 理解TCP Socket通信的基本流程

TCP是一种面向连接的、可靠的传输协议。在建立通信前,服务器需先监听端口,客户端发起连接请求,连接成功后双方才能收发数据。

服务器端流程:

  • 创建Socket
  • 绑定IP地址和端口(bind)
  • 开始监听(listen)
  • 接受客户端连接(accept)
  • 接收和发送数据(recv/send)
  • 关闭连接

客户端流程:

  • 创建Socket
  • 连接服务器(connect)
  • 发送和接收数据(send/recv)
  • 关闭连接

2. 实现C++ TCP服务器端代码

以下是一个简单的TCP服务器示例,监听本地8888端口,接收客户端消息并返回响应。

神笔马良 神笔马良

神笔马良 - AI让剧本一键成片。

神笔马良 320 查看详情 神笔马良
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

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

    // 创建Socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        std::cerr << "Socket创建失败\n";
        return -1;
    }

    // 配置地址结构
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8888);

    // 绑定
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        std::cerr << "Bind失败\n";
        return -1;
    }

    // 监听
    if (listen(server_fd, 3) < 0) {
        std::cerr << "Listen失败\n";
        return -1;
    }

    std::cout << "服务器正在监听8888端口...\n";

    // 接受连接
    if ((client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        std::cerr << "Accept失败\n";
        return -1;
    }

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

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

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

3. 实现C++ TCP客户端代码

客户端连接到服务器,发送消息并接收响应。

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

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

    // 创建Socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "Socket创建失败\n";
        return -1;
    }

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

    // 将IP地址从文本转换为二进制
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        std::cerr << "无效地址或地址不支持\n";
        return -1;
    }

    // 连接服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "连接失败\n";
        return -1;
    }

    // 发送数据
    send(sock, hello, strlen(hello), 0);
    std::cout << "消息已发送\n";

    // 接收响应
    int valread = read(sock, buffer, 1024);
    std::cout << "服务器响应: " << buffer << "\n";

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

4. 编译与运行

在Linux下使用g++编译:

  • 编译服务器:g++ server.cpp -o server
  • 编译客户端:g++ client.cpp -o client
  • 先运行服务器:./server
  • 再运行客户端:./client

在Windows上可使用WSAStartup初始化Winsock库,并链接ws2_32.lib,流程类似但头文件和初始化略有不同。

基本上就这些。掌握Socket基本操作后,可进一步实现多客户端支持(使用多线程或多路复用如select/poll/epoll)、数据打包解析、心跳机制等,构建更复杂的网络应用。

以上就是C++如何进行网络编程_使用Socket套接字实现C++ TCP客户端与服务器的详细内容,更多请关注其它相关文章!


# 尼克  # 开化网站优化设计费用  # 弋江区网站优化  # 松溪有效的seo哪家好  # 台州网站建设步骤  # SEO资源教程  # 什么是标题seo  # 松江网站建设网站制作  # 伊春关键词排名方案  # 企业建设动态网站  # 建设好的网站有哪些  # 是一种  # 是一个  # 有什么区别  # linux  # 第三方  # 微软  # 多线程  # 绑定  # 客户端  # 网络编程  # stream  # win  # ios  # c++  # ai  # 端口  # windows 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  淘宝支付提示失败如何解决 淘宝支付流程优化方法  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  使用J*aScript检测输入元素是否包含在特定类中  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  Lar*el 递归关系中排除指定分支的教程  Python中高效访问嵌套字典与列表中的键值对  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  顺丰快件物流信息 官方网站查询入口  如何使用Node.js csv 包按条件移除含空字段的CSV记录  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  夸克浏览器图书入口 夸克手机浏览器阅读入口  word中如何让数字纵向排列_Word数字纵向排列方法  高德地图公交到站提醒失败如何解决 高德提醒权限设置  离线运行Go语言之旅:本地部署与GOPATH配置指南  AO3最新可访问网址 Archive of Our Own官方在线入口  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  谷歌google账号怎么注册账号 谷歌账号注册官方流程  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  J*aScript教程:根据元素文本内容动态设置背景色  理解J*aScript Promise的微任务队列与执行顺序  Go语言中的*string:深入理解字符串指针  J*aScriptWebpack优化_J*aScript构建工具实战  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  抖音创作助手登录入口_抖音创作辅助工具官网直达  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  怎么在mac上运行html代码_mac运行html代码方法【指南】  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  mc.js官网登录入口 mc.js官方登录入口最新版  Mac怎么查看崩溃日志_Mac控制台错误报告分析  押井守高度称赞《辐射4》:玩了八年都停不下来!  AO3最新镜像入口 Archive of Our Own官方平台访问  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责 

搜索