文档上说epoll监听的描述符可写的时候会触发EPOLLOUT事件,
可是我想知道在接受到EPOLLOUT后,调用write还有限制吗,比如write过大的数据会不会还是返回EAGAIN。
想像这样的场景
服务器收到客户端的请求,要获取一张图片。
服务器读取该图片,保存为字节数组(char*)
然后调用write欲将数据写入套接字,却返回EAGAIN
epoll_ctl为套接字添加EPOLLOUT的事件监听
那么问题来了,当EPOLLOUT事件发生时,往该套接字写该图片的数据,是否能成功
服务器使用C语言开发。不过我想其他语言的epoll都是从C语言绑定过去的,原理应该一样。
这里有点要注意的是,第一次write失败是因为数据量太大,如果write数据少一点是可以成功的。(至少从经验看是如此)那么当EPOLLOUT触发时能保证write一张大图片的数据会成功吗。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
/*
* Packs up the buf and write to socket in non-blocking way
* If all data is writen, return 1
* If only part of data is writen, return 0, to be continue next time
* If error occurs, return -1
*
* Note, if j_socket_write() returns 0, then you can call it with NULL in buf next time, until all data is writen
*/
int j_socket_write(JSocket * jsock, const void *buf, guint32 count)
{
guint32 size = j_socket_wdata_length(jsock);
if (size == 0) {
/* new data to write */
if (buf == NULL) {
return 1; /* no data? must be a mistake */
}
gchar *len = pack_length4(count);
j_socket_wdata_append(jsock, len, 4);
j_socket_wdata_append(jsock, buf, count);
g_free(len);
size = j_socket_wdata_length(jsock);
}
gint n;
count = size>4096?4096:size;
while(size>0){ /* writes segmentation */
n = j_socket_write_raw(jsock, j_socket_wdata(jsock), count);
if(n<0){
if(errno==EAGAIN){
return 0;
}
return -1; /* It's a real error */
}
j_socket_wdata_pop(jsock,n);
size = j_socket_wdata_length(jsock);
count = size>4096?4096:size;
}
return 1;
}