2015-01-30 3 views
0

"\ n"으로 끝나는 보장 된 메시지가 수신 될 때마다 클라이언트에 응답하는 TCP 서버를 작성하려고합니다. 나는 그것이 새로운 줄인지 알기 위해 각 개별 문자를 보는 것처럼 보인 this one과 같은 다른 게시물을 보았지만 이것은 버퍼로 데이터를 읽는 목적을 무력화시키는 것처럼 보입니다. 이것을 달성하기위한 더 좋은 방법이 있습니까?C 소켓에서 개행 문자까지 읽음

+0

왜 나는 데이터를 버퍼로 읽어들이는 목적을 상실했는지 알지 못합니다. 프로토콜이 줄의 길이를 앞지르지 않으면 한 번에 한 글자 씩 읽거나 첫 줄 바꿈 이상으로 읽고 두 번째 메시지의 일부를 읽을 위험이 있습니다. –

+0

두 번째 생각에 fscanf를 사용하여 "\ n"으로 끝나는 문자열을 읽을 수 있습니까? 소켓으로 작동합니까? –

+0

어떻게 하시겠습니까? 문자열 변수의 선언은 무엇입니까 (또는 어떻게 동적으로 할당합니까?) 그리고 사용하려는'fscanf()'형식은 무엇입니까? (소켓 파일 기술자를 파일 스트림과 연결하기 위해 ['fdopen()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopen.html)을 사용할 계획이십니까? (''dprintf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/dprintf.html)과 유사한''dscanf() –

답변

1

그것을 할 수있는 다른 방법은 처리 할 수있는 자신을 버퍼링하는 것은, 예를 들면 :

std::string nextCommand; 

while(1) 
{ 
    char buf[1024]; 
    int numBytesRead = recv(mySocket, buf, sizeof(buf), 0); 
    if (numBytesRead > 0) 
    { 
     for (int i=0; i<numBytesRead; i++) 
     { 
     char c = buf[i]; 
     if (c == '\n') 
     { 
      if (nextCommand.length() > 0) 
      { 
       printf("Next command is [%s]\n", nextCommand.c_str()); 
       nextCommand = ""; 
      } 
     } 
     else nextCommand += c; 
     } 
    } 
    else 
    { 
     printf("Socket closed or socket error!\n"); 
     break; 
    } 
} 

(내 예제 ​​코드의 데이터를 보유하기 위해 C++ 표준 : : 문자열을 사용하고 단순함에 대한 것을 참고; C를 사용하고 있기 때문에 들어오는 문자열을 저장하는 다른 방법을 찾아야합니다. 최대 명령 길이를 보장 할 수있는 경우 고정 크기 char 배열과 카운터 변수를 사용할 수 있습니다. 무제한의 명령 크기를 처리하면, realloc()으로 더 큰 버퍼를 동적으로 할당하거나 링크 된 목록 등을 사용하여 필요에 따라 증가 할 수있는 일종의 데이터 구조를 찾아야합니다.

관련 문제