2012-08-20 3 views
2

나는 C++ 소켓 코드를 작성하고 있는데 도움이 필요하다! 내 프로그램에서 메시지의 크기를 알지 못한다면 파일의 일부 또는 자체 파일을 보낼 수 있습니다. 파일은 거대한 파일 일 수 있으므로 패킷의 최대 크기를 지정해야합니다. 최대치를 초과하면 그것을 하나 이상으로 나누어야합니까?C++ 소켓 프로그래밍을 사용하는 최대 TCP 패킷 크기

+0

미리 감사드립니다. – sana

+0

ZeroMQ를 살펴보십시오. 메시지 전달을 즐겁게 만듭니다. – Tibor

답변

9

그것은 때문에 TCP를 사용하는 경우 "패킷"와 "메시지"에 대해 생각하는 건설 결코 :

  • 네트워크 엔진은 최적의 세그먼트 크기를 결정하는 자신의 방법을 가지고
  • 세그먼트 크기는 차이가 없습니다합니다 응용 프로그램 코드에 : 수신 TPC는

당신은이 디자인 된 방식으로 TCP를보아야 수신 프로세스에 데이터를 전달하기 전에 세그먼트를 병합 무료입니다 : R eloyable 바이트 스트림 서비스. 그래서 충분히 커다란 블록을 작성하면 엔진과 무수히 많은 규칙이이를 처리 할 것입니다.

+0

내 응용 프로그램이 네트워크를 통해 세그먼트를 보내려고 할 때 간단히 크기에 상관없이 보낼 수 있습니다. 나는 데이터가 손실되지 않고 버퍼 값이 서버 측에서 완전히 수신된다는 것을 의미합니다. write (sockfd, buffer, strlen (buffer)); 그게 맞습니까? 고마워. 많이 .. – sana

+0

@sana 또한 쓰기 기능/메소드의 리턴 코드를 확인해야합니다. – cnicutar

+0

예, 반환 값에 대해 알고 있지만, 여기서 초점은 버퍼 크기입니다. :) – sana

2

문제는 다소 애매하지만 접근법은 보편적으로 보입니다. 송신기는 수신기가 예상해야하는 바이트 수를 표시해야합니다. 리시버는이 표시를보고 나서 많은 바이트를 수신 할 준비를해야합니다.

패킷 크기와 관련하여 일반적으로 응용 프로그램은 네트워크에서 바이트가 전달되는 방식에 대해 걱정하지 않지만 응용 프로그램은 sendrecv 시스템 호출을 너무 많이 호출하지 않도록 신경 쓸 수 있습니다. 효율성이 확장 성의 핵심 인 동시 서버에서 특히 중요합니다. 따라서 너무 많은 시스템 호출을하지 않을 정도로 큰 버퍼를 원하지만 데이터가 커널 버퍼로 유출되기를 기다리는 동안 너무 오래 블록하지 못하게하는 버퍼는 필요 없습니다. 일반적으로 send/recv 소켓 버퍼 크기를 맞추는 것으로 충분하지만 네트워크의 대역폭과 대기 시간, 수신기의 데이터 유출 속도 및 연결 당 허용 할 시간 간격에 따라 달라집니다 병행 중에 처리됩니다.