2013-08-09 1 views
0

두 클라이언트간에 소켓을 통해 파일을 전송하는 데 맨 아래 코드를 사용했습니다. 클라이언트 A는 클라이언트 B에 파일을 보내려고 는, 서버가 해당 파일을 수신 한 후 서버에 파일, 그것은 클라이언트 B로 파일을recv()/send() (소켓) 또는 read()/write() (CFile)

내 코드는 다음 읽을 파일을 전송하는 데 사용되는 전송하는 전송 :

CFile f; 
BOOL p=f.Open(fname,CFile::modeRead); 
char buff[1024]; 
int y; 
int x; 
if(!p) 
    //print error msg 
while(true) 
{  
    y=f.Read(buff,1024); 
    x=send(s,buff,y,0);  
    if(y<1024) 
    { 
     f.Close(); 
     break; 
    }   
} 
send(s, "SENT|",6,0); 

내 코드는 파일 쓰기 수신하는 데 사용됩니다

f.Open(fname,CFile::modeCreate | CFile::modeWrite); 

while(true) 
{  
    z=recv(sRecSocket,buff,512,0); 
    if(z==SOCKET_ERROR) 
    { 
     break; 
    } 

    if(strncmp(buff,"SENT|",5)==0) 
     break; 
    f.Write(buff,z); 
} 
f.Close(); 
send(sRecSocket,"RECV|",6,0); 

을하지만 난 내 프로젝트를 실행할 때, 때로는 때로는하지 않습니다는 파일이 클라이언트 B에 완전히 전송 잘 작동하지만, 파일이 클라이언트 B로 전송되었지만 크기가 0 바이트 또는 t보다 작음 그는 파일의 실제 크기입니다. 누군가 내게 이유를 말해 줄 수 있습니까?

+1

아무 것도 보내기 전에 'y'가 0보다 큰지 확인하고 싶을 수 있습니다. 또한, 데이터 길이 값을 포함하는 패킷 프리앰블을 조언합니다. 당신이 작성한대로 1024 바이트 덩어리를 보내고 512 바이트 덩어리로 수신하지만 파일 데이터 (임의 크기)가 전송되면 임의의 위치에 'SENT'가있을 수 있습니다. 따라서 512 바이트 경계에서이를 찾는 것은 효과가 없을 것입니다. – WhozCraig

+0

맞습니다! 정말 고맙습니다! – mav2401

답변

1

send 이 제공하는 모든 데이터를 전송 보장 없으며, 모든 데이터를 사용할받을 recv 약속을하지 않는다 (나는 무슨 말인지 이해하려고 노력에 대한 감사, 영어 잘하지 않아요). 루프를 돌면서 전화를 걸어 왼쪽으로 보내는 양을 조절하고 매번 오류를 확인하여 모든 것을 보내거나 받도록해야합니다.

메모리에서 - 나는 항상 요즘에 루프를 넣습니다! - 루핑이 항상 필요한 것은 아닙니다 (나는 당신의 통제를 벗어난 다양한 요인에 의존한다고 생각합니다). 그래서 여러분의 코드는 여러분이 가지고 있지 않더라도 상당히 안정적으로 작동하는 것처럼 보일 수 있습니다.

이것은 MSDN documentation for send에에 감동 : 오류가 발생하지

경우, 반환에게 LEN 매개 변수에 전송 요청 된 수보다 적을 수 있습니다 보낸 총 바이트 수를 보냅니다.