2014-04-19 4 views
0

지금 바로 보내고있어 문제가 관련되어 예상 수신하지 :RECV() 바이트 수

int k = send(hAccepted, p, size, 0); 

'P'는 일부 파일, MP3, 텍스트 파일 또는 무엇 당신이를 포함하는 버퍼이다 . 문제는 해당 파일이 '5,000,000'바이트라고 말하면, 수신 측에서 5,000,000 바이트를 모두받지 못한 경우에도 send()는 호출 될 때마다 5,000,000을 반환합니다. 이것은 클라이언트가 전체 파일을받지 못했다는 것을 완전히 알고 있기 때문에 서버 측에서 디버깅하는 것을 매우 어렵게 만들고 있지만, 서버는 모든 것을 전송했다고 확신합니다.

+0

어떻게 소켓을 열었습니까? TCP를 사용한다면 상대방이 내용을받지 않고'send'를 완료해서는 안됩니다 (성공적으로). UDP를 사용한다면 수신 한 데이터의 양을 "알려주는"코드를 수신 측에 추가해야합니다. –

+0

모두 TCP입니다. 클라이언트로 보내지는 첫 번째 것은 바이트 단위의 파일 크기 (정확하게 전송 됨)입니다. 클라이언트는 파일을 수신 할 수있는 크기의 버퍼를 설정 한 다음 send/recv를 다시 호출합니다. 항상 전체 파일이 전송되었다는 것을 반환하고, recv는 매번 다른 수를 얻습니다. –

+5

@Yelnik 어떻게 데이터를 수신합니까? TCP를 사용하면 1 개의 send() 호출 결과를 받기 위해 여러 번 전화를받을 수 있습니다. – nos

답변

3

send()는 소켓 송신 버퍼로 전송 된 바이트 수를 반환합니다. 50,000을 반환하면 50,000 바이트가 전송됩니다. 모두받지 못한 경우 수신자 또는 네트워크에 문제가 있습니다.

추가 분석이 가능하려면 일부 코드를 게시해야합니다.

아마도 하나의 recv() 호출에서 모든 바이트를 수신 할 것으로 예상됩니다. 그것의 명세에 의해 그렇게 할 의무는 없다.

char buffer[8192]; 
int length = ... // number of bytes expected; 
int total = 0; 
int count; 

while (total < length && (count = recv(socket, buffer, min(sizeof buffer, length-total), 0)) > 0) 
{ 
    write(outfd, buffer, count); // or do something else with buffer[0..count-1] 
    total += count; 
} 
if (count < 0) 
{ 
    perror("recv"); 
} 

그렇지 않으면 전송중인 데이터를 삭제하는 발신자에게 abortive close를 수행했습니다.

또는 recv() 중에 오류가 발생하여 코드에서 오류가 감지되지 않았습니다.

또는

+0

바로 보내기는 다음과 같습니다. http://pastebin.com/Pn9AwHHi send는 항상 '크기'와 동일한 값을 반환하기 때문에 첫 번째 시도를 통과하므로 완전히 중복됩니다.). 수신 코드는 다음과 같습니다. http : //pastebin.com/JjABt98d –

+0

질문에 * 수신 * 코드를 수정하십시오. – EJP

+0

@RemyLebeau 편집 한 send() 루프는 실제로 필요하지 않습니다. recv()와 같은 방법으로 지정되었지만 모든 알려진 구현은 모든 데이터가 소켓 전송 버퍼로 전송 될 때까지 차단됩니다. news : comp.protocols.tcp-ip에서 모든 구현자가 있고 모두 동의했다는 소식과 누군가가 Posix 문구를 작성하여 강제적으로 작성한 소식도있었습니다. 슬프게도 나는 세부 사항을 잊어 버린다. – EJP