Ⅰ TCP之深入浅出send&recv
接触过网络开发的人,了解上层应用如何使用send函数发送数据以及recv接收数据。但是,send和recv的实现原理是什么?本文将简单介绍TCP中发送缓冲区和接收缓冲区的作用,并讲解Linux系统下TCP发送和接收数据的具体实现。
缓冲区在数据传输中起着临时缓存的作用。发送端将数据拷贝到发送缓冲区后,立即返回应用层执行其他操作,而接收端则将网络中的数据拷贝到缓冲区等待应用层读取。
发送缓冲区在应用层调用send()发送数据时,数据会被拷贝到socket的内核发送缓冲区。send()函数在应用层返回时,并不一定意味着数据已经发送到对端,而是数据已放入socket的内核发送缓冲区。
Linux内核提供两种方式查看tcp缓冲区大小:通过/etc/sysctl.ronf下的net.ipv4.tcp_wmem值或命令'cat /proc/sys/net/ipv4/tcp_wmem'。以笔者服务器为例,发送缓冲区大小为4096、16384、4194304。
通过程序可以修改当前tcp socket的发送缓冲区大小,只影响特定的socket。
接收缓冲区用于缓存网络上来的数据,直至应用进程读取为止。当应用进程未读取数据且接收缓冲区已满时,收端会通知发端接收窗口关闭(win=0),实现TCP的流量控制。
接收缓冲区大小可以通过查看/etc/sysctl.ronf下的net.ipv4.tcp_rmem值或命令'cat /proc/sys/net/ipv4/tcp_rmem'获取。同样,可以通过修改程序大小修改接收缓冲区,仅影响当前特定socket。
TCP的四层模型包括应用层、传输层、网络层和数据链路层。应用层创建socket并建立连接后,可以调用send函数发送数据。传输层处理数据,以TCP为例,其主要功能包括流量控制、拥塞控制等。
当发送数据时,数据会从应用层、传输层、网络层、数据链路层依次传递。上图为send函数源码调用逻辑图,若对源码感兴趣,可查阅net/tcp.c获取详细实现。
recv函数实现类似,从数据链路层接收数据帧,通过网卡驱动处理后,进入内核进行协议层处理,最终将数据放入socket的接收缓冲区。
在实际应用中,非阻塞send时,发送端可能发送了大量数据,但实际只发送了部分,缓冲区中仍有大量数据未发送。接收端recv获取数据时,可能只收到部分数据。这种情况下,应用层需要正确处理超时、断开连接等情况。
总结来说,TCP的send和recv函数分别在应用层和传输层实现数据的发送和接收,通过内核的缓冲区控制数据的流动。正确理解这些原理对于网络编程至关重要。
Ⅱ QTcpSocket发送接收数据时有大小限制吗
理论上传输数据不会很大,常用的一次webservice数据交互,大小应该不会超过100K,
具体是版否存在大权小限制,这个要看你具体的限制了。
比如我发送一个请求,请求内容是一个人的身份证号码,你给我返回这个人的所有信息,如果这些信息有1G,我觉得理论上实现起来没有问题,但是从软件设计角度,这样来设计就是有缺陷的,
1G的数据需要传很久的,按照常用硬盘的读取速度80M来说,也需要13秒的时间才能传完,而且对带宽的要求还必须是千兆的网络。
Ⅲ QTcpSocket如何发送结构体数据
把结构体转换成一个QString型的就可以write了,然后就可以了。
用QString::fromascii()去转换吧,或者是QString::fromlocal8bit()去转换
Ⅳ Qt用Tcp/ip通讯时,缓冲区只有8K,怎么样才能设置更大
用QTcpSocket不就很好吗?tcp协议是安全可靠的通讯协议,你一次发多少都可以,QT底层会处理