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

网络数据传输,recv && send?没那么简单!

让我来写个流程: 打开通信套接字 打开监听套接字 监听客户端连接 通过recv来读取数据 | 通过send来发送数据 真就这么简单吗?没有听过缓冲区的存在吗?...---- 缓冲区 同步Socket的send函数的执行流程,当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度(因为待发送数据是要copy到套接字s的发送缓冲区的,注意并不是...; 如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕; 当协议把数据接收完毕...char buffer[128]; buffer[128] = '\0'; 通过 recv 读取的字符数为 128 时,就会是文稿中的结果。...千万不要小看这部分的判断,试想如果没有这个判断,对方程序发送出来的消息体,可能构建出一个非常大的msg_length,而实际发送的报文本体长度却没有这么大,这样后面的读取操作就不会成功,如果应用程序实际缓冲区大小比

78830

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

EINPROGRESS 套接字是非阻塞的,无法立即完成连接。 EINTR 系统调用被捕获的信号中断;参见信号(7)。 EISCONN 套接字已连接。 ENETUNREACH 网络无法访问。...服务器可能太忙,无法接受新连接。注意,对于IP套接字,当服务器上启用Syncookie时,超时可能很长。...EINVAL 传递的参数无效。 ENOMEM 无法为recvmsg()分配内存。 ENOTCONN 套接字与面向连接的协议关联,尚未连接。 ENOTSOCK 文件描述符sockfd不引用套接字。...EISCONN 连接模式套接字已连接,但指定了收件人。(现在要么返回此错误,要么忽略收件人规范。) EMSGSIZE 套接字类型要求以原子方式发送消息,而要发送的消息的大小使得这不可能。...1.3 消息到达 接收消息使用recv / read函数。从缓冲区中读取数据。 //...... while(1) { //......

11620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python全栈开发之网络编程

    (address) ,但是成功返回0,失败返回errno的值 recv(bufsize[,flag]) 接收TCP套接字的数据,数据以字节形式返回,bufsize指定接收的最大数据量,flag提供有关消息的其他信息...,通常可以忽略 send(string[,flag]) 发送TCP数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量 sendall(string[],flag) 完整的发送TCP...u套接字自己的地址,返回值是形式为(ipaddr,port)的元组 setsockopt(level,optname,value) 设置给定套接字选项的值 setsockopt(level,optname...[.buflen]) 返回套接字选项的值 settimeout(timeout) 设置套接字及操作的朝时期,tiemout为一个浮点数,单位是秒,值为None表示永远没有朝时期 setblocking(...flag) 如果flag为0,则将套接字设为非阻塞模式,非阻塞模式下,如果调用recv()没有接收到任何数据,或send()无法发送数据,将引起socket.error异常 No.3 TCP的三次握手和四次挥手

    64720

    【计网】从零开始掌握序列化 --- 基础知识储备与程序重构

    因为你无法保证对方是和自己一样的系统!Linux64位与Linux32位的对齐方式就不一样,更何况一些移动端系统或者其他语言了!!!这样就不可能保证可以正常读取!!!技术上就不推荐这样操作!!!...其他人收到消息,会从这一串字符串中进行解析,将时间,昵称,信息都读取出来。这就叫反序列化! 向上通过反序列化读取消息,向下通过序列化包装消息。...每当应用层写入数据时(write,send…)本质是将数据拷贝到发送缓冲区中,读取数据时(read, recv…)本质上也是从读取缓冲区中进行读取。...所以read , write , send , recv本质上都是拷贝函数! 网络传输的本质:从发送方的发送缓冲区把数据通过网络协议栈和网络拷贝发送给接收方的接收缓冲区!...之前我们编写的Tcp代码的服务器类并没有做到绝对的解耦: 服务器类中进行了Socket套接字的创建,bind绑定服务器端口号,进入监听模式。

    14210

    Socket编程(4)TCP粘包问题及解决方案

    应用层调用write方法,将应用层的缓冲区中的数据拷贝到套接字的发送缓冲区。...第二种情况是,TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送。 第三种情况由于链路层最大发送单元MTU,在IP层会进行数据的分片。...ftp协议采用/r/n来识别一个消息的边界,我们在这里实现一个按行读取的功能,该功能能够按/n来识别消息的边界。...这里介绍一个函数: ssize_t recv(int sockfd, void *buf, size_t len, int flags); 与read函数相比,recv函数的区别在于两点: recv函数只能够用于套接口...recv函数的flags参数常用的选项是: MSG_OOB 接收带外数据,即通过紧急指针发送的数据 MSG_PEEK 从缓冲区中读取数据,但并不从缓冲区中清除所读数据 为了实现按行读取,我们需要使用recv

    1.5K30

    高性能网络编程3—-TCP消息的接收

    这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。...为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读: 1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?...例如,应用程序正在收取消息时,内核通过网卡又在这条TCP连接上收到消息时,究竟是如何处理的?若应用程序没有调用read或者recv时,内核收到TCP连接上的消息后又是怎样处理的?...其次,用户进程调用read、recv等方法获取TCP消息,则是将内核已经从网卡上收到的消息流拷贝到用户进程里的内存中。...上图中有13个步骤,应用进程使用了阻塞套接字,调用recv等方法时flag标志位为0,用户进程读取套接字时没有发生进程睡眠。

    1.3K51

    高性能网络编程3----TCP消息的接收

    这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。...为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读: 1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?...例如,应用程序正在收取消息时,内核通过网卡又在这条TCP连接上收到消息时,究竟是如何处理的?若应用程序没有调用read或者recv时,内核收到TCP连接上的消息后又是怎样处理的?...其次,用户进程调用read、recv等方法获取TCP消息,则是将内核已经从网卡上收到的消息流拷贝到用户进程里的内存中。...上图中有13个步骤,应用进程使用了阻塞套接字,调用recv等方法时flag标志位为0,用户进程读取套接字时没有发生进程睡眠。

    1.2K10

    温故Linux后端编程(五):SOCKET网络编程

    该操作根据option_value的值,设置sock->sk->sk_no_check。 SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权。Linux通过这一值来排列网络队列。...SO_BINDTODEVICE,将套接字绑定到一个特定的设备上。 该选项最终将设备赋给sock->sk->sk_bound_dev_if。...运行过程 同步Socket的send函数的执行流程,当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度(因为待发送数据是要copy到套接字s的发送缓冲区的,注意并不是send...SOCKET_ERROR; 如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕...总的来说,就是 客户端/服务器端 根本不知道你一串消息有多长,就像一个说话含糊不清的朋友跟你讲话,他如果不慢慢说,你就无法正确的断句。

    83320

    Python与套接字

    () 设置指定套接字的参数 s.close() 关闭套接字 面向锁的套接字方法 s.setblocking() 设置套接字的阻塞与非阻塞模式 s.settimeout() 设置阻塞套接字操作的超时时间...s.gettimeout() 得到阻塞套接字操作的超时时间 面向文件的套接字的函数 s.fileno() 套接字的文件描述符 s.makefile() 创建一个与该套接字相关的文件 第一版,单个客户端与服务端通信...,并且不知道该把消息回复到什么地方,因为我们之间没有建立连接通道 back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)# 同样也是阻塞状态...read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。...也可以readline,也可以for循环,但是读取出来的数据 大小就不固定了,影响效率,有可能读的比较小,也可能很大,像视频文件一般都是一行的二进制字节 流。

    2.4K30

    Python Socket套接字编程

    ◆Socket 基础知识◆ 套接字(Sockct)随着 TCP/IP协议的使用,也越来越多地被使用在网络应用程序的构建中,实际上 Socket编程也已经成为了网络中传送和接收数据的首选方法,套接字最早是由伯克利在...Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求,Socket起源于Unix而Unix/Linux基本哲学之一就是"...,bufsize指定最多可以接收的数量,flag提供有关消息的其他信息,通常可以忽略 sk.recvfrom(bufsize[.flag]) 与recv()类似,但返回值是(data,address),...,该函数主要用于UDP协议 sk.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒.值为None表示没有超时期.一般超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作...● 非阻塞IO:当用户线程发起一个IO请求操作,内核会去查看要读取的数据是否就绪,如果数据没有就绪,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪.

    1.3K10

    Tina_Linux_syslog_使用指南

    ,并连接到syslog 守护进程的Unix 域套接字绑定的路径名上。...• option 参数支持以下的值,可通过或操作(OR)让其支持多个option : option 说明 LOG_CONS 若日志无法通过Unix 域套接字送到syslog 守护进程,则将其输出到console...2.1.2 logread logread 用于读取logd 的ring buffer 的内容,并输出到文件或网络上的远程机器(通过TCP/UDP 套接字)。...size in bytes”(FEATURE_SYSLOGD_READ_BUFFER_SIZE)用于设置syslogd 从/dev/log 中读取内容时的buffer 大小,它规定了单条日志消息的最大长度...如果没有改配置文件的话,默认的会写到/var/log/messages 中。 该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。

    10.4K60

    Linux中一个网络包的发送接收流程

    HTTP报文添加TcpHeader,并进行CPU copy写入套接字发送缓冲区,每个套接字会分别对应一个Send-Q(发送缓冲区队列)、Recv-Q(接收缓冲区队列),可以通过ss -nt语句获取当前的套接字缓冲区的状态...+ 2,头部的相关信息都可以进行复用,因为套接字缓冲区与套接字是一一对应的; tail_skb->truesize = 768 tail_skb->datalen = 0 tail_skb->len...read then write 常见的场景中,当我们要在网络中发送一个文件,那么首先需要通过read系统调用陷入内核态读取 PageCache 通过 CPU Copy 数据页到用户态内存中,接着将数据页封装成对应的应用层协议报文...,并且因为完全在内核态进行数据copy,因此无法添加用户态的协议数据; Kafka因为基于操作系统文件系统进行数据存储,并且文件量比较大,因此比较适合通过sendFile进行网络传输的实现; 但是sendFile...并没有立即将数据拷贝到用户态空间中,所以较大文件会导致频繁触发虚拟内存的 page fault 缺页异常; RocketMQ 选择了 mmap+write 这种零拷贝方式,适用于消息这种小块文件的数据持久化和传输

    2.1K30

    如何在Ubuntu 18.04上使用Postgres,Nginx和Gunicorn设置Django

    注意:配置Nginx后,下一步应该是使用SSL / TLS保护服务器的流量。这很重要,因为没有它,所有信息(包括密码)都以纯文本形式通过网络发送。...您应该看到写入日志的新错误消息。如果您查看该消息,它应该可以帮助您缩小问题范围。...虽然systemd能够创建Gunicorn套接字文件,但Nginx无法访问它。 如果根目录(/)和gunicorn.sock文件之间的任何点上的权限有限,则会发生这种情况。...在上面的示例中,套接字文件和通向套接字文件的每个目录都具有全局读取和执行权限(目录的权限列以r-x而不是---)结束。Nginx进程应该能够成功访问套接字。...如果通向套接字的任何目录没有全局读取和执行权限,则Nginx将无法在不允许全局读取和执行权限的情况下访问套接字,或确保将组所有权授予Nginx所属的组的。

    6.6K40

    如何在Debian 9上使用Postgres,Nginx和Gunicorn设置Django

    注意:配置Nginx后,下一步应该是使用SSL / TLS保护服务器的流量。这很重要,因为没有它,所有信息(包括密码)都以纯文本形式通过网络发送。...您应该看到写入日志的新错误消息。如果您查看该消息,它应该可以帮助您缩小问题范围。...虽然systemd能够创建Gunicorn套接字文件,但Nginx无法访问它。 如果根目录(/)gunicorn.sock文件之间的任何点上的权限有限,则会发生这种情况。...在上面的示例中,套接字文件和通向套接字文件的每个目录都具有全局读取和执行权限(目录的权限列以r-x而不是---结束)。Nginx进程应该能够成功访问套接字。...如果通向套接字的任何目录没有全局读取和执行权限,则Nginx将无法在不允许全局读取和执行权限的情况下访问套接字,或确保将组所有权授予Nginx所属的组的。

    6.5K21

    linux内核 recvfrom,Linux系统调用– recvrecvfrom 函数详解

    大家好,又见面了,我是你们的朋友全栈君。 Linux系统调用– recv/recvfrom函数详解 功能描述: 从套接字上接收一个消息。对于recvfrom,可同时应用于面向连接的和无连接的套接字。...recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。...假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。...MSG_ERRQUEUE:指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来,使用者应该提供足够大的缓冲区。...MSG_OOB:指示接收到out-of-band数据(即需要优先处理的数据)。 MSG_ERRQUEUE:指示除了来自套接字错误队列的错误外,没有接收到其它数据。

    2.8K10

    【计网】自定义协议与序列化(一) —— Socket封装于服务器端改写

    write/recv/send及tcp的全双工   在重新理解这些接口之前,我们先来回顾一下进程向发消息到磁盘的过程:   首先,用户需要发送消息,那么OS就会从文件描述符表中把3号文件描述符通过进程pcb...所以 在传输层看来,是双方的操作系统在进行通信! 随后,对端的接收缓冲区就会通过 read/recv 等接口将数据拷贝到应用层,所以 read/recv 接口本质也是拷贝函数!...最后将序列化的字符串交给上层,上层再根据协议进行反序列化,最终拿到相应的数据。   如果对端接收缓冲区内没有数据,那么 read/recv 接口就会阻塞等待,为什么会阻塞等待?...因为缓冲区里没数据,而 本质上是因为调用read/recv接口的进程在等待数据的到来才会做下一步动作,从而将进程状态从运行态转变为阻塞态,当收到数据的时候再从阻塞态转为运行态。...因为通信双方需要等待数据的发送或者接收,而他们接收的过程无非就是发送端将数据拷贝到发送缓冲区,tcp再通过网络将将数据拷贝到对方的接收缓冲区中,对端用户需要调用 read/recv 拷贝接收缓冲区的数据到应用层

    14210

    如何在Debian 10上使用Postgres,Nginx和Gunicorn设置Django

    注意:配置Nginx后,下一步应该是使用SSL / TLS保护服务器的流量。 这很重要,因为没有它,所有信息(包括密码)都以纯文本形式通过网络发送。...您应该看到写入日志的新错误消息。 如果您查看该消息,它应该可以帮助您缩小问题范围。...虽然systemd能够创建Gunicorn套接字文件,但Nginx无法访问它。 如果根目录( gunicorn.sock文件之间的任何点上的权限有限,则会发生这种情况。...在上面的示例中,套接字文件和通向套接字文件的每个目录都具有全局读取和执行权限(目录的权限列以rx而不是---结尾)。 Nginx进程应该能够成功访问套接字。...如果通向套接字的任何目录没有世界读取和执行权限,则Nginx将无法在不允许全局读取和执行权限的情况下访问套接字,或确保将组所有权授予Nginx所属的组的。

    5.9K30

    linux网络编程之socket(十):shutdown 与 close 函数 的区别

    也就是说只有当所有进程(可能fork多个子进程都打开了这个套接字)都关闭了这个套接字,close 才会发送FIN 段。...所以说,如果是调用shutdown how = 1 ,则意味着往一个已经发送出FIN的套接字中写是允许的,接收到FIN段仅代表对方不再发送数据,但对方还是可以读取数据的,可以让对方可以继续读取缓冲区剩余的数据...,此时客户端写端已经关闭,但还是可以读取到回射回来的数据,服务器端最后得到一个FIN段,read 返回0,打印输出 client close ,并且close(conn); 而客户端在读取服务端回射回来的两次数据后...从下面的输出还可以看出,因为延时的关系,所以不像以前那样发射一行就回射一行。 simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ....,但因为我们已经设置了忽略SIGPIPE信号,所以服务器端进程不会被终止,但客户端也会出错,因为回到while循环开头,select阻塞等待时发现套接字的读端已经关闭,所以不能再关心可读事件了,select

    3.1K00

    websocket与tcp区别_websocket对网络要求

    如果是阻塞套接字,两者会相等,因为顾名思义,如果send系统调用没有把所有待发送数据全部发送,则API调用不会返回。...而Web socket和TCP socket的区别,从发送的数据来看,不再是一系列字节,而是按照一个完整的”消息体”发送出去的,这个”消息体”无法进一步再分割,要么全部发送成功,要么压根就不发送,不存在像...同理,在TCP套接字的场景下,接收方从TCP套接字读取的字节数,并不一定等于发送方调用send所发送的字节数。而WebSocket呢?...WebSocket的接收方从套接字读取数据,根本不是像TCP 套接字那样直接用recv/read来读取, 而是采取事件驱动机制。...看个例子: 我通过WebSocket发送一个消息“汪子熙”: 在调试器里看到的这个字符串作为回调函数的输入参数注入到函数体内: Chrome开发者工具里观察到的WebSocket消息体: 下次面试被面试官问到

    69920
    领券