网络编程ssh,粘包
1.什么是socket?
TCP,可靠地,面向连接协议,有阻塞rect
udp,不可靠的,无线连接的服务 这里因为不需要阻塞,所以速度会很快,但安全性不高
2.关于客户端退出而服务器未退出的解决办法
import socket
sock=socket.socket() # TCP协议
IP_PORT=("127.0.0.1",8899)
sock.bind(IP_PORT)
sock.listen(5)
while 1:
conn,addr=sock.accept()
while 1:
try:#这里是因为如果当客户端完成登陆后,由于客户端的退出,而
#服务端只是刚刚退出第一层循环,还在等着接收客户端传来的信息,所以
#会报错 只需要加一个异常处理,如果客户端离开则不会等待客户传来信息
#会处于待命状态,等待下一次传入
data=conn.recv(1024).decode("utf8")
print("接收信息:",data)
print("接收信息:",type(data))
print("-----",data.split("|"))
user,pwd=data.strip().split("|")
# 文件操作
flag=False
with open("account","r") as f: for line in f:
print("===",line.strip().split(":"))
username,password=line.strip().split(":")
if username==user and password==pwd:
flag=True
break
if flag:
conn.send(b"success")
else:
conn.send(b"fail")
except Exception as e:
break
客户端
import socket sock=socket.socket() # TCP
sock.connect(("127.0.0.1",8899)) while 1:
user=input("用户名>>>>")
pwd=input("密码>>>>")
val=("%s|%s"%(user,pwd)).encode("utf8")
sock.send(val)
response=sock.recv(1024)
print(response.decode("utf8"))
if response.decode("utf8")=="success":
break
else:
print("用户名或者密码错误!")
continue
3.模拟ssh
import struct #打包
res=struct.pack("i","")#这里可以放数字 print(res)#最终显示的是4个字节
print(len(res))#始终四个字节.长度为4 obj=struct.unpack("i",res)#用于解包,最后显示元祖,后面一逗号结尾
print(obj[0])#获取解包后的数字
#struct模块主要用于当发生粘包时.由于向客户端/服务端发送两个
#字节时,计算机无法判断前后位置,所以又来区分因为打包后固定长度为4
#所以取前四段
b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
#就可以区分了
#当然也可以用时间(睡眠)来区分
import subprocess#可以使cmd之间的程序在python中显示
res=subprocess.Popen("dir",#进行命令
shell=True,
stderr=subprocess.PIPE,#终端错误输出stderr
stdout=subprocess.PIPE)# 终端输出stdout
print(res.stdout.read().decode("gbk"))##返回的字节所以用gbk
#可以实现将cmd中的命令显示在python
import socket
import subprocess
server = socket.socket()
server.bind(('127.0.0.1',8008))
server.listen(5)
while True:
print("server is working.....")
conn,addr = server.accept()
# 字节类型
while True:
# 针对window系统
try:
cmd = conn.recv(1024).decode("utf8") # 阻塞#客户端传入的命令需要解码显示成字符串的形式 if cmd == b'exit':
break
# res=subprocess.Popen(cmd,#subprocess模块
# shell=True,
# stderr=subprocess.PIPE,
# stdout=subprocess.PIPE,
# )
# print("stdout",res.stdout.read())
# print("stderr",res.stderr.read().decode("gbk"))
out=res.stdout.read()#终端输出 显示的是使用命令的正确
err=res.stderr.read()#终端错误 显示的是不是系统命令的报错提示 print("out响应长度",len(out))#知道长度才可以使他们逐一实现
print("err响应长度",len(err))
if err:
import struct
header_pack = struct.pack("i", len(err))#首先一定要给出长度,客户端才会跟据长度
#来显示
conn.send(header_pack)
conn.send(err)
else:#没阻塞一次就发过去了
#构建报头
import struct#构建
header_pack=struct.pack("i",len(out))#数字的长度压缩完成报头
print("header_pack",header_pack)
# # 发送报头#将报文连在一起发送
conn.send(str(len(out)).encode("utf8"))#把数字转换成字符串,再转化成字节才可以发过去
# 发送数据
conn.send(out)#整体的数据 except Exception as e:
break
conn.close()
客户端
sk.connect(('127.0.0.1',8008))
while 1:
cmd = input("请输入命令:")
sk.send(cmd.encode('utf-8')) # 字节
if cmd=="":
continue
if cmd == 'exit':
break
header_pack=sk.recv(4)#取前四个字节
data_length=struct.unpack("i",header_pack)[0]#解包
print("data_length",data_length)
'''
b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
'''
data_length=int(sk.recv(1024).de- code("utf8"))
print("data_length",data_length)
recv_data_length=0#判断是否小于接收到的字节
recv_data=b""
while recv_data_length<data_length:
data=sk.recv(1024)
recv_data_length+=len(data)#接收多少就是这个
#实现的前提需要总长度,
recv_data+=data
print(recv_data.decode("gbk"))
sk.close()
3.关于粘包
粘包:发送长度和数据但是计算机不知道怎么去区分 两个send计算机不知道怎么区分
我们丢的东西没有丢
1.间隔短 2.文件不大3.
sleep 不让粘包
关于加密
import hashlib # md5=hashlib.md5()
# md5.update(b"hello")#当分别输入hello 和 yaun时 结果与helloyuan
#一样,但是这样的好处是可以分开存储节省内存,要是一次写入那么多
#会疯的
# md5.update(b"yuan")
#
# print(md5.hexdigest())
# print(len(md5.hexdigest())) #helloyuan: d843cc930aa76f7799bba1780f578439
# d843cc930aa76f7799bba1780f578439 #############################################
md5=hashlib.md5() with open("ssh_client.py","rb") as f:
for line in f:
md5.update(line) print(md5.hexdigest()) # f.read() 16位字节
网络编程ssh,粘包的更多相关文章
- Python之路 - 网络编程之粘包
Python之路 - 网络编程之粘包 粘包
- UNIX网络编程——Socket粘包问题
一.两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易 ...
- Learning-Python【29】:网络编程之粘包
粘包问题 上一篇博客遗留了一个问题,在接收的最大字节数设置为 1024 时,当接收的结果大于1024,再执行下一条命令时还是会返回上一条命令未执行完成的结果.这就是粘包问题. 因为TCP协议又叫流式协 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- python socket网络编程之粘包问题详解
一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...
- Python网络编程,粘包、分包问题的解决
tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...
- day32 网络编程之粘包问题
1.最大半连接数 什么是最大半连接数 半连接:在进行TCP协议通信时,客户端与服务器端进行三次握手建立连接,但是有时客户端与服务器端进行了连接申请,服务器端也同意了申请(既已经完成三次握手的两次),此 ...
- Python全栈-网络编程-TCP粘包
一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...
- python网络编程-socket“粘包”(小数据发送问题)
一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...
随机推荐
- Oracle 双机热备+双机冷备+负载均衡
引用地址:https://wenku.baidu.com/view/7cca62f1ddccda38366baf7f.html SQL Server 2008 R2双机热备 引用地址:https:// ...
- itestpdf
itestpdf jar pdf
- linux学习(二)linux系统的安装
Linux 安装 本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用,参考各大云服务器比较. 本章节以 ce ...
- Pwn-level3(x64)
题目地址 https://dn.jarvisoj.com/challengefiles/level3_x64.rar.8c74c402b190ac3fbef5a9ae540c40de 跟level3差 ...
- 9.29 csp-s模拟测试55 联+赛+题
T1 联 $n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同 ...
- 'GL_EXT_shader_framebuffer_fetch' : extension is not supported
在使用安卓模拟器加载Flutter应用时, 提示'GL_EXT_shader_framebuffer_fetch' : extension is not supported: D/skia (1404 ...
- 小米笔记本pro 黑苹果系统无法进入系统,频繁重启故障解决记录
问题1:频繁重启,然后clover丢失 表现情况:开机没有选择macos 或windos的界面 解决办法:进入windows使用工具easyefi,直接添加一个clover start boot,选择 ...
- LeetCode 142:环形链表 II Linked List Cycle II
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...
- Python中的passed by assignment与.NET中的passing by reference、passing by value
Python文档中有一段话: Remember that arguments are passed by assignment in Python. Since assignment just cre ...
- 基于Task定时检测网络本地网络状况
首先我们需要使用winInet.dll中的InternetGetConnectedState方法来检测本地是否连接网络,然后再通过ping的方式来获取网络状况. 然后我们采用Task来开辟一个线程来定 ...