Python在发送时优化数据包。如何预防呢?

时间:2016-12-28 15:57:23

标签: python python-2.7 sockets tcp tcp-ip

我试图用python套接字一个接一个地发送3个数据包。 Python将其优化为一个或两个数据包。 我通过sleep命令阻止它,但它需要很长时间。 我想打开TCP urg标志,有人知道怎么做吗?

或者你有另一种情绪?

客户方:

import socket
from time import sleep

IP = '127.0.0.1'
PORT = 5081
BUFFER_SIZE = 1024


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))

s.send('1'*5)
#sleep( 1)
s.send('2'*5)
#sleep( 1)
s.send('3'*5)

s.close()

服务器端:

import socket

IP = '0.0.0.0'
PORT = 5081
BUFFER_SIZE = 1024


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, PORT))
s.listen(1)

connection, address = s.accept()
while 1:
    #Here I expected to get the 1nd value
    data1 = connection.recv(BUFFER_SIZE)
    #end of communication
    if not data1:
        break
    print 'data1', data1

    #Here I expected to get the 2nd value,but both inputs arrived here, 22222 and 33333
    data2  = connection.recv(BUFFER_SIZE)
    print 'data2', data2

    #Here I expected to get the 3nd value
    data3  = connection.recv(BUFFER_SIZE)
    print 'data3', data3

connection.close()

感谢 Avinoam

1 个答案:

答案 0 :(得分:4)

你甚至不应该尝试。 TCP是一种流协议,应该用作流协议(意味着单个字节序列)。即使您在 系统上使用localhost时设法保持数据包分离,如果您在不同主机之间使用它,或者只是在升级TCP / IP堆栈之后,它可能会中断。只要您的数据包通过代理或软件过滤器,就会发生任何事情。

在流上分隔不同对象的正确方法是使用编码对象发送方的上层协议并将其解码为客户端。一个例子是一个或两个字节(网络顺序,如果超过一个字节)的大小,后跟相关的字节。或者你可以想象一个带有命令,标题和数据的文本协议,或者[把你想要的任何东西]