2013-05-03 12 views
0

피어가 다른 피어에서 파일을 보내고 다운로드 할 수있는 분산 P2P 파일 공유 시스템을 구현하려고합니다. 그러나 파일을 다운로드하여 디렉토리에 저장하는 데 문제가 있습니다. 나는, 나는 내가 C에 새로운 오전,하지만 난이 문제를 알고C : 소켓을 통해 파일 보내기 및 받기

while(recv(clientSock, currentLinePointer, 1, 0) != 0) { 
    currentLinePointer++; 
} 

를 다음을 수행 다운로드하려고하면 내가 요청 된 파일

while(!feof(requestedfile)) { 
    bytes_read = fread(buf, 1, sizeof(buf), requestedfile); 
    send(clientSock, buf, bytes_read, 0); 

} 

를 보낼 경우 여기

입니다

  1. 어떻게하면보다 효율적인 읽기를 수행 할 수 있습니까? 한 번에 1024 바이트를 읽으면 마지막 데이터 블록에서 1024 바이트 만 채워질 수 있습니다. 다른 512 개의 무의미한 바이트로 인해 파일에 오류가 발생합니까? (말도 안되는 바이트로 jpg를 읽고 저장하려고하면 사진에 나쁜 일이 일어납니다.)
  2. 이제 파일을 읽었습니까? 어떻게 파일을 저장합니까? 피어 요청 "hello.jpg"라고 말하십시오. 지금 보내고 그 파일을 읽을 수 있지만,이 설정은 어떻게 요청 동료 디렉토리에이 파일을 저장할 수 있습니다 "PATH는/사진 /"
+0

'recv'는 실제로 수신 된 바이트 수를 반환한다는 것을 기억하십시오. 오류가 발생하면 -1, 연결이 닫히면 0이 반환됩니다. 소켓을 비 블로킹하는 데 도움이 될 수 있습니다. –

+0

"올바른"폴더에 저장하는 경우 송신 프로그램이 경로를 먼저 보내거나 수신 프로그램에 설정되도록 프로토콜을 수정하십시오. –

+0

양쪽 끝에서 sendfile (2)을 사용하는 것이 더 효율적일 것입니다. (http : //linux.die.net/man/2/sendfile) –

답변

0

나는이 요즘 디스크 섹터 (http://en.wikipedia.org/wiki/Disk_sector)의 표준 크기 때문에 한 번에 4096 바이트를 읽으십시오 :

char* buffer = (char*)malloc(4096), *position = buffer; 

while((bytes_read = recv(clientSock, position, 4096, 0) > 0) 
{ 
    if(fwrite(position, 1, bytes_read, localFile) != bytes_read) 
    { 
     // do some error handling here 
     break; 
    } 
    position += 4096; 
} 

// and here 

free(buffer); 
+0

파일에서 'stat()'를 호출하고 ''struct stat ''의 ''st_blksize ''필드를 확인하여 블록 크기를 항상 확인할 수 있습니다. –

0

recv() 바이트의 수는 연결이 종료되는 경우, 0 수신 -1을 반환 오류시. 기본적으로 귀하의 질문에 대한 답변입니다.

또한 send()에 의해 반환 된 값을 추적해야합니다. 전송 된 바이트 수를 반환하거나, 마지막으로 보내기 위해 버퍼에 넣습니다. 버퍼가 꽉 찼거나 연결이 끊어지면 항상 모든 내용을으로 전송하지는 않습니다. 전송 값을 추적하여 전송 버퍼 사용을 제어하고 전송되는 파일의 갭을 피하십시오. 이전 호출에서 거절 한 데이터 부분을 보내려면 새 send() 호출을 수행해야 할 수 있습니다.

관련 문제