Python - 发送紧急数据(tcp)

时间:2011-11-06 17:55:19

标签: python sockets tcp

我在通过TCP在python中发送紧急数据时遇到问题。

我已经研究过TCP头的结构和带外数据传输机制,但我仍然无法理解如何实现它。

简单服务器:

#default steps
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn,addr = s.accept()
...
#oob
conn.send('!',MSG_OOB)
...

简单客户:

...
data = conn.recv(BUFFER_SIZE,MSG_OOB)

好的,收到的数据。

但是,当我循环发送数据时,如何指示OOB信息已经到达客户端?

例如:

serverFile = open(serverPath, 'rb')
    while True:
        fileBytes = serverFile.read(1000)
        if not fileBytes: break;
        try:
            i += 1
            if i % 1000 == 0:
                print 'sending urgent..'
                conn.send('!',MSG_OOB)
            conn.send(fileBytes)
        except socket.error, (value, message):
            if conn:
                conn.close()
            serverFile.close()
            print 'Error while sending data : error code - ' + str(value) + '; message: ' + message
            exit(1)
    serverFile.close()

如果客户端尝试使用'data = conn.recv(BUFFER_SIZE,MSG_OOB)'接收所有数据 - 则无效。 我没有找到任何方法使用SELECT或smth像SIGURG来解决问题。

2 个答案:

答案 0 :(得分:1)

也许它会帮助某人(明显但不是特别有效的解决方案): 客户端:

#catching urgent data
    s.settimeout(2)
    try:
        data = s.recv(BUFFER_SIZE,MSG_OOB)
    except socket.error, value: #(value,message):
        #s.settimeout(5)
        data = None
    if data:
        print 'urgent ' + str(data)
    else:
        #recv usual data
        data = s.recv(BUFFER_SIZE)

答案 1 :(得分:0)

def handler(sig_num, frame):
    ....
signal.signal(signal.SIGURG, handler)
fcntl.fcntl(client.fileno(), fcntl.F_SETOWN, os.getpid())

这将有助于OOB数据引起注意。