아래 코드에 어떤 문제가 있습니다. 서버에서 파일을 수신하도록 설계되었습니다. 전송 후 서버 연결이 끊어지면 100 % 정상적으로 작동합니다.서버가 연결을 끊을 경우에만 파일 전송이 완료됩니다.
서버 연결이 끊어지지 않으면 전송이 클라이언트 측을 완료하지 않고 클라이언트는 바이트를 계속해서 보내고 fr_block_sz == 0 일 때 제대로 루프를 벗어나지 않습니다. 파일 수신 후 서버 연결이 끊어 질 때 수행됩니다. 그것은 끝없이 루프에 앉는다.
파일을 받고 나중에 연결을 유지하고 싶습니다. 어떤 충고? 감사.
EDIT : Casey의 조언 이제 아래 주석 코드를 통해 작성된 바이트 수를 모니터링하고 있지만 파일 전송이 제대로 완료되지 않는 이상한 동작이 나타납니다. 누구든지 내 코드에서 잘못된 일을 볼 수 있습니까? 감사.
편집 2 : 문제를 명확하게하려고 디버깅 정보를 게시했습니다.
// Reciever of file (client)
int TotalSize = 7374; // hardcoded file size to expect
int FileSize = 0; // counter
int fr_block_sz = 0;
while ((fr_block_sz = recv(sd, revbuf, 1, 0)) > 0) //LENGTH == 512
{
if (fr_block_sz < 0)
if (errno == EAGAIN)
continue;
else
printf("File write failed");
if (fr_block_sz == 0)
break; //done
// edit based on comment - does not change behavior
if(FilzeSize > TotalSize)
{
fr_block_sz = fr_block_sz - (FileSize - TotalSize);
}
int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);
// add total bytes recvd every loop
FileSize += write_sz;
// if bytes recieved equals expect file size, break
if (FileSize >= TotalSize)// this is where my problem is, as sometimes
// FileSize == 7376 or 7672 instead of 7374
// When it fails, fr_block_sz == 24 which
// i don't think is right either. Even when
// set to break if FileSize > TotalSize, the
// loop still doesn't complete
break;
printf("Recieved size == %i of %i \n", FilzeSize, TotalSize);
if (write_sz < fr_block_sz)
{
printf("File write failed");
}
bzero(revbuf, 1);
}
printf("Transfer complete \n");
콘솔 출력 : 그것은 여기에 도착하면
Recieved size == 512 of 7374
Recieved size == 1024 of 7374
Recieved size == 1368 of 7374
Recieved size == 1880 of 7374
Recieved size == 2392 of 7374
Recieved size == 2736 of 7374
Recieved size == 3248 of 7374
Recieved size == 3760 of 7374
Recieved size == 4104 of 7374
Recieved size == 4616 of 7374
Recieved size == 5128 of 7374
Recieved size == 5472 of 7374
Recieved size == 5984 of 7374
Recieved size == 6496 of 7374
Recieved size == 6840 of 7374
Recieved size == 7352 of 7374
Recieved size == 7376 of 7374
는, 클라이언트가 루프에 영원히 여기에 대기하고 아무 일도 발생하지 않습니다. 그런 다음 콘솔에서 프로그램을 수동으로 중지해야하고 프로그램이 중지 된 후 파일의 4096 바이트 만 기록됩니다. 나는 누군가가 내 문제에 대해 밝히거나,이를 위해 "정상적인"방법을 밝힐 수 있다면 가장 감사하게 생각한다. 고맙습니다.
EDIT - FIXED (일종의). 내가 안정적으로 100 % 작동 할 수있는 방법을 발견하고 길이 == 1로 변경하여 1 바이트 버퍼 크기를 설정하고, 커널이 바이트를 쓰고 있다면 짧은/긴 읽기를 얻을 수 없다. . 이 방법이 효과적이지만 가장 빠른 해결책은 아닙니다. 나는 여전히 다른 사람들의 이야기를 듣고 싶습니다. 당신의 도움에 감사드립니다. Rajal.
그래서 당신은 서버 코드에서 볼 필요가 대신 – bbonev
관련없는 : 다른 데이터로 채우기 전에 제로로 버퍼를 작성하는 것은 무의미하다. – Casey
Casey - 고정, bbonev - 막연한 설명, 후속 조치. – 4r4r4r