从socket接收后,使用c ++将二进制数据写入文件

时间:2012-08-21 14:46:33

标签: c++ sockets file-io

我正在尝试编写一个从文件(任何类型)读取的c ++代码并在套接字上写入文件数据(二进制数据),因此接收方必须获取此数据并创建文件,我应该看到相同的数据格式相同,问题是数据仍然是二进制的,并作为二进制数据写入文件! 如果测试代码没有在网络上发送,它将运作良好! 任何的想法 ? 提前致谢 。 请注意,如果它影响了这个问题,我正在使用Ubuntu 11.10。

以下是客户端的代码:

filer=fopen("a.doc","rb"); 
fseek (filer , 0 , SEEK_END); 
long size; 
size = ftell (filer); 
rewind (filer); 
buffer = (char*) malloc (sizeof(char)*size); 
numr=fread(buffer,1,size,filer); 
fclose(filer); //some socket code 
char buffer2[size]; 
strcpy(buffer2 , buffer);
n = write(sockfd,buffer2,size); 

和服务器端:

n = read(sock,buffer,length);
FILE * filew;
int numw;
filew=fopen("acopy.doc","wb");
numw=fwrite(buffer,1,len,filew);
fclose(filew);

1 个答案:

答案 0 :(得分:1)

首先,你需要循环。对readwrite的调用并不总是完整的缓冲区。 免责声明我无法在此测试 例如:

numr=fread(buffer,1,size,filer); 
fclose(filer); //some socket code 
char buffer2[size]; 
strcpy(buffer2 , buffer);
n = write(sockfd,buffer2,size); 

char buffer2[size]; 
while ((numr=fread(buffer,1,size,filer)) != 0)
{
    strcpy(buffer2 , buffer);
    n = 0;
    while ((n = write(sockfd,buffer2+n,numr-n)) != 0)
       ; 
}
fclose(filer); //some socket code 
filer = NULL;

同样在服务器端

n = read(sock,buffer,length);
FILE * filew;
int numw;
filew=fopen("acopy.doc","wb");
numw=fwrite(buffer,1,len,filew);
fclose(filew);

FILE * filew;
filew=fopen("acopy.doc","wb");
int numw = 0;
while ((n = read(sock,buffer,length)) != 0)
{
    while ((numw=fwrite(buffer+numw,1,n-numw,filew) != 0)
       ;
}
fclose(filew);