C(C++)网络编程(服务器单线程)
创始人
2024-09-25 06:52:57
0

详细介绍如何在 C/C++ 中使用 TCP 协议实现客户端和服务器之间的网络通信。网络编程在现代软件开发中非常重要,尤其是开发分布式系统、实时应用程序或客户端-服务器架构时,掌握 TCP 网络通信的基本知识和操作流程是必不可少的。

目录

  1. 网络通信的基础知识
  2. TCP 协议简介
  3. 客户端与服务器端的通信流程
  4. 代码案例讲解
    • 客户端代码
    • 服务器端代码
  5. 总结

1. 网络通信的基础知识

网络通信指的是两台或多台计算机通过网络互相传递数据的过程。通常有两种通信模式:

  • 面向连接的通信(如 TCP)
  • 无连接的通信(如 UDP)

在面向连接的通信中,双方在发送数据之前首先需要建立一个可靠的连接。TCP 就是面向连接的协议,它确保数据的传输是可靠的。

2. TCP 协议简介

TCP(Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的协议。在 TCP 协议中,数据的传输过程如下:

  1. 建立连接:客户端和服务器端进行三次握手,建立可靠的连接。
  2. 数据传输:在连接建立之后,数据以流的方式进行传输,TCP 会确保数据的完整性和顺序。
  3. 断开连接:通信结束后,双方通过四次挥手断开连接。

3. 客户端与服务器端的通信流程

TCP 通信一般分为两部分:服务器端客户端

  • 服务器端

    1. 创建套接字(socket)
    2. 绑定 IP 地址和端口号
    3. 监听连接请求
    4. 接受客户端的连接
    5. 进行数据的收发
    6. 关闭连接
  • 客户端

    1. 创建套接字
    2. 连接到服务器
    3. 进行数据的收发
    4. 关闭连接

下面我们将通过代码案例来详细说明每一步的实现。

4. 代码案例讲解

4.1 客户端代码

客户端的功能主要是连接服务器,并向服务器发送数据。以下是一个简单的客户端代码示例:

用于通信的结构体定义:

 
#include #include #include #include #include  //客户端代码 int main() {     // 1. 创建通信的套接字     int fd_lis = socket(AF_INET, SOCK_STREAM, 0);     if(fd_lis == -1) {         perror("socket_listen error!");         return -1;     }      // 2. 链接服务器的IP和端口     struct sockaddr_in saddr;     saddr.sin_family = AF_INET;     saddr.sin_port = htons(9999);     inet_pton(AF_INET, "192.168.159.129", &saddr.sin_addr.s_addr);      // 3. 连接服务器     int ret = connect(fd_lis, (struct sockaddr*)&saddr, sizeof(saddr));     if(ret == -1) {         perror("connect_error");         return -1;     }      // 4. 开始通信     int number = 0;     while (1) {         std::cout << "客户端发送了信息" << std::endl;         char buff[1024];         sprintf(buff, "你好,hello world,%d...\n", number++);         send(fd_lis, &buff, sizeof(buff), 0);         memset(buff, 0, sizeof(buff));         int len = recv(fd_lis, &buff, sizeof(buff), 0);         if(len > 0) {             std::cout << "server says: " << buff << std::endl;         } else if (len == 0) {             // 通信结束             break;         } else {             perror("recv_error");             break;         }         sleep(1);     }      // 5. 关闭套接字     close(fd_lis);     return 0; } 

客户端代码说明:
  1. 创建套接字socket() 函数用于创建套接字,使用 IPV4 协议(AF_INET),流式传输(SOCK_STREAM),并指定使用 TCP 协议(0)。
  2. 指定服务器地址和端口struct sockaddr_in 用于指定服务器的 IP 地址和端口,htons(9999) 将端口号转为网络字节序,inet_pton 函数将字符串形式的 IP 地址转换为二进制形式。
  3. 连接服务器connect() 函数用于连接到服务器。
  4. 发送和接收数据send() 函数发送数据,recv() 函数用于接收服务器端返回的数据。
  5. 关闭套接字close() 关闭套接字,断开连接。

字节序和函数功能不清楚的,可以查看套接字-Socket | 爱编程的大丙。老师写的非常清楚,B站的课程也讲的十分清晰。

4.2 服务器端代码

服务器端的功能是接受客户端的连接请求,并进行通信。以下是服务器端的代码示例:

#include #include #include #include  //服务器端 int main(){      // 1:创建监听的套接字  具体参数含义为:使用IPV4地址,采用流式传输,使用TCP协议。 返回监听的文件描述符     int fd_lis=socket(AF_INET,SOCK_STREAM,0);     if(fd_lis==-1){         perror("socket_listen error!");         return -1;     }     // 2:绑定本地IP和端口 (IP和端口是addr结构体) 该结构体指定地址类型,通信端口和IP地址      struct sockaddr_in saddr;     saddr.sin_family=AF_INET;     saddr.sin_port=htons(9999);     //INADDR_ANY 使用宏定义的0地址,能够自动读取服务器的网卡IP地址     saddr.sin_addr.s_addr=INADDR_ANY;     int ret = bind(fd_lis,(struct sockaddr*)&saddr,sizeof(saddr));     if(ret==-1){         perror("bing _error");         return -1;     }      // 3设置监听 (监听的文件描述符,一次最大监听的访问量)     ret=listen(fd_lis,128);     if(ret==-1){         perror("listen _error");         return -1;     }      // 4 阻塞并等待客户端的链接,该结构体存储来自客户端的端口和地址      struct sockaddr_in caddr;     caddr.sin_family=AF_INET;     caddr.sin_port=INADDR_ANY;     int addrlen=sizeof(caddr);     int fd_acp=accept(fd_lis,(struct sockaddr*)&caddr,(socklen_t*)&addrlen);          if(fd_acp==-1){         perror("accept _error");         return -1;     }else{         //打印端口,客户端的IP和端口号         char ip_arrd[32];         std::cout<<"客户端ip地址:"<0){             std::cout<<"client says:"<

服务器端代码说明:
  1. 创建套接字:与客户端类似,socket() 函数创建监听套接字。
  2. 绑定 IP 和端口:使用 bind() 函数绑定本地 IP 和端口。INADDR_ANY 可以自动获取服务器的 IP 地址。
  3. 监听连接listen() 函数开始监听端口,允许多个客户端连接。
  4. 接受连接accept() 函数阻塞等待客户端的连接请求,并返回一个新的文件描述符,用于与客户端通信。
  5. 通信过程:使用 recv() 接收客户端发送的数据,使用 send() 将数据返回给客户端。
  6. 关闭套接字:通信结束后,关闭文件描述符,断开连接。

相关内容

热门资讯

秒懂教程!拼三张房卡多少钱一张... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
微信炸金花房间房卡怎么买/微信... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信好友炸金花房卡在哪里买/微... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
秒懂教程!微信里面斗牛链接房卡... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
软件不支持安卓系统,揭秘软件为... 你有没有遇到过这种情况?买了一款心仪的手机,却发现心仪的软件不支持安卓系统,心里那个滋味啊,就像吃了...
怎么创建拼三张房间卡房卡/新鸿... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
拼三张房卡如何充值/新蓝鲸大厅... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
安卓系统的钓鱼之王,揭秘钓鱼软... 你知道吗?在安卓系统的世界里,有一个大名鼎鼎的家伙,它就像是个钓鱼高手,专门钓那些不小心上钩的用户。...
安卓系统免费观看视频,解锁海量... 亲爱的手机控们,你是不是也和我一样,对免费观看视频的安卓系统应用情有独钟?没错,在这个信息爆炸的时代...
安卓系统换成ios系统数据怎么... 你有没有遇到过这种情况:手机从安卓系统换成iOS系统后,突然发现之前积累的数据不翼而飞,心里那个急啊...
安卓原车机系统,安卓原车机系统... 你有没有发现,现在很多车都开始变得智能起来呢?这不,安卓原车机系统就悄悄地走进了我们的生活。想象坐在...
安卓车机通用系统下载,智能驾驶... 你有没有发现,现在汽车界也开始流行智能化了?没错,就是那个我们平时挂在嘴边的安卓车机通用系统。今天,...
安卓原生系统应用商店,一站式应... 你有没有发现,每次打开你的安卓手机,那个应用商店总是那么默默地陪在你身边?它就像一个贴心的助手,帮你...
安卓系统怎么样安装wd系统,安... 你有没有想过给你的安卓手机来个“变身”大改造?没错,就是将安卓系统升级为WD系统!听起来是不是有点酷...
安卓系统升级速度,从快速迭代到... 你有没有发现,每次打开手机,安卓系统总在默默地进行升级?这就像是我们的小助手,时不时地给自己充充电,...
安卓苹果系统流畅性,系统流畅性... 你有没有发现,现在手机的世界里,安卓和苹果两大巨头就像是在赛跑,你追我赶,谁都不愿意落后。今天,咱们...
浩顺收银系统下载安卓,助力商家... 你有没有想过,在繁忙的商场里,那些收银员是如何快速而准确地完成每一笔交易的?这其中,浩顺收银系统可是...
安卓系统怎么降级吗,轻松实现系... 你有没有发现,手机用久了,系统更新换代的速度简直比兔子还快!这不,你的安卓手机可能也跟着潮流升级到了...
安卓系统外接鼠标设置吗,轻松实... 你有没有想过,给你的安卓手机或者平板电脑配上一个鼠标,让它瞬间变身成一台迷你电脑呢?这听起来是不是很...
微信拼三张房卡哪里有卖/狂飙大... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...