基于TCP协议的网络通信

        TCP即传输控制协议,基于TCP协议的网络通信总是面向连接的,在通信过程中需要进行“三次握手,四次挥手”,这是众所周知的,所以这里不过多赘述。我们都知道TCP协议传输数据比较稳定,那么为什么稳定,通过本文的代码实现来一探究竟。

        首先来看一下基于TCP协议的网络通信模型:

服务器客户端
创建socket对象创建socket对象

准备通信地址

(端口号+本机IP地址)

准备通信地址

(服务器的公网IP)

绑定socket与通信地址——
设置监听和排队数量——
等待客户端连接连接服务器
分配新的socket对象+开辟新进程或线程——
接收请求发送请求
响应请求接收响应
关闭socket关闭socket

现在有了TCP网络通信模型,那我们按照模型来实现即可,服务器的代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>typedef struct sockaddr *SP;void server(int cli_fd)
{char buf[4096];size_t buf_size=sizeof(buf);while(1){//接收请求//int ret=read(cli_fd,buf,buf_size);int ret=recv(cli_fd,buf,buf_size,0);if(ret<=0||0==strcmp("quit",buf)){printf("客户端%d退出\n",cli_fd);break;}printf("from %d recv:%s bits:%d\n",cli_fd,buf,ret);//响应请求//把传过来的数据拼接":return"后送回给客户端strcat(buf,":return");ret=send(cli_fd,buf,strlen(buf)+1,0);//ret=write(cli_fd,buf,strlen(buf)+1);if(ret<=0){printf("客户端%d退出\n",cli_fd);break;}}//关闭close(cli_fd);exit(0);
}int main(int argc,const char* argv[])
{//创建socketint sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket");return -1;}//准备通信地址struct sockaddr_in addr={};addr.sin_family=AF_INET;addr.sin_port=htons(8866);addr.sin_addr.s_addr=inet_addr("192.168.110.12");socklen_t addrlen=sizeof(addr);//绑定if(bind(sockfd,(SP)&addr,addrlen)){perror("bind");return -1;}//监听if(listen(sockfd,5)){perror("listen");return -1;}while(1){//等待连接struct sockaddr_in src_addr={};int cli_fd=accept(sockfd,(SP)&src_addr,&addrlen);if(cli_fd<0){perror("accept");continue;}//创建进程服务if(0==fork()){server(cli_fd);}}return 0;
}

客户端的代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>typedef struct sockaddr *SP;int main(int argc,const char* argv[])
{//创建socketint cli_fd=socket(AF_INET,SOCK_STREAM,0);if(cli_fd<0){perror("socket");return -1;}//准备通信地址struct sockaddr_in addr={};addr.sin_family=AF_INET;addr.sin_port=htons(8889);addr.sin_addr.s_addr=inet_addr("192.168.110.2");socklen_t addrlen=sizeof(addr);//连接服务器if(connect(cli_fd,(SP)&addr,addrlen)){perror("connect");return -1;}char buf[4096];size_t buf_size=sizeof(buf);while(1){//发送请求printf(">>>>>");scanf("%s",buf);int ret=send(cli_fd,buf,strlen(buf)+1,0);//ret=write(cli_fd,buf,strlen(buf)+1);if(ret<=0){printf("服务器正在升级,请稍后重试\n");break;}if(0==strcmp("quit",buf)){printf("通信结束\n");break;}//接收请求//int ret=read(cli_fd,buf,buf_size);ret=recv(cli_fd,buf,buf_size,0);if(ret<=0){printf("服务器正在维护,请稍候重试\n");break;}printf("read:%s bits:%d\n",buf,ret);}return 0;
}

下面来运行测试一下双端的通信情况:

over

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149662.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

pip的安装和使用

pip的安装和使用 1、 pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。便于我们对Python的资源包进行管理。 2、注&#xff1a;pip 已内置于 Python 3.4 和 2.7 及以上版本&#xff0c;其他版本需另行安装。 3、在安…

RAG高级优化:一文看尽query的转换之路

准确地找到与用户查询最相关的信息是RAG系统成功的关键&#xff0c;如何帮助检索系统提升召回的效果是RAG系统研究的热门方向。本文将介绍三种query理解的方法&#xff0c;以增强检索增强生成(RAG)系统中的检索过程&#xff1a; 查询重写&#xff1a; 重新定义查询&#xff0c;…

[Python学习日记-29] 开发基础练习2——三级菜单与用户登录

[Python学习日记-29] 开发基础练习2——三级菜单与用户登录 简介 三级菜单 用户登录 简介 该练习使用了列表、字典、字符串等之前学到的数据类型&#xff0c;用于巩固实践之前学习的内容。 三级菜单 一、题目 数据结构&#xff1a; menu { 北京: { 海淀: { …

什么是unix中的fork函数?

一、前言 在本专栏之前的文档中已经介绍过unix进程环境相关的概念了&#xff0c;本文将开始介绍unix中一个进程如何创建出新进程&#xff0c;主要是通过fork函数来实现此功能。本文将包含如下内容&#xff1a; 1.fork函数简介 2.父进程与子进程的特征 3.如何使用fork创建新进程…

基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…

通俗讲解javascript的实例对象、原型对象和构造函数以及它们之间的关系

今天通俗讲解一下js的对象&#xff0c;因为要通俗&#xff0c;所以可能描述不甚准确。 在js中&#xff0c;想要创建一个对象&#xff0c;首先要写出构造函数&#xff08;跟其它的语言不太一样哦&#xff0c;其它语言一般都会先写一个class 类名&#xff09;。 构造函数写法如…

Transformer-LSTM网络的轴承寿命预测,保姆级教程终于来了!

概要 关于轴承寿命预测&#xff0c;网络上的文章、代码层出不穷&#xff0c;但是质量却是令人堪忧&#xff0c;有很多文章甚至存在误导嫌疑。本期代码是在小淘怒肝好几个夜晚整理出来的&#xff0c;本期代码可以帮你迅速掌握一个轴承寿命预测的全过程。 为了不误导我的读者朋…

YOLOv5独家改进:严重遮挡和重叠目标场景解决方案 | 一种新的自适应算法轻量级通道分割和变换(ALSS)模块,自适应特征提取优化策略

💡💡💡本文解决什么问题:红外检测场景存在严重遮挡和重叠目标时的局限性的问题点。 💡💡💡提出了一种新的自适应算法轻量级通道分割和变换(ALSS)模块。该模块采用自适应信道分裂策略优化特征提取,并集成信道变换机制增强信道间的信息交换。这改善了模糊特征的提…

【d48】【Java】【力扣】LCR 123. 图书整理 I

思路 方法1&#xff1a;放进list,将list倒置&#xff0c;利用stream&#xff0c;将list改为int类型 方法2&#xff1a;递归&#xff1a;递归通用思路&#xff1b;明确每一层做什么确定返回值确定什么地方接收下层的返回值 每一层&#xff1a;调用下层&#xff0c;然后把自己…

Oracle AI理论与实践,企业落地篇干货满满

最近也是看到了圈子里的一位DBA好友&#xff0c;领导安排的工作是让负责AI的落地&#xff0c;而且也作为他业绩考核的指标&#xff0c;作为1名15年的DBA老兵来说&#xff0c;让AI落地面临的困难重重。 AI已经逐渐侵入到实际的生活中&#xff0c;最近我也是参加了Oracle官方在中…

【py】计算字母出现次数 字典储存

代码 用于计算用户输入字符串中每个字母字符的出现频率&#xff1a; from collections import Counter def calculate_character_frequency(): # 获取用户输入的字符串 user_input input("请输入一个字符串&#xff1a;") # 将字符串转换为小写…

摄影社团管理系统

基于springbootvue实现的摄影社团管理系统 &#xff08;源码L文ppt&#xff09;4-075 第四章 系统概要设计 4.1系统设计原理 设计原理是指系统的设计来源&#xff0c;它将需求合理地分解为功能&#xff0c;并抽象地描述系统的模块和其下的功能。在功能模块化后&#xff…

DeiT(ICML2021):Data-efficient image Transformer,基于新型蒸馏且数据高效的ViT!

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

KDD2024 时序论文(Time Series)

1、Generative Pretrained Hierarchical Transformer for Time Series Forecasting paper: https://dl.acm.org/doi/abs/10.1145/3637528.3671855 code&#xff1a;GitHub - SiriZhang45/FRNet: Code Implementation of FRNet 2、Fredformer: Frequency Debiased Transforme…

一文教你分不清路由器、交换机、光猫的概念,协助你对路由模组选型

当谈论网络设备时&#xff0c;我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成部分&#xff0c;承担着连接、传输和管理数据的重要任务。在日常生活和工作中&#xff0c;我们几乎离不开它们的存在&#xff0c;无论是在家中上网、办公室内…

Java:日期操作

目录 1、生成20240605180212格式的时间2、Date类型转LocalDate类型3、LocalDate类型基本操作4、格式化日期格式5、String 与 LocalDateTime 之间的转换6、生成指定时间段内的时间列表 1、生成20240605180212格式的时间 String dateTime LocalDateTime.now().format(DateTimeF…

【成品论文】2024年华为杯研究生数学建模A题成品论文

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接获取群聊【2024华为杯研赛资料汇总】&#xff1a;https://qm.q…

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式&#xff08;State Pattern&#xff09; 1、什么时候使用状态模式 2、使用状态模式的…

力扣516-最长回文子序列(Java详细题解)

题目链接&#xff1a;力扣516-最长回文子序列 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每…