2011-04-29 45 views
1

我有一個接收1024個字符或更少數據包中的信息的套接字。在那些數據包中,我有一些消息或其中的一部每條消息以2個字符結尾。消息重組/插座通信

當兩個包中存在郵件碎片時,會出現此問題。你推薦什麼算法來處理這種碎片? (我不想在這裏重新發明輪子,因爲我認爲這是一個無處不在的問題)。

實施例:

| 011 012 013 014 \ r \ r 021 022 023 | 024 \ r \ r 031 032 033 | 034 \ r \ r 041 042 043 044 \ r \ r |

| ... | - >包

XXX XXX ... \ r \ r - >消息

回答

4
buffer = '' 

# reading loop 
while True: 

    data = socket.recv(1024) 
    if not data: 
    break 

    # add the current data read by the socket to a temporary buffer 
    buffer += data 

    # search complete messages 
    messages = buffer.split('\r\r') 

    # we need at least 2 messages to continue 
    if len(messages) == 1: 
    continue 

    # seperator found, iterate across complete messages 
    for message in messages [:-1]: 
    # handle here the message 
    print message 

    # set the buffer with the last cutted message 
    buffer = messages [-1] 
+0

感謝,它的工作原理(有一些小的修改)。你能評論一下你的方法嗎(這是一種標準的做事方式,是否有任何未能處理的情況會導致這種情況發生,等等)?我認識到第一部分是處理類文件對象的標準方式。 – citn 2011-04-29 07:43:20

+0

「標準方式」,我真的不知道這一點,但這是我如何在很長一段時間內在Python和C做的:)(使用memmem或自定義算法來重建和分割)。 – tito 2011-04-29 07:46:22

+0

但主要思想保持不變:讀取數據並將其附加到臨時緩衝區,並使用該緩衝區來發現和處理消息。所有未處理的數據保留在緩衝區中。 – tito 2011-04-29 07:48:07