두 클라이언트간에 소켓을 통해 파일을 전송하는 데 맨 아래 코드를 사용했습니다. 클라이언트 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보다 작음 그는 파일의 실제 크기입니다. 누군가 내게 이유를 말해 줄 수 있습니까?
아무 것도 보내기 전에 'y'가 0보다 큰지 확인하고 싶을 수 있습니다. 또한, 데이터 길이 값을 포함하는 패킷 프리앰블을 조언합니다. 당신이 작성한대로 1024 바이트 덩어리를 보내고 512 바이트 덩어리로 수신하지만 파일 데이터 (임의 크기)가 전송되면 임의의 위치에 'SENT'가있을 수 있습니다. 따라서 512 바이트 경계에서이를 찾는 것은 효과가 없을 것입니다. – WhozCraig
맞습니다! 정말 고맙습니다! – mav2401