2011-08-01 6 views
2

정기적 인 간격 (매초)으로 TCP 소켓을 통해 메시지를 보내려고합니다. 때로는 전체 메시지가 전송되지 않거나 2 ~ 4 개의 메시지가 겹쳐서 전송됩니다. 반환 값이 0 또는 < 인 경우에 if 문을 사용할 수 있지만 사실이 아닙니다. send()의 정확한 반환 값을 확인하여 바이트가 더 적게 전송되었는지 확인하는 명백한 접근 방식을 시도했습니다. 그것은 단지 보내는 매개 변수에서 지정한 번호를 반환합니다 (전송할 때까지 블록을 보내면 의미가 있습니다), 적은 바이트를 보내더라도. "올바른 크기의 패킷이 전송 되었습니까? 아니요 - 무엇인가합니까?"라는 정확한 방법이 있습니까?일정한 간격으로 패킷을 보낼 때 패킷이 누적됩니다.

+0

문제는 수신 측이 아니라 송신 측에 있음을 어떻게 알 수 있습니까? 실제 답변을 원한다면 송수신 예제 코드를 모두 포함해야 할 것입니다. – antlersoft

+0

@antlersoft : 여기서는 코드가별로 중요하지 않습니다 ... 중요한 개념입니다. –

+0

그래, 이제 생각해 보면 수신 측의 바이트의 정확성을 검사하는 것이 더 합리적 일 것입니다. 그러나 동일한 절차가 읽기 측면에서 사용될 수 있다고 가정합니다. – Sterling

답변

3

TCP는 안정적인 바이트의 스트림을 제공하며 메시지 경계가 없습니다. 메시지의 길이를 알 필요가있는 경우 프로토콜에이 메시지를 작성해야합니다 (예 : 모든 메시지를 메시지 길이를 지정하는 2 바이트 헤더로 전송).

1

내가 맞다고 이해하는 경우 가끔은 두 개 이상의 패킷을 보내고 먼 끝에 수신됩니다.

이것은 TCP/IP의 특성입니다. 패킷이 확실하게 도착할 것이라는 점을 보장 할 수는 없습니다.

2

TCP와 같은 기능이 없습니다. 커널 내부 네트워크 스택에서 TCP 스트림을 패킷으로 분할하는 방법에 달려 있습니다. 귀하의 소켓에 TCP_NODELAY 옵션을 설정하여 Nagle algorithm을 비활성화 할 수 있다고 말한 것입니다. (일부 코드는 다음을 명확히 할 스트림, FILE 개체 또는 파일 기술자를)하지만 각 메시지를 작성 후 명시 적 flush 작업을 수행해야 할 수 있습니다 당신이 사용하고있는 플랫폼이나 사용하고있는 구문

+0

나는 그것을 시도했지만 실제로 아무 것도하지 않았다. 나중에 참조 할 수 있도록 지식을 주셔서 감사합니다. – Sterling

+0

TCP_NODELAY는 작은 응용 프로그램 쓰기 (telnet, rsh, ssh는 한 번에 한 문자 씩)로 대기 시간을 향상 시키지만 특정 패킷 화를 보장하지는 않습니다. –

1

확실하지 않음 커널을 강제합니다. 필자는 일반적으로 C 스타일의 파일 디스크립터를 사용하며, 디스크립터에 fflush을 호출하면 대용량의 파일을 즉시 내보낼 수 있습니다.

관련 문제