Solving the problem of sticky packet and subcontracting in TCP programming:
Ref: 52096465
Service side:
#!/bin/env python#-*-coding:utf-8-*-import socketimport timeimport structimport jsonimport socketimport sysclass SockP Ackbody (): Def __init__ (self, data_buffer = bytes (), header_size = 4): Self.data_buffer = Data_buffer s Elf.header_size = Header_size Self.header = None Self.body_size = 0 Self.body = none def packbody ( Self, sock): while True: ' One receive loop ' recv_pkg = SOCK.RECV (1024x768) if not recv_pkg and Len (self.data_buffer) = = 0: "Connect closed, and no data in buffer." return None Self.data_buffer + = recv_pkg If Len (Self.data_buffer) < self.header_size: The packet received is less than self.headersize, stating that the header did not accept the complete ' Continue Self.header = Struct.unpack ("!1i", self . data_buffer[:self.header_size]) self.body_size = self.header[0] #分包 If Len (self.data_buf FER) < Self.header_size + Self.body_size: "The packet received is less than self.header_size + Self.body_size, indicating that the entire packet did not accept the complete ' continue SE Lf.body = self.data_buffer[self.header_size:self.header_size + self.body_size] #粘包 self.data_buffer = Self.data_buffer[self.header_size + self.body_size:] return self.bodyif __name__ = = ' __main__ ': Sock_pkger = Sockpackbody () sock = Socket.socket (socket.af_inet, socket. Sock_stream) Sock.bind ((' 0.0.0.0 ', 6688)) Sock.listen (5) agent_sock, agent_addr = Sock.accept () n = 1 whi Le True: "one connection (session) loop" ' Recv_data = Sock_pkger. Packbody (Agent_sock) if not recv_data:agent_sock.close () break print Recv_data
Client:
Import socketimport timeimport structimport jsonimport sysreload (SYS) sys.setdefaultencoding (' utf-8 ') Serve_host = " localhost "server_port = 6688class Pkgbuildheader (object): Def __init__ (self, body_size,): Self.pack_header = St Ruct.pack ("!1i", body_size) if __name__ = = ' __main__ ': client = Socket.socket () client.connect (Serve_host, Server_po RT) # normal packet definition BODY = ' Link encap:ethernet HWaddr 00:0c:29:ef:84:a3 inet addr:192.168.31.140 bcast:192 .168.31.255 mask:255.255.255.0 Inet6 addr:fe80::20c:29ff:feef:84a3/64 scope:link up broadcast RUNNING Multicast mtu:1500 metric:1 RX packets:236844 errors:0 dropped:0 overruns:0 frame:0 TX packets:233949 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1076587 102.6 MiB TX bytes:41874253 (39.9 mib) "header = Pkgbuildheader (len)) sendData1 = Header.pack_h Eader + Body.encode () # sub-package data definition Header =Pkgbuildheader (len (body)) Senddata2_1 = Header.pack_header+body[:20].encode () senddata2_2 = Body[20:].encode () # Sticky packet data definition body1 = "Link encap:ethernet HWaddr 00:0c:29:ef:84:a3" header1 = Pkgbuildheader (len (body1)) Body2 = "RX b ytes:107658740 (102.6 MiB) TX bytes:41874253 (39.9 mib) "Header2 = Pkgbuildheader (len (body2)) sendData3 = HEADER1.P Ack_header+body1.encode () +header2.pack_header+body2.encode () # Normal packet client.send (SENDDATA1) Time.sleep (30) # Package Test Client.send (senddata2_1) time.sleep (1) client.send (senddata2_2) Time.sleep (3) # Sticky pack Test Client.send (Sen DDATA3) Time.sleep (3) Client.close ()
Python network programming, problem solving for sticky packs and subcontracting