정기적 인 간격 (매초)으로 TCP 소켓을 통해 메시지를 보내려고합니다. 때로는 전체 메시지가 전송되지 않거나 2 ~ 4 개의 메시지가 겹쳐서 전송됩니다. 반환 값이 0 또는 < 인 경우에 if 문을 사용할 수 있지만 사실이 아닙니다. send()의 정확한 반환 값을 확인하여 바이트가 더 적게 전송되었는지 확인하는 명백한 접근 방식을 시도했습니다. 그것은 단지 보내는 매개 변수에서 지정한 번호를 반환합니다 (전송할 때까지 블록을 보내면 의미가 있습니다), 적은 바이트를 보내더라도. "올바른 크기의 패킷이 전송 되었습니까? 아니요 - 무엇인가합니까?"라는 정확한 방법이 있습니까?일정한 간격으로 패킷을 보낼 때 패킷이 누적됩니다.
답변
TCP는 안정적인 바이트의 스트림을 제공하며 메시지 경계가 없습니다. 메시지의 길이를 알 필요가있는 경우 프로토콜에이 메시지를 작성해야합니다 (예 : 모든 메시지를 메시지 길이를 지정하는 2 바이트 헤더로 전송).
내가 맞다고 이해하는 경우 가끔은 두 개 이상의 패킷을 보내고 먼 끝에 수신됩니다.
이것은 TCP/IP의 특성입니다. 패킷이 확실하게 도착할 것이라는 점을 보장 할 수는 없습니다.
TCP와 같은 기능이 없습니다. 커널 내부 네트워크 스택에서 TCP 스트림을 패킷으로 분할하는 방법에 달려 있습니다. 귀하의 소켓에 TCP_NODELAY
옵션을 설정하여 Nagle algorithm을 비활성화 할 수 있다고 말한 것입니다. (일부 코드는 다음을 명확히 할 스트림, FILE
개체 또는 파일 기술자를)하지만 각 메시지를 작성 후 명시 적 flush
작업을 수행해야 할 수 있습니다 당신이 사용하고있는 플랫폼이나 사용하고있는 구문
나는 그것을 시도했지만 실제로 아무 것도하지 않았다. 나중에 참조 할 수 있도록 지식을 주셔서 감사합니다. – Sterling
TCP_NODELAY는 작은 응용 프로그램 쓰기 (telnet, rsh, ssh는 한 번에 한 문자 씩)로 대기 시간을 향상 시키지만 특정 패킷 화를 보장하지는 않습니다. –
확실하지 않음 커널을 강제합니다. 필자는 일반적으로 C 스타일의 파일 디스크립터를 사용하며, 디스크립터에 fflush
을 호출하면 대용량의 파일을 즉시 내보낼 수 있습니다.
- 1. 일정한 간격으로 데이터베이스 연결
- 2. 패킷을 보낼 때 바이트 정렬
- 3. 셀렌이 일정한 간격으로 자동 연기 테스트를 수행합니다.
- 4. 일정한 간격으로 내 지점에서 트렁크를 업데이트하십시오.
- 5. 일정한 간격으로 애니메이션 광고 전환 admob
- 6. 가능한 한 일정한 간격으로 이벤트에서 항목 선택
- 7. 일정한 간격으로 플러시되는 버퍼링 된 스트림을 구현하는 표준 방법은 무엇입니까?
- 8. 패킷이 손실되었다고 가정하기 전에 패킷을 몇 번이나 재전송해야합니까?
- 9. 패킷이 제거됨 - 어떤 패킷이 삭제되었는지 찾으십니까?
- 10. Windows에서 일정한 간격으로 .NET 구성 요소를 실행하는 솔루션
- 11. 안드로이드에서 일정한 간격으로 활동의 배경 이미지를 변경하는 방법은 무엇입니까?
- 12. 일정한 간격으로 SQL 쿼리를 Excel 스프레드 시트에 자동으로보고하는 방법
- 13. Android : 일정한 간격으로 위치 잡기, Looper Prepare (예. 검색했습니다!)
- 14. 1500 바이트를 초과하는 UDP 패킷이 끊김
- 15. Win32 소켓 - 다른 로컬 인터페이스로 보낼 때 ip 패킷이 실제 인터페이스를 떠나도록하십시오.
- 16. HTTP 패킷을 결정
- 17. 패킷이 차단/차단되는 위치를 추적하십시오.
- 18. 입력시 UISearchDisplayController 메모리 누수가 누적됩니다.
- 19. 목적지의 IP 주소와 포트 번호를 알면 패킷을 보낼 수 있습니까?
- 20. 패킷을 보내고받는 간단한 방법?
- 21. 두 개의 Socket.BeginReceive 호출간에 TCP 패킷이 어떻게됩니까?
- 22. 모든 패킷이 클라이언트로 전송되지 않는 이유는 무엇입니까?
- 23. Winsock TCP 패킷이 전송되었지만 도달 호스트에 도달하지 않았습니다.
- 24. .NET 라이브러리가 RST 패킷을 닫을 때 보내는 것을 막는 방법
- 25. 어떻게 iptables에서 패킷을 reinject하려면?
- 26. 소켓을 닫기 직전에 데이터 패킷을 전송합니다.
- 27. recv가 pcaps 버퍼에서 패킷을 제거합니까?
- 28. 로컬 네트워크 외부로 패킷을 보낼 때 대상 MAC 주소를 어떻게 설정해야합니까?
- 29. 일정한 매트릭스
- 30. Linux에서 때때로 SYN 패킷이 끊깁니다.
문제는 수신 측이 아니라 송신 측에 있음을 어떻게 알 수 있습니까? 실제 답변을 원한다면 송수신 예제 코드를 모두 포함해야 할 것입니다. – antlersoft
@antlersoft : 여기서는 코드가별로 중요하지 않습니다 ... 중요한 개념입니다. –
그래, 이제 생각해 보면 수신 측의 바이트의 정확성을 검사하는 것이 더 합리적 일 것입니다. 그러나 동일한 절차가 읽기 측면에서 사용될 수 있다고 가정합니다. – Sterling