2012-09-17 3 views
0

나는 Erlang에서 gen_tcp를 사용하여 소켓을 통해 전송 된 데이터를 단일 스트림으로 집계 할 수 있다는 것을 읽었습니다. 소켓이 정확하게 특정 바이트 수를 전송하도록하려면 어떻게해야합니까?소켓을 통해 정확한 바이트 수를 보냅니다.

+1

해결하려는 문제가 명확하지 않습니다. 보낸 바이트 수는 항상 사용자가 지정한 수입니다. 당신이 보내달라고 요청하지 않은 바이트를 보내거나 보내달라고 요청한 바이트를 보내지 않습니다. –

+0

내가 잘못되었거나 실제로 또는 다른 보내기 작업을 단일 청크에서 집계 할 수 있습니까? {no_delay, false}는 표준 동작이어야합니다. – user601836

+1

"단일 덩어리"란 무엇을 의미합니까? 단일 TCP 읽기 작업에서 얻는 데이터의 양을 의미하는 경우 임의적입니다. 이것은 TCP의 기본 속성이며 이에 대해 할 수있는 일이 없습니다. –

답변

5

TCP는 패킷 지향적 인 UDP와는 달리 스트림 프로토콜입니다. 수신 응용 프로그램이 사용 가능한 데이터가 클라이언트의 하나 또는 여러 개의 호출에서 온 것인지 여부를 알 수 없음을 의미합니다.

TCP 패킷에서 전송되는 바이트 수를 실제로 제어 할 수 없으면 여러 개의 send() 호출로 인해 하나의 TCP 패킷이 수신 될 수 있으며 하나의 send() 호출로 인해 여러 개의 TCP 패킷이 전송 될 수 있습니다. 이것은 OS TCP 스택에 의해 제어됩니다.

Erlang에서는 소켓 옵션 {packet, 1|2|4} ~ gen_tcp:connectgen_tcp:listen을 사용하여 TCP 데이터의 패킷 지향 처리를 만들 수 있습니다. 이렇게하면 각 send()에 1,2 바이트의 접두사가 삽입되고 수신 측에서는 (또한 erlang이고 동일한 {packet, N} 옵션을 사용함) 메시지가 조각난 방법에 관계없이 보낸 바이트 수가 수신 될 때까지 데이터를 읽습니다 TCP 패킷으로 변환합니다.

gen_tcp:recv을 호출하면 예상 된 바이트 수를 읽을 때까지 차단됩니다. 그리고 액티브 모드 소켓에서도 메시지는 예상 된 바이트 수와 함께 전송됩니다.

관련 문제