1、send 10G的数据,send返回值不会是10G,而是大约256k,表示你只成功写入了256k的数据。接着调用send,send就会返回EAGAIN,告诉你socket的缓冲区已经满了,此时无法继续send。
此时异步程序的正确处理流程是调用epoll_wait,当socket缓冲区中的数据被对方接收之后,缓冲区就会有空闲空间可以继续接收数据,此时epoll_wait就会返回这个socket的EPOLLOUT事件,获得这个事件时,你就可以继续往socket中写出数据。
处理EPOLLIN的时候,就可以往sockfd里写了(如果需要的话),只不过这时候,套接字如果是非阻塞的,缓冲区写满了,返回EAGAIN , 然而判断send(write/sendfile)返回值发现数据并没有发完,想要接着把数据发出去,这时候就需要暂时记录一下现场,包括fd,当前发送到buffer的哪个字节了,什么的(可以用一个结构记录下来). 然后注册EPOLLOUT事件,等待下一次触发写事件.这时要先删除这个fd注册的写事件,之后找到fd对应的buffer(这个可以用map保存起来,以fd做键去找对应的结构),从原来的没有发完的偏移处继续发数据,发完了就删掉这个map或者将struct里置空. 没有发完就再注册写事件,记录这次的位置到哪了.等待下一次触发写.
2、不用epoll,只使用send,send(fd, buff, buffLen, MSG_WAITALL)可以等待所有消息发送完才返回。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)