2011-11-06 88 views
1

我通過TCP在python中發送緊急數據時遇到問題。Python - 發送緊急數據(tcp)

我已經研究了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) 

OK,收到數據。

但我怎麼能指出,當我發送週期數據時,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() 

如果客戶試圖用 '數據= conn.recv(BUFFER_SIZE,MSG_OOB)' 接收所有的數據 - 沒有什麼作品。 我還沒有找到任何方式來使用SELECT或像SIGURG一樣解決問題。

+1

以防萬一你不知道,TCP OOB數據被稱爲是不可靠的,破碎和不兼容的實現不同的操作系統。這就是爲什麼沒有人使用它,反過來這就是爲什麼沒有人關心修復它。 – rodrigo

回答

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)