제목에서 알 수 있듯이 연결 지향 소켓에 한 번에 쓸 수있는 바이트 수에는 제한이 있습니까? TCP 소켓에서 한 번에 몇 바이트를 쓸 수 있습니까?
내가 예를 들어, 1024 바이트의 버퍼를 보내려면
, 나는write(tcp_socket, buffer, 1024);
사용할 수 있습니다 아니면 각각의 바이트 낮은 양의 여러 write()
전화를 사용해야합니까?
제목에서 알 수 있듯이 연결 지향 소켓에 한 번에 쓸 수있는 바이트 수에는 제한이 있습니까? TCP 소켓에서 한 번에 몇 바이트를 쓸 수 있습니까?
내가 예를 들어, 1024 바이트의 버퍼를 보내려면
, 나는write(tcp_socket, buffer, 1024);
사용할 수 있습니다 아니면 각각의 바이트 낮은 양의 여러 write()
전화를 사용해야합니까?
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;
}
그래서 처음에는'size'를 사용할 수 있습니다. 그런 다음 반환 값을 확인해야합니다. 맞아? – JustTrying
@JustTrying, 예제 코드로 업데이트되었습니다. – hmjd
왜 그 곳에 assert()를 넣었습니까? 그 조건을 어떻게 칠 수 있습니까? – Mike
사용자가 볼 수 있듯이 write socket의 최대 버퍼 크기는 1048576 바이트입니다.
아니요. 소스를 다시 읽으십시오. 이것이 IBM z/TPF의 * 소켓 전송 버퍼 크기 *입니다. 하나의'send()'또는'write()'에서 보낼 수있는 데이터의 최대량이 아닌 * 길이이며, 길이를 지정하는'int'의 최대 값에 의해서만 제한됩니다. – EJP
고유 한 제한이 없습니다. TCP/IP는 필요에 따라 패킷을 분할하고 재구성합니다. 시스템은 (조정할 수있는) 상한을 부과 할 수 있지만 다중 MB 범위에있을 가능성이 있습니다. setsockopt()에 대한 맨 페이지를보고 항상 write()의 반환 값을 확인하십시오.
작성할 수있는 실제 금액은 소켓 유형에 따라 다릅니다. 일반적으로 실제로 작성된 바이트 수를 확인하려면 반환 값을 확인해야합니다. 기록되는 바이트 수는 소켓이 블로킹 모드에 있는지 여부에 따라 달라질 수 있습니다.
또한 소켓이 차단되면 모든 데이터가 한 번에 기록 될 때까지 기다리지 않을 수 있습니다. 쓰기 작업 사이에 다른 것을 사용할 수 있으려면 한 번에 몇 개씩 쓸 수 있습니다. 내 경험에서
, 1024 바이트 제한 어쩌면
를 유지하는 것이 좋습니다 TCP의 [C++ 소켓 프로그래밍 최대 크기의 http://stackoverflow.com/a/12934115/1758762 – duDE
가능한 중복의 중복/ip socket Buffer?] (0120-385-2400). –