免费注册 查看新帖 |

Chinaunix

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

socket编程如何传送图片文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-02 16:31 |只看该作者 |倒序浏览
下面这段代码表示我的大概思路:
File *fp = fopen("stefanie.jpg", "r");
char buf[BUFFSIZE];
while (fgets(buf, BUFFSIZE, fp) != NULL) {
    send(sockfd, buf, strlen(buf), 0);
}

测试的时候有问题,474K的图像每次只能传91K就停了,这是什么原因呢?解决办法是什么?
SirFang 该用户已被删除
2 [报告]
发表于 2009-04-02 16:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-04-02 16:38 |只看该作者

回复 #2 SirFang 的帖子

换成二进制的读
或者用sendfile,你这个传法本身就有问题,哪有用fgets读二进制文件的
SirFang 该用户已被删除
4 [报告]
发表于 2009-04-02 16:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-04-02 17:18 |只看该作者
rb

至于传输,那是没有问题的,只要你告诉系统你要传什么数据,以及传送的长度,send才不管你里面是什么数据

论坛徽章:
0
6 [报告]
发表于 2009-04-02 21:42 |只看该作者
原帖由 astezheng 于 2009-4-2 16:38 发表
换成二进制的读
或者用sendfile,你这个传法本身就有问题,哪有用fgets读二进制文件的

是的,问题就出在fgets,如果二进制文件包含有null字节或换行符,fgets就不能正常工作,这应该是接收到的图像只有91K的原因,因为碰到了null或\n导致图像数据丢失(我是在本机上测试,所以不存在网络延迟问题)。apue2上说读写二进制文件用freed和fwrite函数,我正在试...

论坛徽章:
0
7 [报告]
发表于 2009-04-03 10:27 |只看该作者
找到一种可行的方法,使用mmap,从服务器发送到客户端,不管是文本文件还是二进制文件,都可以发送成功,代码:
        srcfd = open(filename, O_RDONLY, 0);
        if ((srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0)) == MAP_FAILED) {
                err_quit("file map error");
        }
        close(srcfd);
        if (send(connfd, srcp, filesize, 0) != filesize) {
                munmap(srcp, filesize);
                err_quit("write error");
        }
        munmap(srcp, filesize);

大家点评一下吧,或者说说有没有更好的方法。

论坛徽章:
0
8 [报告]
发表于 2009-04-03 10:30 |只看该作者

你知道啥是图片文件不?

论坛徽章:
0
9 [报告]
发表于 2009-04-03 10:52 |只看该作者
哥哥啊,图片不是文件么,二进制还有搞不定的文件么

论坛徽章:
0
10 [报告]
发表于 2009-04-03 11:06 |只看该作者
对对,都是文件,是我开始用fgets传文本文件,然后又想如何传图片文件,才说昏了,mmap是不用区分文本文件和二进制文件的。
不知道mmap的效率怎么样?还有没有其它方法可以从服务器向客户端传文件?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP