新闻中心

C++如何用socket进行网络通信_C++基于socket的TCP UDP通信实现

2025-10-29
浏览次数:
返回列表
C++中Socket通信基于TCP和UDP协议,TCP提供可靠连接,需经历创建套接字、绑定、监听、接受连接、收发数据和关闭;UDP无连接,直接通过sendto和recvfrom收发数据报。示例代码展示了Linux下TCP/UDP服务端与客户端的基本实现流程,同时指出Windows平台需初始化Winsock库,跨平台开发应注意头文件和初始化差异,并处理端口占用、错误返回及数据粘包等问题。

c++如何用socket进行网络通信_c++基于socket的tcp udp通信实现

在C++中使用Socket进行网络通信,主要依赖操作系统提供的Socket API。Windows和Linux平台略有不同,但基本流程相似。下面分别介绍基于TCP和UDP的Socket通信实现方式,适用于C++语言环境。

TCP通信实现(面向连接)

TCP提供可靠的、双向的、基于字节流的通信,适合需要确保数据完整性的场景,如文件传输、即时通信等。

服务端实现步骤:
  • 调用socket()创建套接字
  • 使用bind()绑定IP地址和端口
  • 调用listen()监听连接请求
  • 通过accept()接受客户端连接,获取通信套接字
  • 使用recv()接收数据,send()发送数据
  • 通信结束后关闭套接字
客户端实现步骤:
  • 调用socket()创建套接字
  • 使用connect()连接指定的服务端IP和端口
  • 通过send()发送数据,recv()接收响应
  • 通信完成后关闭连接

示例代码(Linux平台):

// 服务端(简化版)

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>

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

    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);

    std::cout << "等待客户端连接...\n";
    client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);

    read(client_fd, buffer, 1024);
    std::cout << "收到: " << buffer << std::endl;

    const char *response = "Hello from server";
    send(client_fd, response, strlen(response), 0);
    close(client_fd);
    close(server_fd);
    return 0;
}

// 客户端(简化版)

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

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

    connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    const char *msg = "Hello Server";
    send(sock, msg, strlen(msg), 0);

    char buffer[1024] = {0};
    read(sock, buffer, 1024);
    std::cout << "响应: " << buffer << std::endl;

    close(sock);
    return 0;
}

UDP通信实现(无连接)

UDP不建立连接,直接发送数据报,速度快但不可靠,适用于实时性要求高、可容忍少量丢包的场景,如音视频传输、DNS查询等。

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho 服务端实现要点:
  • 创建UDP套接字:socket(AF_INET, SOCK_DGRAM, 0)
  • 绑定地址和端口
  • 使用recvfrom()接收数据,并获取发送方地址
  • 使用sendto()向指定地址发送响应
客户端实现要点:
  • 创建UDP套接字
  • 使用sendto()发送数据到服务端
  • 使用recvfrom()接收返回数据

UDP服务端示例:

#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <cstring>

int main() {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in servaddr, cliaddr;
    socklen_t len = sizeof(cliaddr);

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;
    servaddr.sin_port = htons(8080);

    bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr));

    std::cout << "UDP服务端启动,等待消息...\n";
    int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&cliaddr, &len);
    buffer[n] = '\0';
    std::cout << "收到: " << buffer << std::endl;

    const char *response = "UDP Hello";
    sendto(sockfd, response, strlen(response), 0, (const struct sockaddr *)&cliaddr, len);
    close(sockfd);
    return 0;
}

跨平台注意事项

Windows下使用Socket需包含Winsock2.h,并链接ws2_32.lib,且必须先调用WSAStartup()初始化环境。

例如:

#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
// ... 正常使用socket函数
WSACleanup();

Linux则直接使用标准头文件和系统调用。

常见问题与建议

  • 确保端口未被占用,防火墙允许通信
  • 处理函数返回值,检查是否出错(如socket()返回-1)
  • 合理设置缓冲区大小,避免溢出
  • TCP注意粘包问题,可通过长度前缀或分隔符解决
  • UDP有最大报文限制(通常64KB),超长需分片
基本上就这些。根据实际需求选择TCP或UDP,掌握基础API调用后,可以封装成类或使用Boost.Asio等库提升开发效率。

以上就是C++如何用socket进行网络通信_C++基于socket的TCP UDP通信实现的详细内容,更多请关注其它相关文章!


# 绑定  # 中山谷歌推广营销  # 唐山seo推广营销招聘  # 安丘市关键词seo排名优化  # 临汾推广全网营销优势  # 年底为什么做网站推广  # 抖音seo投放案例  # seo推广运营排名  # 营销推广网站的案例  # 福建正规seo优化口碑推荐  # 产品推广营销策划书范文  # 如何实现  # 如何使用  # 尼克  # 适用于  # 如何用  # 网络通信  # 服务端  # 客户端  # st  # dns  # win  # ios  # c++  # ai  # 端口  # 字节  # 防火墙  # 操作系统  # windows  # word  # linux 


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


相关推荐: sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  优化大型XML文件解析:基于Python流式处理的内存高效方案  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  excel如何生成目录 excel一键生成工作表目录超链接  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  iwriter统一登录平台 iwrite账号密码登录页面  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  UC浏览器网页版登录入口官网 电脑版网址入口  Python类型检查:优化关联可选属性的Mypy推断策略  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  age动漫网站入口 age动漫官网直接访问入口  黑猫投诉统一入口官网 消费者权益保护投诉平台  邮政快递单号查询入口 邮政快递物流信息在线查询入口  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  Centos/Linux 系统下安装 composer 的完整步骤  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  解决深度学习模型训练初期异常高损失与完美验证准确率问题  照顾宝贝2小游戏免费秒玩入口  提升Kafka消费者健壮性:会话超时处理与消息处理语义  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  163邮箱官方主页登录 直达网易邮箱登录核心页面  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Go语言中JSON数据解码与字段访问指南  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  msn官网入口地址手机版 msn官方网站手机最新链接  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  yandex入口引擎手机版 yandex安卓版下载入口  微信网页版扫码登录入口 微信网页版二维码登录入口  深入理解J*a编译器的兼容性选项:从-source到--release  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  windows10怎么关闭系统提示音_windows10彻底静音设置方法  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  Pandas DataFrame:高效添加条件计算列  AO3同人作品网入口 AO3搜索引擎官网永久地址  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍 

搜索