redis、memcached、nginx网络组件

reactor的应用

  1. 梳理reactor网络编程
  2. 编程细节,一些返回值和错误码
  3. redis、nginx、memcached、reactor具体使用

网络编程关注的问题:

  1. 连接的建立
    1. 客户端连接服务器
      1. 三次握手首先发送connect包(半连接队列),服务器发送ack,客户端发送同步这样连接就建立了(全连接队列)int clientfd = accept(listenfd, addr, sz); 根据addr和sz可以获取到客户端的ip地址(可以用来做黑白名单)
      2. 如果clientfd==-1&&errno==EWOULDBLOCK说明全连接队列为空。Listen(listenfd, backllog) backllog指的是全连接队列大小(linux下,mac系统可能是半连接队列和全连接队列长度之和)accept既能够检测全连接队列是否有数据,同时可以取出clientfd
    2. 服务器连接第三方服务(redis,memcat等)
      1. Int ret = connect(connectfd,(struct sockaddr*)&addr,sizeof(addr));
      2. Errno = EINPROFRESS(正在建立连接)、EISCONN(建立成功)
  2. 连接的断开
    1. 主动断开
      1. 主动调用close/shutdown
      2. 一条连接有R和W(全双工),断开连接有两种状态读断、写断、都断
      3. 四次挥手
    1. 被动断开
      1. Int n = read(fd, buf, sz)为0,读端被动关闭,有的时候网络编程需要支持半关闭状态,这时还可以write
      2. 关闭写端write = -1 && errno = EPIPE
  3. 消息的到达
    1. 有两个状态:用户态和内核态
    2. 一条连接有两个缓冲区:读缓冲区和写缓冲区(内核态)
    3. Int n =  read(fd, buf, sz),从内核态的读缓冲区读到用户态,sz:预期读到的数据,n为实际读出的数据个数,n≤sz
    4. 如果n=-1
      1. 读缓冲区为空EWOULDBLOCK
      2. EINTR被信号打断(前两个是正向错误,下一次还可以继续读)
      3. 其他的错误直接close
  4. 消息发送完毕
    1. Int n = write(fd, buf, sz); 把用户态的缓冲区写到内核态缓冲区中。
    2. n
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值