免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2659 | 回复: 6
打印 上一主题 下一主题

为什么传输后的文件大小不一样 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-25 12:29 |只看该作者 |倒序浏览
我写了一程序是将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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-06-25 14:42 |只看该作者
跟文件系统有关系
你把linux下的文件拷贝到windows下,大小肯定不一样

论坛徽章:
0
3 [报告]
发表于 2006-06-25 14:57 |只看该作者
回车换行的不同

用二进制方式试试

论坛徽章:
0
4 [报告]
发表于 2006-06-25 15:01 |只看该作者
可是我是将window的程序复制到linux,再从liunx传回来,这么转了一圈这个程序就用不了拉。
我在linux下也是用的vfat文件系统和window是一样的吧。

论坛徽章:
0
5 [报告]
发表于 2006-06-25 15:10 |只看该作者
用二进制方式来读写数据估计就可以解决你的问题了

论坛徽章:
0
6 [报告]
发表于 2006-06-26 07:06 |只看该作者
3、5楼说得对,是二进制的问题。问题出在WINDOWS上。
UNIX下默认都是按二进制打开的,WINDOWS若不指定"b",则按文本方式打开,会自以为聪明地处理文件中的'\r' '\n'

论坛徽章:
0
7 [报告]
发表于 2006-06-26 09:30 |只看该作者
谢谢明白人
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP