- 论坛徽章:
- 0
|
我写了一程序是将linux下的一个文件传到window下;
#include <iostream>
#include <winsock2.h>
#include <fstream>
#include <string>
#include <fcntl.h>
#include <io.h>
#pragma comment(lib,"ws2_32.lib"
using namespace std;
int main()
{
SOCKET server;
WSADATA wsaData;
sockaddr_in local;
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
{
return 1;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(888 ;
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
{
return 1;
}
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
return 1;
}
if(listen(server,10)!=0)
{
return 1;
}
SOCKET client;
int recvfd,bytes_read,bytes_write;
sockaddr_in from;
int fromlen=sizeof(from);
while(1)
{
int sum=0,i=0;
char buffer[512];
char file[512]="f:\\";
char *ptr=buffer;
client=accept(server,(struct sockaddr*)&from,&fromlen);
bytes_read=recv(client,buffer,511,0);
buffer[bytes_read]='\0';
while(buffer[i;])
{
if(buffer[i++]=='/')
ptr=buffer+i;
}
strcat(file,ptr);
if((recvfd=open(file,O_WRONLY|O_CREAT))==-1)
{
cout<<"open "<<file<<"error"<<endl;
goto error;
}
while(1)
{
bytes_read=recv(client,buffer,512,0))
if(bytes_read<=0)
break;
bytes_write=write(recvfd,ptr,bytes_read)
sum+=bytes_write;
}
close(recvfd);
error:
cout<<file<<": "<<sum<<endl;
closesocket(client);
}
closesocket(server);
WSACleanup();
return 0;
}
如果传文本文件,虽然大小不一样,但不影响阅读;
但是如果传可执行文件,可执行文件是window下的可执行文件,我是复制到linux下的,经过我的程序传输后,大小就变了,无法再执行了;
接受到的大小和传输大小是一样的,就是用write()写入文件后,大小就不一样了,怎么回事呀,
我发先问题就在write函数这里,
char a[512]="asdf";
write(recvfd,a,4);
这样文件大小是4;
bytes_read=recv(client,buffer,512,0);
write(recvfd,buffer,bytes_read);
write返回值是bytes_read,可是文件大小却不是bytes_read怎么回事呀;
[ 本帖最后由 yuhuashi5678 于 2006-6-25 13:38 编辑 ] |
|