首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python Socket通信黏包问题分

(基于TCP协议传输) tcp协议的拆包机制 tcp面向流的通信是无消息保护边界的 tcp的Nagle优化算法:若连续几次需要send的数据都很少,通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去...服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 客户端套接字函数...s.getsockname() 当前套接字的地址 s.getsockopt() 返回指定套接字的参数 s.setsockopt() 设置指定套接字的参数 s.close()...关闭套接字 面向锁的套接字方法 s.setblocking() 设置套接字的阻塞与非阻塞模式 s.settimeout() 设置阻塞套接字操作的超时时间 s.gettimeout...() 得到阻塞套接字操作的超时时间 面向文件的套接字的函数 s.fileno() 套接字的文件描述符 s.makefile() 创建一个与该套接字相关的文件

55220

面向对象之套接字(socket)和黏包

一丶套接字(socket)   tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端   基于UDP协议的socket   server端: import socket udp_sk =...socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字...转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。...4字节的缓冲区,也就是说'ii'表示8个字节的缓冲   #格式符"i"表示转换为int,'ii'表示有两个int变量。   ...#进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节)   可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的0x00000014, 0x00001009

57020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】:传输层协议 UDP

    但是值得注意的是:在特定情况下是可以的 使用 SO_REUSEADDR 选项: 通过设置套接字选项 SO_REUSEADDR,多个进程可以绑定到同一个端口号。...不同协议: 不同协议的套接字可以绑定到同一个端口号。例如,TCP 和 UDP 可以同时使用同一个端口号。...解包:UDP 直接读取报文前 8 个字节(16 位源端口号)来进行解包 分用: UDP 根据16位端口号去 OS 中查找进程与这16位端口号关联的 从这就可以知道我们在 Socket编程应用层UDP...协议层也不会给应用层返回任何错误信息; 注意:这里的不可靠不一定是缺点,而是其特性,相比于 TCP 更可靠需要更多操作,这里 UDP 操作更简单 适用场景:实时应用、广播/多播,就是因为其更简单...如果我们需要传输的数据超过 64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装; 6.

    11110

    NIO之Channel通道(三)-DatagramChannel

    指定者:类SelectableChannel中的validOps 返回:有效操作集 1.3socket() 检索与此通道关联的数据报套接字。...该数据报被传输到给定的字节缓冲区中,并从缓冲区的当前位置开始存储,如同正规的read操作一样。如果缓冲区中的剩余字节空间小于保存数据报所需的空间,则丢弃余下的数据报。...参数: src-包含要发送的数据报的缓冲区 target-要将数据报发送到的地址 返回:发送的字节数,可能是调用此方法时源缓冲区中剩余的字节数,或者如果此通道处于非阻塞模式并且基础输出缓冲区中没有足够的空间供数据报使用...仅在此通道的套接字已连接时才调用此方法,并且此方法仅接受来自该套接字同位体的数据报。如果数据报中的字节数大于给定缓冲区中的剩余空间,则丢弃余下的数据报。...指定者:接口WritableByteChannel中的write 参数:src-要从中检索字节的缓冲区 返回:写入的字节数,可能为零 抛出: NotYetConnectedException-如果未连接此通道的套接字

    82820

    Python 抓取并解码原始数据包

    应用Python支持的混杂模式,抓取流经网卡的数据包,并对IP以及ICMP数据包进行拆包,打印出我们所需要的字段信息。...抓取原始数据包: Python中默认的Socket模块就可以实现对原始数据包的解包操作,如下代码....: return address address.close() # 开始跟踪原始数据包 def SnifferIOSock(address): # 创建原始套接字...,只不过这里我们需要找到完整的IP地址的包头封装格式,然后根据特定的包头格式对数据包进行解包操作即可. import socket import os import struct from ctypes...IP头相同,但需要注意,由于ICMP头在IP头的下方,所以我们需要先解析出IP头数据包,然后根据IP头中的protocol_num判断如果是ICMP则将其传入ICMP结构做进一步解包即可. import

    86040

    传输层:UDP协议

    UDP协议端格式 UDP协议端格式由报头和有效载荷组成,报文是固定占8个字节。 在UDP中,如果数据报的校验出现错误,那么会直接丢弃。...UDP的封装/解包,分用 在UDP协议的数据报中,封装便是添加固定的8位的报头,解包就是将报文和报头分开,分用就是将数据交付给目的端口号的特定的进程。...比如用UDP传输100个字节的数据: 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom,...因此,在UDP中,其套接字socket,既能读,又能写(sendto,recvfrom能够同时被调用),这叫做全双工。 UDP的注意事项 UDP协议首部中有一个16位的最大长度....也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).然而64K在当今的互联网环境下, 是一个非常小的数字.如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装

    35220

    18.1 Socket 原生套接字抓包

    要实现抓包前提是需要先选中绑定到那个网卡,如下InitAndSelectNetworkRawSocket函数则是实现绑定套接字到特定网卡的实现流程,在代码中首先初始化并使用gethostname函数获取到当前主机的主机名...,主机IP地址等基本信息,接着通过循环的方式将自身网卡信息追加到g_HostIp全局结构体内进行存储,通过使用一个交互式选择菜单让用户可以选中需要绑定的网卡名称,当用户选中后则下一步是绑定套接字,并通过调用...,当读者运行后会看到如下图所示的代码片段,此处笔者就选择三号网卡进行绑定操作,当绑定后此时套接字ID对应的则是特定的网卡,后续的操作均可针对此套接字ID进行,如下图所示; 当读者有了设置混杂模式的功能则下一步就是抓包了...192.168.9.125的所有数据,由于此处没有解码和区分数据包类型所以显示出的字符串并没有任何意义,如下图所示; 接下来我们就需要根据不同的数据包类型对这些数据进行解包操作,在解包之前我们需要先来定义几个关键的数据包结构体...,则实现对数据包的解析只需要判断数据包的类型并使用不同的结构体对数据包进行解包打印即可,如下是实现数据包解析的完整代码,在代码中分别实现了几个核心函数,其中printData函数可以实现对特定内存数据的十六进制格式输出方便检查输出效果

    42720

    18.1 Socket 原生套接字抓包

    要实现抓包前提是需要先选中绑定到那个网卡,如下InitAndSelectNetworkRawSocket函数则是实现绑定套接字到特定网卡的实现流程,在代码中首先初始化并使用gethostname函数获取到当前主机的主机名...,主机IP地址等基本信息,接着通过循环的方式将自身网卡信息追加到g_HostIp全局结构体内进行存储,通过使用一个交互式选择菜单让用户可以选中需要绑定的网卡名称,当用户选中后则下一步是绑定套接字,并通过调用...,当读者运行后会看到如下图所示的代码片段,此处笔者就选择三号网卡进行绑定操作,当绑定后此时套接字ID对应的则是特定的网卡,后续的操作均可针对此套接字ID进行,如下图所示;图片当读者有了设置混杂模式的功能则下一步就是抓包了...的所有数据,由于此处没有解码和区分数据包类型所以显示出的字符串并没有任何意义,如下图所示;图片接下来我们就需要根据不同的数据包类型对这些数据进行解包操作,在解包之前我们需要先来定义几个关键的数据包结构体...,则实现对数据包的解析只需要判断数据包的类型并使用不同的结构体对数据包进行解包打印即可,如下是实现数据包解析的完整代码,在代码中分别实现了几个核心函数,其中printData函数可以实现对特定内存数据的十六进制格式输出方便检查输出效果

    46740

    python-网络编程

    流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。...也可用read函数读取服务器发送来的数据   (8)服务器用read函数读取客户机发送来的数据,也可用write函数发送数据   (9)完成通信以后,用close函数关闭socket连接 二:python...() connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常 普通的套接字方法 s.recv() 接收 TCP 消息 s.recv_into...异常 error 套接字相关错误 herror① 主机和地址相关错误 gaierror① 地址相关错误 timeout 超时时间...) 将来自网络的整数转换为主机字节顺序 htonl()/htons() 将来自主机的整数转换为网络字节顺序 inet_aton()/inet_ntoa() 将 IP

    1.3K10

    CSAPP 网络编程 笔记

    /2018/04/28/Python%E7%BC%96%E5%86%99socks5%E6%9C%8D%E5%8A%A1%E5%99%A8 C:https://www.cayun.me/%E7%BD%91%...典型:多个描述字多路复用,比如交互式输入和网络套接字。 出现粘包如何处理? UDP与原始套接口 UDP协议中发送数据大于缓冲区大小,系统如何处理,说明理由。...UDP采用循环服务器的工作方式,它仅有的单个套接口用于接收所有到达的数据报,并发回所有的响应,UDP套接口有一个接收缓冲区用于存放到来的数据报。...何时完成 aio_read 给内核传递描述字、缓冲区指针、缓冲区大小、文件偏移,并告诉内核当操作完成时如何通知进程。...n = -1, errno == ECONNREST => 网络连接有问题 read 函数要求操作系统内核从套接字描述字 socketfd读取最多多少个字节(size),并将结果存储到 buffer

    57930

    linux内核 recvfrom,Linux系统调用– recvrecvfrom 函数详解

    recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。...MSG_ERRQUEUE:指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来,使用者应该提供足够大的缓冲区。...MSG_TRUNC:返回封包的实际长度,即使它比所提供的缓冲区更长, 只对packet套接字有效。 MSG_WAITALL:要求阻塞操作,直到请求得到完整的满足。...MSG_TRUNC:指明数据报尾部数据已被丢弃,因为它比所提供的缓冲区需要更多的空间。 MSG_CTRUNC:指明由于缓冲区空间不足,一些控制数据已被丢弃。...MSG_OOB:指示接收到out-of-band数据(即需要优先处理的数据)。 MSG_ERRQUEUE:指示除了来自套接字错误队列的错误外,没有接收到其它数据。

    2.8K10

    面向连接的c语言socket 程序流程(TCP)

    第一个参数是使用Socket字节的版本,高位字节指明副版本,低位字节指明主版本。...三. bind()--指定本地地址 当socket()创建了一个套接字后,需要将该套接字与该主机上提供服务的某个端口联系在一起, bind()函数用于完成这样的绑定。...16位端口号;         struct in_addr sin_addr;//是网络字节序的32位IP地址;         char       sin_zero[8];//一般不用,用0填充...} 四.服务器启动监听——listen()函数 在一个服务器用socket()调用成功创建了一个套接字,并用bind()函数和一个指定的地址关联后, 就需要指示该套接字进入监听连接请求状态,这需要通过...九.关闭套接字——closesocket()函数 本函数关闭一个套接口。更确切地说,它释放套接口描述字s,以后对s的访问均以WSAENOTSOCK错误返回。

    1.4K20

    网络编程协议(TCP和UDP协议,粘包问

    网络编程协议 1.osi七层模型 应用层  表示层  会话层  传输层  网络层  数据链路层  物理层 2.套接字 socket  有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议...shell=True,         stdout=subprocess.PIPE,  #正确结果的存放位置         stderr=subprocess.PIPE   #错误结果的存放位置  ...,但是双方有一个交互确认的过程 方案二: 使用Struct模块,在发送前,把文件的大小打包,做成报头,把报头放在文件真实内容之前;在接收时,对发送过来的文件进行解包,然后打印文件真实内容....打包:struct.pack(‘i’,长度) 解包:struct.unpack(‘i’,字节) socketserver模块实现并发   我们之前写的tcp协议的socket是不是一次只能和一个客户端通信...它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket。后面我们要写的FTP作业,需要用它来实现并发,也就是同时可以和多个客户端进行通信,多个人可以同时进行上传下载等。

    37220

    网络套件字(理论知识)

    另一套就是源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,因为在数据传输的过程中路由器不断在进行解包和重新封装。...它提供了可靠的数据传输和错误恢复机制,用于在网络中进行端到端的数据传输。  ...ssize_t send(int sockfd, const void *buf, size_t len, int flags); sockfd: 套接字描述符。 buf: 要发送的数据的缓冲区。...ssize_t recv(int sockfd, void *buf, size_t len, int flags); sockfd: 套接字描述符。 buf: 接收数据的缓冲区。...发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存; 因此,网络数据流的地址应这样规定:先发出的数据是低地址

    18710

    Python3快速入门(十)——Pyth

    Python3快速入门(十)——Python3网络编程 一、socket模块简介 Python 提供了两个级别访问的网络服务,低级别的网络服务支持基本的 Socket,提供了标准的BSD Sockets...参数size指定接收数据的缓冲区的大小,返回接收的数据。 socket.send(buf):发送TCP数据,将buf中的数据发送到连接的套接字。返回要发送的字节数量,可能小于buf的字节大小。...data,addr = socket.recvfrom(bufsize):从套接字接收数据,但返回(data,address)。data是接收数据的缓冲区,address是发送数据的套接字地址。...socket.sendto(data, (addr, port)):将数据data发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回发送的字节数。...使用UDP协议时,不需要建立连接,只需要知道对方的ip和port,就可以直接发数据包,但数据包能否到达是无法确定的。

    1.1K20

    WinSock学习笔记(一)

    ◆ 旧的网络地址结构的定义,为一个4字节的联合: struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct...level为套接字选项的级别,大多数是特定协议和套接字专有的。如IP协议应为 IPPROTO_IP。 optname为读取选项的名称 optval为存放选项值的缓冲区指针。...level为套接字选项的级别,用法同上。 optname为设置选项的名称 optval为存放选项值的缓冲区指针。...) { //错误处理 } 7、套接字发送数据:(服务器端和客户端) int send(SOCKET s, const char FAR * buf, int len, int flags ) s为服务器端监听的套接字...用法: char buf[]="xiaojin"; int nResult=send(s,buf,strlen(buf)); if(nResult==SOCKET_ERROR) { //错误处理 } 8

    1K70

    Python3之网络编程

    数据类型,6个字节 # data包含: (最短46字节,最长1500字节) # 数据包的具体内容 # head长度 + data长度 = 最短64字节,最长1518字节,超过限制就分片发送...而以太网数据包的”数据”部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了。...Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机的进程间可以通讯 类似于操作系统将复杂丑陋的控制计算机硬件的操作封装成统一简单的接口,只需要使用者学会如何操作系统就可以简单快速的操作计算机硬件...flag提供有关消息的其他信息,通常可以忽略。 s.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...这些I/O缓冲区特性可整理如下: 1.I/O缓冲区在每个TCP套接字中单独存在; 2.I/O缓冲区在创建套接字时自动生成; 3.即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 4.关闭套接字将丢失输入缓冲区中的数据

    1K40

    安全的数据库图形管理工具(2):三个问题

    我直接给出结论吧,可以被加密的字节长度与密钥的比特数呈线性正相关,我们有如下公式: ? 我上次设置的密钥比特数是256,最大长度也就是256/8-11=21。...,sock是一个套接字对象,这就是一个先加密后发送的过程,有些人会有一个问题,发送过去一定要让对方接收吧,不可能只发送不接收,既然发送需要分成一块一块的,我接收也应该是一块一块的,发送20个长度的字节序列...因为最后一块几乎不可能是20个字节长度,比如我有45个字节序列需要发送,两个20发完之后最后发一个5个字节的块。就在这个时候,我必须要求接收缓冲区只能接5个字节,如果多了就会出现问题。...TCP粘包 在上面我稍微提到了一个问题,假设我有45个字节序列需要发送,两个20发完之后最后发一个5个字节的块。就在这个时候,我必须要求接收缓冲区只能接5个字节,如果多了就会出现问题。...在python网络编程中,我一时半伙找不到清理套接字缓冲区的办法,只能sleep将就了。 一个简单的SSH远程控制终端 下面我通过编写一个简单的SSH远程控制终端来进行进一步测试,首先说一下设计思路。

    61820

    socket方式传输文件

    socket通信实现文件的传输,TCP传输方式,python版与C/C++版。...break # 关闭套接字【close】 tcp_client_socket.close() 上述程序修改搬运自:Python3使用TCP编写一个简易的文件下载器--Linux公社 ,服务器端添加了一段打印本机...另外,此程序在传输较小的文件(如几KB)时,程序中计算进度的语句会出现除数为0的错误,需要屏蔽传输进度相关语句或作某些修改。另一方面,进度的显示也比较耗时,去掉进度显示可以减小文件传输时间。...memset(buffer, 0, BUF_SIZE); //重置缓冲区 memset(sbuffer, 0, BUF_SIZE); } //关闭套接字...closesocket(sock); //关闭套接字【close】 } WSACleanup(); //终止使用 DLL return 0; } 运行效果与python版的类似

    3K10
    领券