• linux下socket套接字相关


    1、只读取数据,不清socket区缓存,可重复读相同的数据块。

            ssize_t recv(int sockfd, void *buf, size_t len, int flags); 第四个参数设置为MSG_PEEK即可,当需要清理时再设为0即可。

    2、状态

    • CLOSED    没有使用这个套接字[netstat 无法显示closed状态]
    • LISTEN    套接字正在监听连接[调用listen后]
    • SYN_SENT    套接字正在试图主动建立连接[发送SYN后还没有收到ACK]
    • SYN_RECEIVED    正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK]
    • ESTABLISHED    连接已建立
    • CLOSE_WAIT    远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN]
    • FIN_WAIT_1    套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN]
    • CLOSING    套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN]
    • LAST_ACK    远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN]
    • FIN_WAIT_2    套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK]
    • TIME_WAIT    这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态]

    3、setsockopt常用选项

    • SO_REUSEADDR,端口重用,当一个服务端进程bind此端口后收到新的连接,之后服务端被意外关闭会进入TIME_WAIT状态持续两分钟,这段时间内守护进程重启服务器会报错“error:98,Address already in use”  ,故为了安全起见服务端套接字需要设置SO_REUSEADDR,可保证守护进程拉起server时bind通过。
    • TCP_NODELAY,禁用Nagle算法,避免小包延时40ms发送,可保证通信的时效性。

    • SO_KEEPALIVE,自动发送心跳,默认间隔两小时

    • TCP_KEEPIDLE,心跳间隔,发送若干次探测包

    • TCP_KEEPINTVL,探测间隔

    • TCP_KEEPCNT,探测次数

    • SO_RCVTIMEO,设置recv阻塞最大时长

    • SO_SNDTIMEO,设置connect阻塞最大时长

    • SO_SNDBUF,TCP发送缓冲区的容量上限,超过则write阻塞。
    • SO_RCVBUF,TCP接收缓冲区的容量上限,没啥影响。
  • 相关阅读:
    【论文阅读】《PRODIGY: Enabling In-context Learning Over Graphs》
    从板凳围观到玩转行家:Moonbeam投票委托如何让普通用户一同参与
    Unity 之 利用数组来管理资源
    Spring Boot——日志文件
    LeetCode:1155. 掷骰子等于目标和的方法数(C++)
    纺织机械对直线模组的要求有哪些?
    长连接和短连接有什么区别?
    构造函数可以在类的私有部分中定义吗?
    FastAPI 库(Python 的 Web 框架)基本使用指南(一)
    个人开发的渗透测试工具Satania v1.2更新
  • 原文地址:https://blog.csdn.net/jiujiederoushan/article/details/126136111