网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月02日漏签0天
c吧 关注:134,337贴子:394,740
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 0回复贴,共1页
<<返回c吧
>0< 加载中...

epoll两种触发方式分析

  • 只看楼主
  • 收藏

  • 回复
  • 西安恩仪联教育
  • 举人
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1、网络通信中每一个套接字都包含两个缓冲区,发送缓冲区和接收缓冲区,缓冲区能够降低双方的耦合性,提高收发效率。
2、Send()函数将内存中的内容放置到发送缓冲区,至于什么时候发送,组织成多大的包发送,都是由底层tcp协议决定的,用户无法干预。
3、Recv()函数将接受缓冲区中的数据按照指定大小存入用户指定的内存空间,接收缓冲区什么时候接收数据,用户无法干预。
4、发送缓冲区和接收缓冲区之间数据的正确传输由tcp底层协议保证,用户无法干预,tcp协议通过错误重传、拥塞控制等方式保证数据的正确性。
5、发送send()函数连续发送多次,可能recv()一次就接受完成。这个是由于缓冲区设置的这种机制决定的,不是一对一。
6、在epoll模型中,客户端连续调用多次send(),底层可能将多次的获得的数据组织成为一个数据包,发送给服务器,触发epoll_wait()函数,多次send()可能仅仅触发一次epoll_wait(),epoll_wait()解除阻塞之后通过recv()读取数据包时容易导致错误。读不完整,很容易导致拆包和粘包。
7、通过epoll的方式设计tcp服务器时,触发方式有两种设置:
水平触发(默认方式):epoll_wait解除阻塞之后,通过recv()读取接受缓冲区中的数据,如果没有读完,epoll会认为此套接字依然是活跃套接字,可多次读取指导缓冲区为空时,epoll_wait才再次阻塞。
边沿触发(EPOLLET):epoll_wait解除阻塞之后,通过recv()读取接受缓冲区中数据,如果没有读取完,epoll认为该套接字不在活跃,无法进行第二次读取。未读取的数据依然存在缓冲区中并未丢失,下一次执行recv()函数时,会接着继续读取。
8、多次调用send()函数,底层将多个send()的数据组织成一个数据包,还是将每一个send()的数据组织成一个数据包由多种因素决定的。发送端每次延时发送能够保证一个数据包能够保证底层对应一个包发送,epoll_wait()触发一次,确保一个send()对应接收端一个recv()。
9、网络编程会存在以上所描述的问题,在实际的项目开发中理解这些问题之后选择合适的方式,根据具体的项目问题设计出解决问题的办法。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 0回复贴,共1页
<<返回c吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示