1. TCP_NODELAY

1.TCP_NODELAY 和 NAGLE 算法

  • 当我们通过 TCP socket 分多次发送较少的数据时,比如小于 1460 或者 100 以内,对端可能会很长时间收不到数据,导致本端应用程序认为超时报错。这时可能是受到了 TCP NAGLE 算法的影响。

2.NAGLE算法了解

  • TCP NAGLE算法和实现
  • 网络编程中Nagle算法和Delayed ACK的测试

3.一般双方建立连接后,便会做如下配置,经如下设置后,发送小数据可能会快一些

ns,addr = self.sock.accept()
print 'connect by', addrns.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
ns.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)ns.setblocking(False)

  1. SO_REUSEADDR
  1. 一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

  2. SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态

  3. 示例:

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.sock.setblocking(False)self.sock.bind((ip, port))self.sock.listen(5)

  1. signal(SIGCHLD, SIG_IGN);

    因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。(Linux Only)

    对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。


  1. signal(SIGPIPE, SIG_IGN);

    TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道,但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制,一个端点无法获知对端的socket是调用了close还是shutdown.

对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 这里是引用

但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送).
但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以,第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数: signal(SIGPIPE, SIG_IGN);这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.


ErrorNo 9:

Udp sendto失败 errno 9 (EBADF Bad file descriptor)
在调试udp socket时遇到用sendto发送数据时报错出现 Bad file descriptor。
1、在进行sendto时 udp的socket已经关闭,大家可以自己写示例程序,建立一个udp socket 然后关闭这个socket,再用sendto进行发送,查看结果。这个问题同样适用tcp
2、多线程同时向同一个socket进行sendto数据,这个情况也可以自己写程序验证。(这种说法为网上查阅资料时看到的一种说法,但是自己写测试程序并没有试验出来,如果真实程序遇到这种情况在进行补充,测试程序也很简单就是不停的穿件线程,每个线程都想同一个socket中写数据。)

socket 配置选项 理解 socket errorno 情况收集相关推荐

  1. 阿里云IOT-C-SDK系列(4)SDK配置选项理解

    阿里云IOT-C-SDK系列(1)概述:移植流程.程序框架.代码目录 阿里云IOT-C-SDK系列(2)快速体验:移植+示例C代码 阿里云IOT-C-SDK系列(3)快速体验:不使用SDK自带编译系统 ...

  2. Socket/ServerSocket 选项

    Socket/ServerSocket 选项 原文:Socket/ServerSocket 选项 在网络编程中,Socket/ServerSocket有一些选项用来自定义一些行为,现在分享一下. So ...

  3. 理解GRUB2工作原理及配置选项与方法

    GRUB2是借鉴GRUB改写到更加安全强大到多系统引导程序,现在大部分较新的Linux发行版都是使用GRUB2作为引导程序的. GRUB2采用了模块化设计,使得GRUB2核心更加精炼,使用更加灵活,同 ...

  4. 深入理解阻塞socket和非阻塞socket

    什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思是指,当试图对该文件描述符进行 ...

  5. linux socket ip层配置,Linux下Socket通信(TCP实现)

    近期在做的项目中,涉及到了进程间数据传输,系统的原本实现是通过管道,但是原有的实现中两个进程是在同一台机器,而且两个进程的关系为父子关系,而我们要做的是将其中一个进程移植到服务器上,因此两个进程要分开 ...

  6. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  7. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码

    本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...

  8. 简单理解socket(socket.AF_INET,socket.SOCK_STRE,os.dup2(s.fileno(),0),subprocess.call([“/bin/bash“,“-i“])

    前言:因为最近学习渗透时,使用python编写了一个木马,但是对里面的函数/方法功能并不了解,于是查阅资料,总算有了一定了解,于是记录下来 木马文件如下: import socket,subproce ...

  9. 简单理解socket协议

    TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间 ...

最新文章

  1. Spring Boot 最最最常用的注解梳理
  2. xilinx sg dma 注意事项
  3. html中如何实现选择存储路径的功能_HTML是Web前端的基础知识,刚入门的你真的学对了吗?...
  4. centos yum install redis
  5. tcpdump 用法
  6. spark算子_十、Spark之详解Action类算子
  7. 干货 · UI设计|APP引导页面可临摹素材
  8. CIE Radar 2006(ICR2006)开始征文了
  9. 模拟电子技术,电力电子技术
  10. android 阿拉伯语下布局,android设计的布局在阿拉伯语下界面错乱的解决方法
  11. websockets_将WebSockets与Node.js结合使用
  12. 代码抛出异常后进行事务回滚的两种方式(Spring @Transactional注解)
  13. 18位身份证号码的编排规则
  14. linux加密自己的smb目录,SmbFile连接加密共享文件夹
  15. php orientation生成图片,图片自动旋转的前端实现方案
  16. 6.PMAC下位机-下位机编程
  17. 《Visual Prompting: Modifying Pixel Space to Adapt Pre-trained Models》论文阅读笔记
  18. Ubuntu14.04安装搜狗拼音输入法后无法使用解决方案
  19. java字符串==_Java字符串(String)
  20. Ableton Live 11 Suite v11.1.0 WiN-MAC 电音制作宿主软件

热门文章

  1. MATLAB输出txt文件
  2. CAPL控制程控电源
  3. C语言题目:逆转数字
  4. vsftpd安装和配置
  5. 位运算(3)-- 高级运用
  6. RK3568平台开发系列讲解(内核篇)内核Oops日志分析
  7. SqlServer各版本下载(2016-2019)
  8. 论文写作三线表制作方法
  9. Workbooks.Add和Sheets.Add以及Workbooks.Open
  10. cmd运行java文件汉字乱码的问题