首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否在套接字recv阻塞等待数据时保持窗口运动和关闭操作?

在套接字recv阻塞等待数据时,窗口运动和关闭操作是由TCP协议来控制的,与套接字的阻塞状态无关。当接收方的应用程序调用recv函数时,如果没有数据可用,套接字将进入阻塞状态,等待数据到达。

在TCP协议中,窗口运动和关闭操作是通过TCP的滑动窗口机制来实现的。滑动窗口是用来控制发送方和接收方之间的数据流量的。接收方通过发送窗口大小来告知发送方自己的接收能力,发送方根据接收方的窗口大小来控制发送的数据量。

当接收方的应用程序调用recv函数时,如果接收缓冲区中没有足够的数据可用,接收方会发送一个零窗口通知给发送方,告知发送方自己的接收窗口为0,即暂时无法接收数据。发送方收到零窗口通知后,会停止发送数据,即窗口停止运动。

当接收方的应用程序调用recv函数后,如果接收缓冲区中有足够的数据可用,接收方会发送一个非零窗口通知给发送方,告知发送方自己的接收窗口大小,即可以接收数据。发送方收到非零窗口通知后,会继续发送数据,即窗口继续运动。

关闭操作是通过TCP的连接终止过程来实现的。当接收方的应用程序调用recv函数后,如果接收到发送方发送的TCP连接终止请求(FIN),接收方会发送一个确认(ACK)给发送方,并进入关闭等待状态。在关闭等待状态下,接收方会继续接收发送方发送的剩余数据,并发送确认给发送方。当接收方接收到发送方发送的所有数据后,会发送一个终止确认(FIN)给发送方,表示自己已经关闭了。发送方收到终止确认后,也会关闭连接。

综上所述,套接字的阻塞状态与窗口运动和关闭操作是相互独立的。窗口运动是由TCP协议控制的,而关闭操作是通过TCP的连接终止过程来实现的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

服务器开发中网络数据分析与故障排查经验漫谈

阻塞模式阻塞模式的套接,对服务器的连接服务器网络数据的收发行为影响很大。...阻塞套接字模式下,send函数如果由于对端tcp窗口太小,不足以将全部数据发送出去,将阻塞执行流,直到出错或超时或者全部发送出去为止;同理recv函数如果当前协议栈系统缓冲区中无数据可读,也会阻塞执行流...SO_SNDTIMEO与SO_RCVTIMEO 这两个选项用于设置阻塞模式下套接,SO_SNDTIMEO用于send数据由于对端tcp窗口太小,发不出去而最大的阻塞时长;SO_RCVTIMEO用于recv...这个选项的用处是用于解决,当需要关闭套接,协议栈发送缓冲区中尚有未发送出去的数据等待这些数据发完的最长等待时间。...默认为0,表示关闭。 u net.ipv4.tcp_fin_timeout=30 表示如果套接由本端要求关闭,这个参数决定了它保持FIN-WAIT-2状态的时间。

1.5K50

服务器开发中网络数据分析与故障排查经验谈

阻塞模式阻塞模式的套接,对服务器的连接服务器网络数据的收发行为影响很大。...阻塞套接字模式下,send函数如果由于对端tcp窗口太小,不足以将全部数据发送出去,将阻塞执行流,直到出错或超时或者全部发送出去为止;同理recv函数如果当前协议栈系统缓冲区中无数据可读,也会阻塞执行流...SHUT_WR/SHUT_RDWR,SHUT_RD表示关闭收消息链路,即该套接不能再收取数据,同理SHUT_WR表示关闭套接发消息链路,但是这里有个问题,有时候我们需要等待缓冲区中数据发送完后再关闭连接怎么办...SO_SNDTIMEO与SO_RCVTIMEO 这两个选项用于设置阻塞模式下套接,SO_SNDTIMEO用于send数据由于对端tcp窗口太小,发不出去而最大的阻塞时长;SO_RCVTIMEO用于recv...这个选项的用处是用于解决,当需要关闭套接,协议栈发送缓冲区中尚有未发送出去的数据等待这些数据发完的最长等待时间。

1.2K30
  • recv函数说明返回值

    是否要在 recv之前,判定连接是否中断,如果未中断则recv.  恩。我最后查了一下,是因为服务端关闭套接,才导致这边recv返回0。...当应用程序调用recv函数, (1)recv等待s的发送缓冲中的数据被协议传送完毕,如果协议传送s的发送缓冲中的数据出现网络错误,那么recv函数返回SOCKET_ERROR, (2)如果s...的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接s的接收缓冲区, 如果s接收缓冲区中没有数据或者协议正在接收数 据,那么recv就一直等待,直到协议把数据接收完毕。...如果recvcopy出错,那么它返回SOCKET_ERROR; 如果recv函数等待协议接收数据网络中断了,那么它返回0。...:sock索引的不是套接 当返回值是0,为正常关闭连接; 思考: 当对侧没有send,即本侧的套接s的接收缓冲区无数据,返回值是什么(EAGAIN,原因为超时,待测) http://hi.baidu.com

    4.9K10

    Python学习 :socket基础

    (默认True),如果设置False,那么acceptrecv一旦无数据,则报错。...#接收TCP 客户的连接(阻塞式)等待连接的到来 sk.connect(address)   #连接到address处的套接。...sk.connect_ex(address)   #同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回编码,例如:10061 sk.close()   #关闭套接 sk.recv(bufsize...一般,超时期应该在刚创建套接设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername()   #返回连接套接的远程地址。...;   - 首先,我们需要先打开服务端,此时服务端会进行阻塞等待客户端的接入   - 接着,我们就可以打开客户端连入服务端,此时即可以开始聊天   往后,我们还会学到服务端的并发聊天、远程操作、文件上传等相关操作

    97620

    套接 socket tcp 连接过程

    既然 connect() 函数是向某个套接发起连接的,自然使用 connect() 函数需要带上连接的目的地,即目标地址目标端口,这正是服务端的监听套接上绑定的地址端口。...这两个函数都涉及到了 socket buffer,但是调用 send() 或 recv() ,复制的源 buffer 中是否数据、复制的目标 buffer 中是否已满而导致不可写是需要考虑的问题。...不管哪一方,只要不满足条件,调用 send()/recv() 进程/线程会被阻塞(假设套接设置为阻塞式IO模型)。...当然,可以将套接设置为非阻塞 IO 模型,这时 buffer 不满足条件时调用 send()/recv() 函数,调用函数的进程/线程将返回错误状态信息 EWOULDBLOCK 或 EAGAIN ;...此时将无法从 recv buffer 中再读数据recv buffer 中已有的数据只能被丢弃。 关闭写。

    2.4K10

    socket阻塞与非阻塞,同步与异步、IO模型

    阻塞阻塞是指当server端的进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪是直接返回还是等待就绪; 而同步异步是指client端访问数据的机制,同步一般指主动请求并等待...阻塞I/O模型图:调用recv()/recvfrom()函数,发生在内核中等待数据复制数据的过程。 当调用recv()函数,系统首先查是否有准备好的数据。...套接应用程序中,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...当使用socket()函数WSASocket()函数创建套接,默认的套接都是阻塞的。这意味着当调用Windows Sockets API不能立即完成,线程处于等待状态,直到操作完成。...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接的“I/O模型”来判断非阻塞套接是否可读可写。

    2.6K30

    Python中TCP协议的理解

    2,bind绑定ipport 3,listen使套接变为可以被动链接 4,accept等待客户端的链接 5,recv/send接收/发送数据 #!...8,TIME_WAIT状态 两端的端口不能使用,要等到2MSL时间结束才可继续使用。 9,当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。...Num06–>TCP协议长链接短链接 TCP真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接它们可以释放这个连接, 连接的建立通过三次握手...每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接, 再操作的话那么处理速度会降低很多,所以每个操作完后都不断开, 再次处理直接发送数据包就OK了,不用建立TCP连接。...支持阻塞操作的设备驱动通常会实现一组自身的等待队列,如读/写等待队列用于支持上层(用户层)所需的block或non-block操作

    91320

    网络编程,来了!

    检查是否能上网 ping当前局域网的ip地址是否同一局域网内 ping 127.0.0.1检查本地网卡是否正常 6、小结 IP地址的作用是标识网络中唯一的一台设备 IP地址的表现形式分为IPv4IPv6...绑定端口号 设置监听 等待接受客户端的连接请求 接受数据 发送数据 关闭套接 4、小结 TCP网络应用程序开发分为客户端程序开发和服务端程序开发 主动发起建立连接请求的是客户端程序 等待接受连接请求的是服务端程序...() TCP服务端程序开发 1、开发TCP服务端程序步骤回顾 创建服务端套接对象 绑定端口号 设置监听 等待接收客户端的连接请求 接收数据 发送数据 关闭套接 2、socket类的介绍 导入socket...关闭listen后的套接字意味着服务端的套接关闭了,会导致新的客户端不能连接服务端,但是之前已经连接成功的客户端还能正常通信 当客户端的套接字调用close后,服务器端的recv会解阻塞,返回的数据长度为...0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接,客户端的recv也会解阻塞,返回的数据长度也为0 案例 - 多任务版TCP服务端程序开发 1、需求 目前我们开发的TCP服务端程序只能服务于一个客户端

    35530

    网络编程—tcp

    3)错误校验 TCP用一个校验函数来检验数据是否有错误;发送接收都要计算校验。 4) 流量控制阻塞管理 流量控制用来避免主机发送得过快而使接收方来不及完全收下。...有序数据传输 重发丢失的数据包 舍弃重复的数据包 无差错的数据传输 阻塞/流量控制 udp通信模型 udp通信模型中,通信开始之前,不需要建立相关的链接,只需要发送数据即可...,如果想要完成一个tcp服务器的功能,需要的流程如下: socket创建一个套接 bind绑定ipport listen使套接变为可以被动链接 accept等待客户端的链接...关闭accept返回的套接字意味着这个客户端已经服务完毕 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线...3.2 长连接的操作步骤是: 建立连接——数据传输...(保持连接)...数据传输——关闭连接 ? 4.

    62631

    网络编程socket

    socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) socketfile的区别: file模块是针对某个指定文件进行【打开...(默认True),如果设置False,那么acceptrecv一旦无数据,则报错。...接收TCP 客户的连接(阻塞式)等待连接的到来 sk.connect(address)   连接到address处的套接。...sk.connect_ex(address)   同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回编码,例如:10061 sk.close()   关闭套接 sk.recv(bufsize...一般,超时期应该在刚创建套接设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername()   返回连接套接的远程地址。

    86930

    【从零学习python 】77. TCP服务端编程及注意事项

    TCP服务端 程序中,如果想要完成一个TCP服务器的功能,需要按照以下流程进行操作: 创建套接socket 绑定(IP端口) 监听使套接变为可被动连接 等待客户端的连接请求accept 接收/发送数据...则可以继续等待其他新客户端的连接 client_socket, client_addr = tcp_server_socket.accept() # 接收对方发送过来的数据 recv_data = client_socket.recv...TCP服务器通过listen可以将socket创建出来的主动套接变为被动套接,这是编写TCP服务器必须的操作。 当客户端需要连接服务器,需要使用connect进行连接。...当一个TCP客户端连接到服务器,服务器端会创建一个新的套接,用于标识该客户端,并为该客户端提供服务。...当客户端的套接字调用close后,服务器端的recv方法将解阻塞,并返回长度为0的数据,因此服务器可以通过返回的数据长度来区分客户端是否已经下线。

    11210

    python学习----------so

    简单的表达就是:两个程序通过网络交互数据就使用socket,也就是建立连接传输数据 二、socket通信流程     socket其实就是对文件操作的一个实现,即就是“打开---读写---关闭”以...socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作使用,如发送ICMP报文。...(默认True),如果设置False,那么acceptrecv一旦无数据,则报错。...sk.connect_ex(address)   同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回编码,例如:10061 sk.close()   关闭套接 sk.recv(bufsize...一般,超时期应该在刚创建套接设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername()   返回连接套接的远程地址。

    1K10

    linux网络编程之socket(八):五种IO模型select函数简介

    一、五种I/O模型 1、阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的...2、非阻塞I/O 我们可以使用 fcntl(fd, F_SETFL, flag | O_NONBLOCK); 将套接标志变成非阻塞,调用recv,如果设备暂时没有数据可读就返回-1,同时置errno为...4、信号驱动I/O 先注册SIGIO信号的处理函数,进程继续执行其他操作,当数据到来时会发送SIGIO信号给进程,然后可以信号处理函数中调用recv进行数据的复制,然后recv返回进行数据处理。...脚注:同步异步的区别在于是不是要求处理消息者自己来完成将数据从内核缓冲区复制回进程缓冲区的过程。消息者阻塞阻塞应该是发生在消息的处理的时刻。阻塞其实就是等待,发出通知,等待结果完成。...参数3:写集合,关心可写事件; 套接口发送缓冲区有空间容纳数据。(连接一旦建立就可写) 对等连接的读一半关闭。即收到RST段之后,再次调用write操作

    1.9K00

    socket阻塞与非阻塞,同步与异步、IO模型

    阻塞阻塞是指当server端的进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪是直接返回还是等待就绪; 而同步异步是指client端访问数据的机制,...阻塞I/O模型图:调用recv()/recvfrom()函数,发生在内核中等待数据复制数据的过程。 当调用recv()函数,系统首先查是否有准备好的数据。...套接应用程序中,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...当希望能够立即发送接收数据,且处理的套接字数量比较少的情况下,使用阻塞模式来开发网络程序比较合适。 阻塞模式套接的不足表现为,大量建立好的套接字线程之间进行通信比较困难。...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接的“I/O模型”来判断非阻塞套接是否可读可写。

    1.9K20

    Python socket 模块的使用

    socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作使用,如发送ICMP报文。...(默认True),如果设置False,那么acceptrecv一旦无数据,则报错。...sk.connect_ex(address)   同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回编码,例如:10061 sk.close()   关闭套接 sk.recv(bufsize...一般,超时期应该在刚创建套接设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername()     这个方法只能用在客户端,用于查看server端的信息...要注意在socket网络开发中,只有accept()方法recv()方法是起阻塞效果的。所谓阻塞就是程序运行到这里会停住,等待对方的消息。只有收到对方的消息之后才会继续往下走。

    1.2K20

    深入剖析Linux网络设计中网络IO的重要角色

    例如,尝试将UNIX域数据套接连接到流套接,可能会发生此错误。 ETIMEDOUT 尝试连接超时。服务器可能太忙,无法接受新连接。...当流套接对等端执行有序关闭,返回值将为0;不同域(例如UNIXInternet域)中的数据套接允许零长度数据报,当接收到这样的数据报时,返回值为0;如果从流套接接收的请求字节数为0,则也可以返回值...recv的错误码: 错误码 含义 EAGAIN,EWOULDBLOCK 套接标记为非阻塞,接收操作要求阻塞,或者设置了接收超时,并且接收数据之前超时。...原理如下: 2.1.3 两者区别 从上面原理图可以看出,差异主要在数据准备阶段。具体差异:IO函数在数据未就绪是否立刻返回。...recv 从读缓冲区中读取数据到用户态 检测读缓冲区是否数据 send 拷贝数据到写缓冲区 检测写缓冲区是否可写 注意,IO函数只能检测一条连接就绪的状态以及操作一条连接的IO数据 三、IO多路复用检测

    9420

    ☀️苏州程序大白用万解析Python网络编程与Web编程☀️《❤️记得收藏❤️》

    网络套接(英语:Network socket;又译网络套接、网络接口、网络插槽)计算机科学中是电脑网络中进程间数据流的端点,是一种操作系统提供的进程间通信机制。...4、等待客户端的连接请求。 5、接受数据。 6、返回数据。 7、关闭套接。 TCP服务端程序开发流程 流程梳理: 1、创建客户端套接对象。 2、和服务端套接建立连接。 3、发送数据。..._socket.setblocking(bool) 是否阻塞(默认True),如果设置False,那么acceptrecv一旦无数据,则报错。..._socket.connect_ex(address) 同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回错误代码 _socket.close() 关闭套接连接 _socket.recv(...8、当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接,客户端的 recv 也会解阻塞

    82920

    TCP编程入门简介

    这个 socket 描述跟文件描述一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。成功返回一个非负的文件描述符编号,错误时返回-1。...成功返回 0,否则返回-1. sockfd 是绑定到要接受的端口的未连接套接连接。 backlog 以前指定了操作系统应用程序之前接受的连接数。现在这个值已经没用了。...这里需要注意的是,listen()函数不会阻塞,它主要做的事情为,将该套接套接对应的连接队列长度告诉 Linux 内核,然后,listen()函数就结束。...fd为待关闭的文件描述符 close 一个套接的默认行为是把套接标记为已关闭,然后立即返回到调用进程,该套接描述符不能再由调用进程使用,也就是说它不能再作为send或recv的第一个参数,然而TCP...多进程并发服务器中,父子进程共享着套接套接描述符引用计数记录着共享着的进程个数,当父进程或某一子进程close掉套接,描述符引用计数会相应的减一,当引用计数仍大于零,这个close调用就不会引发

    30410

    socket阻塞与非阻塞,同步与异步IO模型

    阻塞阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪是直接返回还是等待就绪; 而同步异步是指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式...如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。 阻塞I/O模型图:调用recv()/recvfrom()函数,发生在内核中等待数据复制数据的过程。...当调用recv()函数,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。...套接应用程序中,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。      ...因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接的“I/O模型”来判断非阻塞套接是否可读可写。

    3.2K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券