当前位置: 首页 > news >正文

粘包,Telnet,SSH,Wireshark

一,粘包

        原因:tcp为流式套接字,数据与数据间没有边界,导致多次数据粘到一起。

        解决:

                1.规定一些数据间的间隔符,"\aa","\r\n";

                2.可以指定要发送对象的数据长度。

                3.自己将数据打包。

1.上传接收粘连

        1.用户端

        

#include <head.h>int connect_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (connect(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("connect_server fail");return fd;
}//./cli 127.0.0.1 50000 filename 
int main(int argc, const char *argv[])
{if (argc != 4){printf("usage: %s <ip> <port> <filename>\n",argv[0]);return -1;}int fd = connect_server(argv[1],argv[2]);if (fd < 0)return -1;int fd_s = open(argv[3],O_RDONLY);if (fd_s < 0)handle_error_ret("open fail");write(fd,argv[3],strlen(argv[3])+1);
//	write(fd,argv[3],strlen(argv[3]));char buf[100] = {0};int ret = 0;while (1){ret = read(fd_s,buf,sizeof(buf));if (ret == 0)break;write(fd,buf,ret);}close(fd_s);close(fd);return 0;
}

2.服务器

#include <head.h>int init_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("bind fail");if (listen(fd,5) < 0)handle_error_ret("listen fail");return fd;}//./ser 127.0.0.1 50000 
int main(int argc, const char *argv[])
{int ret = 0;if (argc != 3){printf("Usage: %s <ip> <port>\n",argv[0]);return -1;}int listenfd = init_server(argv[1],argv[2]);if (listenfd < 0)return -1;int connfd = 0;if ((connfd = accept(listenfd,NULL,NULL)) < 0)handle_error_ret("accept fail");//读文件名 char buf[100] = {0};ret = read(connfd,buf,sizeof(buf));printf("ret = %d buf = %s\n",ret, buf);int fd_d = open(buf,O_WRONLY|O_CREAT|O_TRUNC,0666);if (fd_d < 0)handle_error_ret("open fail");while (1){ret = read(connfd,buf,sizeof(buf));printf("ret = %d buf1 = %s \n",ret,buf);if (ret == 0)break;write(fd_d,buf,ret);}close(fd_d);close(connfd);return 0;
}

3.注意

服务器和客户端不能写在同级别文件夹中

2.解决粘连

1.客户端

#include <head.h>int connect_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (connect(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("connect_server fail");return fd;
}//./cli 127.0.0.1 50000 filename 
int main(int argc, const char *argv[])
{if (argc != 4){printf("usage: %s <ip> <port> <filename>\n",argv[0]);return -1;}int fd = connect_server(argv[1],argv[2]);if (fd < 0)return -1;int fd_s = open(argv[3],O_RDONLY);if (fd_s < 0)handle_error_ret("open fail");//write(fd,argv[3],strlen(argv[3])+1);write(fd,argv[3],strlen(argv[3]));//方式1 //sleep(1);//方式2 write(fd,"\r\n",2);char buf[100] = {0};int ret = 0;while (1){ret = read(fd_s,buf,sizeof(buf));if (ret == 0)break;write(fd,buf,ret);}close(fd_s);close(fd);return 0;
}

2.服务器

#include <head.h>int init_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("bind fail");if (listen(fd,5) < 0)handle_error_ret("listen fail");return fd;}//./ser 127.0.0.1 50000 
int main(int argc, const char *argv[])
{int ret = 0;if (argc != 3){printf("Usage: %s <ip> <port>\n",argv[0]);return -1;}int listenfd = init_server(argv[1],argv[2]);if (listenfd < 0)return -1;int connfd = 0;if ((connfd = accept(listenfd,NULL,NULL)) < 0)handle_error_ret("accept fail");//读文件名 char buf[100] = {0};FILE *fp = fdopen(connfd,"r");if (fp == NULL)handle_error_ret("fdopen fail");fgets(buf,sizeof(buf),fp);  //buf => 1.txt\r\nbuf[strlen(buf)-2] = '\0';//	ret = read(connfd,buf,sizeof(buf));
//	printf("ret = %d buf = %s\n",ret, buf);printf("buf = %s\n",buf);int fd_d = open(buf,O_WRONLY|O_CREAT|O_TRUNC,0666);if (fd_d < 0)handle_error_ret("open fail");while (1){//ret = read(connfd,buf,sizeof(buf));ret = fread(buf,1,sizeof(buf),fp);printf("ret = %d buf1 = %s \n",ret,buf);if (ret == 0)break;write(fd_d,buf,ret);}close(fd_d);close(connfd);return 0;
}

3.recv send函数(仅用于TCP中)

2.

1.recv 类似于read函数

用法

比read函数多一个参数,仅用于TCP中

2.send 类似于write函数

send recv函数最后一个参数即允许非阻塞操作。

二,telnet,SSH,wireshark

1.telent

1.在windows中

telent可以在windows上用cmd创建一个linux,需要在linux中用ifconfig查看ip地址即可

linux IP为 192.168.11.128

2.第三方软件

以他实例

选择Telnet,输入IP

2.SSH

功能与telnet类似,只是传输过程加密

3.wireshark 抓包工具 抓取网络上数据

1.抓取telnet

输入指令打开

红色输入蓝色输出

2.抓取SSH 

加密了

三次招手与四次挥手

3.wireshark中的命令

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Java和GeoTools的Shapefile矢量数据缩略图生成实践
  • STM32——GPS模块(GY-NEO-6M)
  • python使用ffmpeg将视频、音频合并合成(速度最快)
  • 最短路总结(dijkstra,floyd,bellman,spfa)
  • JavaWeb基础 -- Spring框架、IOC、AOP
  • Ubuntu 22.04中解决Could not load the Qt platform plugin “xcb“问题解决方法
  • 一条微博,让联想少卖16亿?
  • 软件测试用例的编写(六)
  • 嵌入式和单片机有什么区别?
  • 回归预测|基于灰狼GWO优化BP神经网络多输入多输出的数据回归预测Matlab程序GWO-BP 含预测新数据程序
  • RK3568开发笔记-buildroot系统scp拷贝文件报错dbclient no such file or directory
  • QT 目录
  • 学习node.js 七 http 模块
  • 回归分析系列19— 多项式回归进阶
  • Kubernetes 中如何对 etcd 进行备份和还原
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Consul Config 使用Git做版本控制的实现
  • Hibernate最全面试题
  • HTML-表单
  • js递归,无限分级树形折叠菜单
  • js面向对象
  • laravel5.5 视图共享数据
  • Lsb图片隐写
  • MySQL-事务管理(基础)
  • PHP变量
  • Redis的resp协议
  • Spring核心 Bean的高级装配
  • vue.js框架原理浅析
  • 产品三维模型在线预览
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊sentinel的DegradeSlot
  • 使用Gradle第一次构建Java程序
  • 异常机制详解
  • 因为阿里,他们成了“杭漂”
  • 正则与JS中的正则
  • 最简单的无缝轮播
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ‌JavaScript 数据类型转换
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (pytorch进阶之路)扩散概率模型
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .gitignore文件—git忽略文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .NET委托:一个关于C#的睡前故事
  • .Net中ListT 泛型转成DataTable、DataSet