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. Linux12-bash变量和逻辑运行
  2. SpringBoot开发最佳实践
  3. 云计算情报局预告|告别 Kafka Streams,让轻量级流处理更加简单
  4. 云炬Android开发笔记 6启动图功能开发与封装
  5. Windows 窗设计时结构
  6. C语言(CED)输入一个任意长度的正整数,将该数逆序输出。
  7. 翻译 - EXT JS 5:Controlling an Application with Router
  8. sublime配置python2和3_请教各位,关于sublime text3 配置python环境的两个小问题。
  9. 【Vue】样式穿透 ::v-deep的具体使用
  10. python应用系列教程——python操作office办公软件(excel)
  11. Java基础——详尽说明try-catch-finally的用法
  12. oracle语句查询时间范围,oracle时间范围查询
  13. 数据挖掘(七) DBSCAN聚类算法
  14. Creator3D新版本震撼来袭
  15. vue加载m3u8视频格式
  16. python图片提取文字软件_这款Python 库 4行代码提取图片中的文字
  17. UVM设计模式 (三) 静态类、资源管理、uvm_event、uvm_*_pool、uvm_config_db、UVM_REGEX_NO_DPI
  18. spanning-tree Protocol 简称STP,生成树协议,被广泛部署在二层交换网络中,用于防止网络出现环路,同时增加网络的冗余性
  19. 获取UNIX主机当前时间的函数
  20. nemesis什么车_世界上十大最强的超级跑车,Trion Nemesis排名第一

热门文章

  1. 【清华大学课程】曼昆-经济学原理笔记(全集)
  2. labview 常见快捷键
  3. Java毕设项目高校智慧校园学生系统(java+VUE+Mybatis+Maven+Mysql)
  4. MATLAB中的mvnrnd函数介绍
  5. 【100%通过率】华为OD机试真题 C 实现【单词倒序】【2022.11 Q4 新题】
  6. 【数据结构】顺序存储——定义
  7. python中 是什么_Python中什么是句柄?
  8. 吃鸡哪个服务器网络稳定,中国地区吃鸡哪个服务器不卡 | 手游网游页游攻略大全...
  9. 电磁兼容常用名词术语
  10. 卸载或删除 Office 2010