epoll的EPOLLOUT事件-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

epoll的EPOLLOUT事件

2016-06-21 10:49:13 2257 1

文档上说epoll监听的描述符可写的时候会触发EPOLLOUT事件,

可是我想知道在接受到EPOLLOUT后,调用write还有限制吗,比如write过大的数据会不会还是返回EAGAIN。

想像这样的场景
服务器收到客户端的请求,要获取一张图片。
服务器读取该图片,保存为字节数组(char*)
然后调用write欲将数据写入套接字,却返回EAGAIN
epoll_ctl为套接字添加EPOLLOUT的事件监听
那么问题来了,当EPOLLOUT事件发生时,往该套接字写该图片的数据,是否能成功
服务器使用C语言开发。不过我想其他语言的epoll都是从C语言绑定过去的,原理应该一样。

这里有点要注意的是,第一次write失败是因为数据量太大,如果write数据少一点是可以成功的。(至少从经验看是如此)那么当EPOLLOUT触发时能保证write一张大图片的数据会成功吗。

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:44:36
    /*
     * 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;
    }
    0 0
相关问答

17

回答

教你如何简单将OSS bucket挂载成为阿里云ECS服务器本地盘

梦丫头 2017-02-17 14:01:12 37982浏览量 回答数 17

5

回答

【阿里云】linux服务器安装nginx配置多个站点两种方法

自娱自乐 2014-03-29 14:53:12 22434浏览量 回答数 5

9

回答

阿里云ECS安装虚拟主机系统DirectAdmin开心版百分百成功的方法

hxs 2014-05-26 20:05:30 34486浏览量 回答数 9

10

回答

AMH5.0安装脚本顺便提醒是收费的每月5元。

是非良人 2014-08-31 15:13:27 20879浏览量 回答数 10

8

回答

阿里云服务器内网传输使用指南

任逍遥 2013-03-22 00:05:42 30736浏览量 回答数 8

3

回答

2020年05月编程排行榜-C语言继2015年,重新成为编程排行榜第一名

huc_逆天 2020-05-06 13:43:42 35542浏览量 回答数 3

4

回答

上传到OSS的文件md5hash值如何获取?!!

asker 2015-08-05 16:52:10 21253浏览量 回答数 4

14

回答

C语言基础 【精品问答合集】

我是管理员 2018-07-13 15:37:00 26673浏览量 回答数 14

10

回答

阿里云centos静默安装oracle

美味的小鱼 2014-08-12 14:23:44 30641浏览量 回答数 10

5

回答

C语言算法 【精品问答合集】

我是管理员 2018-07-13 15:51:28 27068浏览量 回答数 5
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载