"\ n"으로 끝나는 보장 된 메시지가 수신 될 때마다 클라이언트에 응답하는 TCP 서버를 작성하려고합니다. 나는 그것이 새로운 줄인지 알기 위해 각 개별 문자를 보는 것처럼 보인 this one과 같은 다른 게시물을 보았지만 이것은 버퍼로 데이터를 읽는 목적을 무력화시키는 것처럼 보입니다. 이것을 달성하기위한 더 좋은 방법이 있습니까?C 소켓에서 개행 문자까지 읽음
0
A
답변
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()으로 더 큰 버퍼를 동적으로 할당하거나 링크 된 목록 등을 사용하여 필요에 따라 증가 할 수있는 일종의 데이터 구조를 찾아야합니다.
관련 문제
- 1. Java 소켓에서 바이트를 읽음 C#
- 2. 파이썬이 텔넷에서 null 문자까지 읽음
- 3. 소켓에서 한 줄씩 읽음
- 4. 개행 문자까지 공백을 사용하여 cin을 읽는 방법?
- 5. vxworks의 ftp 소켓에서 읽음
- 6. Perl이 첫 문자가없는 소켓에서 읽음
- 7. n 초 동안 소켓에서 읽음
- 8. 델파이에서 소켓에서 개행 문자 읽기
- 9. 비동기 소켓에서 데이터를 최적으로 읽음
- 10. Qt의 소켓에서 모든 데이터를 읽음
- 11. 파이썬 네트워크 소켓에서 바이트를 읽음
- 12. 이진 모드에서 읽음 개행 문자를 해석합니다.
- 13. node.js의 소켓에서 처음 N 바이트 만 읽음
- 14. 개행 및 옵션에서 PHP 파일로 읽음
- 15. 소켓에서 계속 데이터를 받고 선택한 데이터를 읽음
- 16. c select() null 문자까지 읽습니다.
- 17. 소켓에서 리틀 엔디안 바이트 순서로 부호없는 정수를 읽음
- 18. Vim의 문자까지 뒤로 삭제
- 19. 네트워크 소켓에서 C# BinaryReader.ReadString
- 20. 소켓에서 읽기 C HTTP
- 21. C 소켓에서 "select"
- 22. 새 소켓에서 C++ CreateIoCompletionPort
- 23. 파이썬 asyncore로 소켓에서 고정 된 바이트 양을 읽음
- 24. 부스트 Asio : 동일한 소켓에서 async_read가 보류 중일 때 sync를 읽음
- 25. 버퍼에서 읽음 C
- 26. C# Word 문서에서 읽음
- 27. C++ 파일을 잘못 읽음
- 28. C 파일 끝까지 읽음
- 29. C++ 파일에서 읽음
- 30. 하스켈 Attoparsec에서 탭 또는 개행 문자까지 takeTill을 어떻게 사용합니까? (부울 표현식의 문제점)
왜 나는 데이터를 버퍼로 읽어들이는 목적을 상실했는지 알지 못합니다. 프로토콜이 줄의 길이를 앞지르지 않으면 한 번에 한 글자 씩 읽거나 첫 줄 바꿈 이상으로 읽고 두 번째 메시지의 일부를 읽을 위험이 있습니다. –
두 번째 생각에 fscanf를 사용하여 "\ n"으로 끝나는 문자열을 읽을 수 있습니까? 소켓으로 작동합니까? –
어떻게 하시겠습니까? 문자열 변수의 선언은 무엇입니까 (또는 어떻게 동적으로 할당합니까?) 그리고 사용하려는'fscanf()'형식은 무엇입니까? (소켓 파일 기술자를 파일 스트림과 연결하기 위해 ['fdopen()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopen.html)을 사용할 계획이십니까? (''dprintf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/dprintf.html)과 유사한''dscanf() –