Linux基础——系统整合server与client的一些操作

在TCP连接中,我们会遇到端口复用、粘包问题等。

当server端主动关闭socket,会产生一个TIME_WAIT的状态,所以我们需要加上端口复用的选项,来解决该问题。

由于TCP是个流协议,所以无法提供报文服务,这就需要去处理粘包问题,解决方法有:

  1) 采用固定长度发送数据,这样做的话局限性比较大。

  2) 每次发送报文前,先发送一个4字节的长度信息,然后发送实际报文,这样,对方接收时,先接收4字节的长度信息,然后根据长度信息接收相应的实际报文。

  3) 每条信息使用'\n'字符作为结尾,接收方使用readline作为接收函数。

在TCP处理中,close与shutdown的区别:

  1) close基于引用计数,仅当计数为0时,才真正去关闭。

  2) shutdown与引用计数无关。

  3) close同时关闭read和write,shutdown可以指定关闭其中一端。

服务器并发的实现:

  1) 采用循环,每次接受一个新的client,这种称为迭代服务器

  2) 多进程编写并发,这时,需要处理僵尸信号,处理信号有:

    a) 直接忽略SIGCHLD,这种适合于子进程消亡不需要额外处理的情况。

    b) 为SIGCHLD编写处理函数,内部调用waitpid。

    c) 直接使用waitpid,但是在并发服务器中不能采用这种,因为waitpid需要阻塞,这就把并发服务器降低为迭代服务器

  3) 多线程编写并发,需要注意的是,将fd传递给线程时,需要使用malloc分配内存空间。

  4) IO复用模型(select、poll、epoll)。

几种IO复用模型的不同:

  1) select的缺点:

    a) fd数目的限制,需要重新编译内核。

    b) fd数组从用户空间copy到内核空间。

    c) select系统调用需要逐个轮询每个fd,随着fd数目的增长,效率下降。

  2) poll模型虽然解决了fd的数目问题,但是仍然存在copy和轮询效率下降的缺陷。

  3) epoll的优点:

    a) 对于fd是直接注册给内核,不存在重复拷贝至内核空间的开销。

    b) 内部采用回调函数,只关注活跃的fd,所以不会随着fd的数目增长而使得效率下降。

具体代码及测试可到我的github上查询:

  https://github.com/gjn135120/my_epoll

转载于:https://www.cnblogs.com/gjn135120/p/4046367.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值