2011-04-29 4 views
1

정보가 1024 자 이하의 패킷으로 수신되는 소켓이 있습니다. 그 패킷들에서 나는 어떤 메시지들 또는 그 부분들. 각 메시지는 2 자로 끝납니다.메시지 리 어셈블리/소켓 통신

두 패키지에 메시지가 조각화되어있는 경우 문제가 발생합니다. 이 단편화를 처리하기 위해 어떤 알고리즘을 권장합니까? (나는 이것이 보편적 인 문제라고 생각하기 때문에 휠을 재발 명하려는 것은 아니다.)

예 :

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

| ... | -> 패킷

XXX XXX ... \ 연구 \ 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

+0

"표준 방법", 나는 그것에 대해 실제로 말할 수는 없지만, 이것은 파이썬과 C 언어로 오랫동안하고있다. (memmem 또는 custom algo를 사용하여 재구성 및 분할). – tito

+0

하지만 주요 아이디어는 동일하게 유지됩니다. 임시 버퍼에 데이터를 읽고 추가하고 해당 버퍼를 사용하여 메시지를 발견하고 처리합니다. 모든 처리되지 않은 데이터는 버퍼에 남아 있습니다. – tito