Не получается переслать файл по сети.
Создаю поток с сокетом, передаю сокет в функцию пересылки файла и не могу определить конец файла.
теоретически должно работать так:
если в файле в стречается '0' я заменяю этот '0' на '00' в клиенте все наоборот, встретив '00' заменяю на '0'.
если встречаю '0' и следующий симовл какой, то другой это означает что достигнут конец файла. соответственно на сервере в последний байт отправляемого буффера записываю этот '0'
вот серверная функция:
/**********************************************************
*
* Allow client to download files from server
*
***********************************************************/
ThreadSocket::sendfile(void* ptr)
{
SOCKET client=(SOCKET)ptr;
char str1[]="filename:";
char str2[]="transfering file:";
char filename[255]={0};
char *filebuff=new char[1024];
char *sendbuff=new char[2048];
int err,i;
unsigned short int size;
err=send(client,str1,strlen(str1),0);
FILE *fp;
if (err==SOCKET_ERROR)
{
printf("sendfile(void* ptr) error\n");
return ERROR;
}
err=recv(client,filename,255,0);
if (err==SOCKET_ERROR)
{
printf("sendfile(void* ptr) error\n");
return ERROR;
}
err=send(client,str2,strlen(str2)+1,0);
if (err==SOCKET_ERROR)
{
printf("sendfile(void* ptr) error\n");
return ERROR;
}
fp=fopen(filename,"rb");
int t=0;
while(1)
{
err=fread(filebuff,1,768,fp);
printf("%d, %d\n",err,t);
for (i=0,t=0;i<err;i++,t++)
{
if (filebuff[i]=='0')
{
sendbuff[t]='0';
sendbuff[t+1]='0';
t++;
}
else
{
sendbuff[t]=filebuff[i];
}
}
if (err<768) sendbuff[t]='0';
size=t;
send(client,sendbuff,size,0);
memset(filebuff,0,1024);
memset(sendbuff,0,2048);
if (err<768) break;
}
fclose(fp);
return 0;
}
а вот мой клиент:
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET client;
SOCKADDR_IN saddr;
int err;
FILE *fp;
err=WSAStartup(0x101,&wsaData);
saddr.sin_family=PF_INET;
saddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.2");
saddr.sin_port=htons((u_int)8192);
client=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
err=connect(client,(struct sockaddr*)&saddr,sizeof(saddr));
if (err== INVALID_SOCKET) return 0;
char buff[]="Test Send...\n\n";
char buff_r[2048];
char buff_x[1024];
string str;
err=1;
unsigned short int size;
while(err!=-1)
{
err=recv(client,buff_r,1024,0);
printf("%s\n",buff_r);
int i,t,k=0;
char sizex[2];
if (strcmp(buff_r,"transfering file:")==0)
{
fp=fopen("file","wb");
err=512;
while(err>0)
{
err=recv(client,buff_r,512,0);
for (i=0,t=0;i<err;i++,t++)
{
if (buff_r[i]=='0')
if (buff_r[i+1]!='0') {err=-1;break;}
else i++;
buff_x[t]=buff_r[i];
putchar(buff_x[t]);
}
fwrite(buff_x,t,1,fp);
if (err==-1) break;
}
fclose(fp);
}
cin >> str;
if (str=="exit") return 0;
err=send(client,str.c_str(),strlen(str.c_str())+1,0);
}
getch();
closesocket(client);
return 0;
}
Как еще можно отсылать файлы через сокет ?
уже неделю мучаюсь
возился возился файл вроди иногда и приходит но неполучается так что бы точно байт в байт все соответствовало....
еще вижу такую ситуацию... например я получил буффер....
ищу в нем значение заканчивающеся '0' и не '0' предположим достигнут на этом месте где стоит '0' должно быть продолжение в след куске буффера принятым следующим recv. как можно решить эту задачу ?