美文网首页
socket(二)

socket(二)

作者: 千秋霸业吾一统旧山河 | 来源:发表于2018-07-22 13:29 被阅读0次

    在学socket有时候我们会遇到这种问题:

    解决方法一:

    在服务端中加入:severTCP.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    方法二(liunx):

    发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决,

    vi /etc/sysctl.conf

    编辑文件,加入以下内容:

    net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30

    然后执行 /sbin/sysctl -p 让参数生效。

    net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

    net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

    net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

    net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间


    问题二

    客户端发送空,卡住,主要是在原因:缓冲区为空,recv就卡住:

    当客户端异常断开连接,看见服务端(图3):

    图1 

    服务端:

    图2


    图3

    服务端:

    客户端:

    一个简单聊天功能(没有并发效果):

    服务端

    客户端:

    运行结果

    客户端:

    服务端:

    模拟简单ssh远程控制

    服务端:

    客户端:

    运行结果:

    粘包问题只存在于TCP中,UDP没有:

    udp服务端:

    客户端:

    TCP VS UDP

    tcp基于链接通信

            基于链接,则需要listen(backlog),指定连接池的大小

            基于链接,必须先运行的服务端,然后客户端发起链接请求

            对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)

            对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)

    udp无链接

            无链接,因而无需listen(backlog),更加没有什么连接池之说了

            无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失    

            recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错

            只有sendinto发送数据没有recvfrom收数据,数据丢失

    待更新中。。。。

    相关文章

      网友评论

          本文标题:socket(二)

          本文链接:https://www.haomeiwen.com/subject/ntylmftx.html