2011-08-04 2 views
0

TCP 소켓에서 데이터를 가져 오는 Linux에서 인터페이스를 작성하고 있습니다. 사용자는 수신 된 데이터가 저장된 버퍼를 제공합니다. 제공된 버퍼가 작 으면 오류 만 반환하려고합니다. 첫 번째 문제는 버퍼가 작아야하는지 확인하는 것입니다. recv() 함수는 버퍼에 실제로 기록 된 바이트 양을 반환합니다. recv() 맨 페이지에 명시된 MSG_TRUNC 플래그를 사용하면 여전히 동일한 결과를 반환합니다. 두 번째 문제는 여전히 소켓에 대기중인 데이터를 삭제하는 것입니다. 따라서 제공된 버퍼가 작다고 결정하면 소켓에 남아있는 모든 것을 지우고 싶습니다. 소켓을 다시 닫고 열거 나 아무것도 남지 않을 때까지 수신하는 것 외에는 다른 방법이 있습니까? 베스트 감사 매뉴얼 페이지에 설명 된대로소켓에 데이터가 남아 있는지 확인한 후 폐기하십시오.

토비

답변

1

는 MSG_TRUNC 패킷 소켓 (예를 들어, UDP) 그래서 당신은 스트림 기반하여 TCP 소켓에 대해 원하는대로이 작동하지 않습니다에만 유효합니다. 말 그대로 수백 가지의 게시물을 stackoverflow 및 기타 응용 프로그램 메시지 경계를 TCP에 보존하는 방법에 대해 설명합니다 (힌트 : 직접해야하며 TCP는 바이트 스트림 인터페이스이며 그렇지 않습니다). 그래서 여기에 세부 사항을 설명하지 않겠습니다. 그것이 당신이 TCP를 통해 원하는 것을 할 수있게 해주는 recv() 쪽의 어플리케이션 "메시지"또는 "패킷"이 얼마나 큰지 알 수있는 메커니즘이 필요하다. (또는 UDP로 전환해야한다) .

TCP의 경우 소켓을 "소모"해야 할 경우 데이터가 남아 있지 않을 때까지 읽는 것이 효과가 있지만 다시 위에서 설명한 메시지 경계를 고려하여 하나의 "메시지를 읽지 않아도됩니다 "다음으로 먹기 시작합니다. 다시 한 번 기억해 두어야 할 가장 중요한 점은 TCP가 바이트 스트림 인터페이스를 제공하고 응용 프로그램 수준의 패킷이나 메시지 개념을 반드시 보존하지 않는다는 것입니다.

+0

[tcp (7) 맨 페이지] (http://man7.org/linux/manage/man7/tcp.7.html)에 따르면 : "* 2.4 버전부터는 리눅스가' 'recv (2)'(및'recvmsg (2)')의'flags' 인수에서'MSG_TRUNC'를 호출합니다.이 플래그는 데이터의 수신 된 바이트를 호출자가 제공 한 버퍼로 되 돌리는 것이 아니라 버려지게합니다. 2.4.4,'MSG_TRUNC'는 또한 'MSG_OOB'와 함께 사용되어 대역 외 데이터를 수신 할 때이 효과를 갖는다. * " –