2012-01-31 1 views
0

Linux에서 Berkely SOCKET API를 사용하여 TCP 서버를 작성하는 중입니다. 이제 클라이언트는 일련의 사양을 가지고 있으며 클라이언트가 보내는 각 메시지는 해당 사양을 기반으로합니다. 즉, 클라이언트에서 보낸 메시지는 사양에 지정된 많은 구조체 중 하나에 해당합니다. 이제 시나리오는 서버가 클라이언트가 몇시에 보낼 메시지인지 알지 못한다는 것입니다. 메시지를 받으면 그 메시지가 무엇인지 알 수 있습니다. 클라이언트가 보낸 메시지에는 가변 길이가 있으므로 어떤 메시지를 얻는 지 미리 알 수 없습니다. 이 문제를 해결하기 위해 나는 다음과 같은 방법을 사용했다 : 나는 크기 4096의 기본 버퍼를 사용하는 것입니다recv() sys 호출을 올바르게 사용하는 방법

const char *buf[4096] = { 0 }; 
      if (recv (connected, buf, 4096, 0) == -1) 
      { 
       printf ("Error in recvng message\n"); 
       exit (-1); 
      } 

을 (클라이언트로부터 메시지가이 크기보다 클 수 없다). 그 버퍼에 수신 한 후 나중에 내가 메시지 유형을 확인하고 다음과 같이 대응 조치를 취할 :이 잘 작동하지만 난 그냥 적절한 방법 그것을 또는 수 뭔가가 확인하고 싶어

struct ofp_header *oph; 
oph=(struct ofp_header *)buf; 
switch (oph->type) 
{ 
case example_pkt: 
handle_example_pkt(); 
break; 
} 

이것보다 낫다. 모든 도움을 많이 주셨습니다.

감사합니다.

답변

5

TCP는 스트림 기반입니다. 즉, 메시지보다 큰 버퍼를 사용하면 다음 메시지의 일부를 수신 할 수도 있습니다.

즉, 메시지의 크기를 알고 다음 메시지에 추가 데이터를 통합해야합니다. 이렇게하려면 두 가지 방법이 있습니다.

  1. 메시지를 처음 몇 바이트로 보내도록 프로토콜을 수정하십시오. 먼저 크기를 읽은 다음 그 많은 바이트 만 읽으십시오.

  2. 각 메시지의 크기를 알고 있으므로 읽은 바이트 수를 기록하십시오. 버퍼의 첫 번째 메시지를 처리 ​​한 다음 버퍼의 나머지 바이트에서 해당 메시지의 크기를 뺍니다. A. 메시지 유형을 식별하기에 충분한 바이트가 남아 있지 않거나 B. 감지 된 유형의 메시지에 대해 충분한 바이트가없는 경우까지이 프로세스를 반복하십시오. 나머지 바이트를 저장하고 recv를 다시 호출하여 더 많은 데이터를 읽습니다.

+0

네, 이것이 제가 두려워하는 것입니다. 이 문제에 대한 해결책을 게시 할 수 있습니까? – Abdullah

+0

편집 된 답변을 참조하십시오. –

+0

감사합니다. 많이 감사합니다. 이제 무엇을 해야할지 명확합니다 :) 건배 :) – Abdullah

관련 문제