C에서 소켓을 통해 파일을 보내려고합니다. 그러나 서버에서 1000000 바이트 파일에 대해 64 바이트 패킷을 보내고 약 999902 바이트를 대상 파일.소켓을 통한 파일 전송, 바이트 수가 적은 최종 크기
while ((n = read(sd, buffer_in, BUFSIZE))) // BUFSIZE = 64
{
if(n<0)
{
printf("Fail.\n");
fclose(archivo);
return -1;
}
if(fwrite(buffer_in, n, 1, f) !=1)
{
printf("fwrite error.\n");
fclose(archivo);
return -1;
}
bytes+=n;
}
printf("We received %d bytes", bytes);
로컬 TCP/IP 소켓을 통해 사용하는 경우에는 작동하지만 저속 연결에서는 작동하지 않습니다. 디버깅을 통해 EOF 근처에 많은 64 바이트 청크와 30 바이트 청크가 있음을 알 수 있습니다. 모든 데이터 (> 1 바이트)를 사용할 수있을 때 호출이 반환되기 때문에 read()에서 더 적은 바이트를 얻을 수 있다는 것을 알고 있습니다. 그러나이 조건은 잠시 멈추지 말아야합니까? n == 0 일 때 반환해야합니다. 더 이상 데이터 (EOF)가 아닙니다.
당신의 도움을 위해 Thx.
(EDIT)는 다음과 같이 코드를 보내기
:
while (n=read(file_fd, buffer, BUFSIZE))
{
write (sdaccept, buffer, n)
}
나는 읽기()와() 쓰기 모두 N < BUFSIZE를 반환 할 수 있다는 것을 알고 있지만,해야하지 그 밖에이 루프 작업을 따라 ? 나는 n을 더하고 정확한 크기 인 1000000을 반환합니다.
(EDIT II) 10,673 바이트와 C 소스와 테스트
는 대상 파일의 처음 98 바이트를 결여 제외 손상없이 10,575 수신 !!!
약 999,902를? 아니면 정확히? – paxdiablo
이 코드에는 명백한 결함이 없습니다. 전송 코드도 함께 표시하십시오. – Alnitak
특히 이상한데, 64가 1000000으로 정확히 나뉘어 졌으므로 정확히 –