2013-03-13 2 views
5

제목에서 알 수 있듯이 연결 지향 소켓에 한 번에 쓸 수있는 바이트 수에는 제한이 있습니까? TCP 소켓에서 한 번에 몇 바이트를 쓸 수 있습니까?

내가 예를 들어, 1024 바이트의 버퍼를 보내려면

, 나는

write(tcp_socket, buffer, 1024); 

사용할 수 있습니다 아니면 각각의 바이트 낮은 양의 여러 write() 전화를 사용해야합니까?

+0

를 유지하는 것이 좋습니다 TCP의 [C++ 소켓 프로그래밍 최대 크기의 http://stackoverflow.com/a/12934115/1758762 – duDE

+0

가능한 중복의 중복/ip socket Buffer?] (0120-385-2400). –

답변

9

write()은 모든 바이트가 쓰여질 것을 보장하지 않으므로 write()을 여러 번 호출해야합니다. man write 가입일 :

, 예를 들면 기본 물리적 매체 상에 공간이 부족한 경우, 또는 RLIMIT_FSIZE 자원의 한계가 발생하면 카운트보다 작을 수있다 기록 된 바이트 수 (setrlimit에서 (2) 참조) , 또는 count 바이트보다 작게 쓰여진 후 시그널 핸들러에 의해 호출이 인터럽트되었다.

write()buffer 기입 바이트의 누계를 유지하고 지표로 사용되어야하므로 기록 된 바이트 수를 반환한다 ((도 7). 또한 파이프 참조), 나머지 바이트의 수를 계산하도록 서면 :

ssize_t total_bytes_written = 0; 
while (total_bytes_written != 1024) 
{ 
    assert(total_bytes_written < 1024); 
    ssize_t bytes_written = write(tcp_socket, 
            &buffer[total_bytes_written], 
            1024 - total_bytes_written); 
    if (bytes_written == -1) 
    { 
     /* Report failure and exit. */ 
     break; 
    } 
    total_bytes_written += bytes_written; 
} 
+0

그래서 처음에는'size'를 사용할 수 있습니다. 그런 다음 반환 값을 확인해야합니다. 맞아? – JustTrying

+1

@JustTrying, 예제 코드로 업데이트되었습니다. – hmjd

+1

왜 그 곳에 assert()를 넣었습니까? 그 조건을 어떻게 칠 수 있습니까? – Mike

-1

사용자가 볼 수 있듯이 write socket의 최대 버퍼 크기는 1048576 바이트입니다.

+0

아니요. 소스를 다시 읽으십시오. 이것이 IBM z/TPF의 * 소켓 전송 버퍼 크기 *입니다. 하나의'send()'또는'write()'에서 보낼 수있는 데이터의 최대량이 아닌 * 길이이며, 길이를 지정하는'int'의 최대 값에 의해서만 제한됩니다. – EJP

0

고유 한 제한이 없습니다. TCP/IP는 필요에 따라 패킷을 분할하고 재구성합니다. 시스템은 (조정할 수있는) 상한을 부과 할 수 있지만 다중 MB 범위에있을 가능성이 있습니다. setsockopt()에 대한 맨 페이지를보고 항상 write()의 반환 값을 확인하십시오.

0

작성할 수있는 실제 금액은 소켓 유형에 따라 다릅니다. 일반적으로 실제로 작성된 바이트 수를 확인하려면 반환 값을 확인해야합니다. 기록되는 바이트 수는 소켓이 블로킹 모드에 있는지 여부에 따라 달라질 수 있습니다.

또한 소켓이 차단되면 모든 데이터가 한 번에 기록 될 때까지 기다리지 않을 수 있습니다. 쓰기 작업 사이에 다른 것을 사용할 수 있으려면 한 번에 몇 개씩 쓸 수 있습니다. 내 경험에서

0

, 1024 바이트 제한 어쩌면

관련 문제