调用Linux的write向socket写数据的时分出现PIPE损坏提示
发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
调用Linux的write向socket写数据的时候出现PIPE损坏提示
现在在改nginx代码,遇到的问题如下:
nginx原先使用Linux系统函数sendfile()来将客户端请求的文件发送到客户端,这个函数效率较高,避免了频繁的内存拷贝和上下文切换。
在nginx中,sendfile()是这样使用的:
//@c->fd: socket句柄
//@file->file->f: 文件句柄
//@offset: 文件偏移量
//@file_size: 文件总大小
sendfile(c->fd, file->file->fd, &offset, file_size);
现在根据业务需要,不适用sendfile(),进行下面的改动:
u_char read_buf[2271682] = {0}; //存储整个整个文件的buf
read(file->file->fd, read_buf, 2271682);
write(c->fd, read_buf, 2271682);
上面的过程相当于将这个文件先读入内存,然后再整体写入socket,发送到客户端。功能是正常的。
但上面的写法太不灵活,需要将文件整体读入内存,开销太大,所以考虑使用分段读入内存,分段发送到客户端:
int n_offset = 0; //文件偏移量
int n_read = 0; //读取到的字节数
int n_write = 0;
u_char read_buf[32768] = {0}; //32K的buf
while(n_offset < 2271682)
{
n_read = 0;
memset(read_buf, 0, 32768);
n_read = lseek(file->file->fd, read_buf, 32768);
n_offset += n_read;
n_write = write(c->fd, read_buf, n_read);
}
但是上面的方式总是会出现提示:Program received signal SIGPIPE。即使加上signal(SIGPIPE, SIG_IGN);还是会出现上面的问题。
请问这种情况应该怎样解决?
------解决方案--------------------
是不是客户端已经关闭了?
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
风生水起才知天高云淡,沧海横流方显英雄本色 百万商业圈云平台免费发布,几十万台电脑变成一台不是梦
百万商业圈分布式云平台功能...
-
登录问题
登录服务器为A 、代理服务器为B 、服务器资源为C.
http发送 验证成功 https请求资源
1.A<---...
-
集群的问题
看了网上很多文章,不是很理解怎么集群的,一下又memcache集群的,一下又mysql集群,还有什么nginx
。
具我了解nginx起的作用...
-
关于计费系统里面的预付费和后付费概念
由于本人刚接触计费系统,对里面的一些概念还有点模糊,特别是对预付费和后付费的理解,我的问...
-
很幽默的讲解六种Socket IO模型(转)
本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教...
-
数据库读写分离时候可能碰到的问题
数据库读写分离后,如果碰到一种插入操作,是需要对数据做检索后再进行的
例如用户注册,需要检测用...
-
奇怪啊,为何我的一个SWF浏览器缓存文件会被自动清除
我已经设置了这个文件的max-age是100天,也就是说,这个文件会在浏览器缓存里放10...
-
Myfaces日历控件无法弹出
代码如下:
<x:inputCalendar monthYearRowClass="yearMonthHeader"
weekRowClass="w...
-
到底什么才是Web Services
我曾经做过一个android的软件,当时的思想是这样的,我用SSH框架做了一个Web服务端,这个服务端暴露了很多的...
-
Web服务和文件服务分离后的问题
(A是Web服务器,B是文件服务器)
1 A网络映射B,访问A上传文件到B通过映射的路径实现。显示B中的...