![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络编程实践
文章平均质量分 59
通过例子的形式分析与解决网络编程中遇到的问题,优化网络编程
程序员写代码
个人博客主页:http://wang_da_shen.gitee.io/myblogs/
展开
-
connect的非阻塞模式
一般情况下,在使用connect连接服务端时,需要等待一会儿才会函数才会返回,导致程序阻塞。为了降低阻塞的影响,我们可能会单独开个线程处理connect请求,例如在界面当中,就会启用一个线程,避免UI卡死。当然,这里还有一些其他的方法,也就是我们常见的非阻塞IO。原创 2024-07-22 17:46:50 · 376 阅读 · 0 评论 -
muduo Buffer的设计与使用
在栈上准备一个65536字节的extrabuf,然后利用readv()来读取数据,iovec有两块,第一块指向muduo Buffer的writable字节,第二块指向栈上的extrabuf。因此,对于不完整的情况,需要由网络库自行处理,而处理的方式也就是引用这个buffer。举个例子,对于readv(),假如传入3个缓冲区每个缓冲区大小为16,当前文件偏移量为20,那么内核会把当前文件的偏移量[20,36)存入iovec[0],[36,52)存入iovec[1],[52,68)存入iovec[2]。原创 2024-07-17 16:24:17 · 388 阅读 · 0 评论 -
网络文件传输
本章实现一个发送文件的命令行小工具,启动时通过命令行参数指定发送的文件,启用端口侦听网络连接。每次有新连接进来就把文件内容完整的发送给对方。这里一共提供三个版本代码位置:muduo-master/examples/filetransfer。原创 2024-07-17 09:57:10 · 318 阅读 · 0 评论 -
Nagle算法
Nagle算法主要是避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。在默认的情况下,Nagle算法是默认开启的,Nagle算法比较适用于发送方发送大批量的小数据,并且接收方作出及时回应的场合,这样可以降低包的传输个数。但是如果你的程序是 write-write-read 模式,在使用了Nagle算法后,第二个 write 就会被推后一个RRT发送而造成一个很长的ack等待,从而产生一个延迟。原创 2024-05-15 21:04:56 · 344 阅读 · 0 评论 -
SIGPIPE信号与SO_REUSEADDR
而当我们使用了SO_REUSEADDR 选项后,服务器退出后,仍然允许我们马上重启进程。对于这种情况,如果在服务端没有做特殊处理,有一个客户端意外退出,造成连接关闭,而服务端如果此时发送消息的话,就会收到 SIGPIPE 信号,导致服务端进程结束。对于网络IO来说,当我们关闭了一个连接时,此时我们再往连接中写入数据,那么也会收到一个 SIGPIPE 信号。当向一个已经关掉的管道写数据,write系统调用会返回一个 SIGPIPE 信号,该信号默认结束进程。原创 2024-05-15 20:24:24 · 317 阅读 · 0 评论 -
安全关闭Tcp连接
第一行是我们输入的数据,这些数据会发送给sender,最后一行是我们接收到的数据大小,很明显是比原来的要少的。这是因为sender本身并没有read操作,所以这些输入的数据会滞留在缓冲区,但是sender发送完数据,直接调用close,根据前面对close的介绍,这时候sender会发送一个RST,导致Tcp连接强行断开,所以nc并没有完全接受完数据。当前在套接字发送缓冲区中的数据将被发送掉,后跟TCP的正常连接终止序列。关闭读功能,套接字中不再有数据可接收,而且套接字接收缓冲区中的现有数据都被丢弃。原创 2024-05-08 20:08:52 · 398 阅读 · 0 评论 -
RoundTrip测试RTT时延
总体相比,tcp所用的往返时间还是比udp的往返时间要长,而在同一机器下,理想状态下,时钟差应该为0才对,但是两种方式都各自计算出了不怎么接近0的数值。Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。原创 2024-05-07 11:05:56 · 583 阅读 · 0 评论 -
Tcp自连接
查看正在监听的tcp端口,然后我们再从ip_local_port_range,可以通过以下命令查看ip_local_port_range。所谓自连接,就是tcp两端使用了同一个端口进行连接,即localhost:port->localhost:port。前面一个就是我们的源端口,而后面一个就是我们的目的端口,而地址都是我们的本地地址,我们可以看见已经出现了自连接的情况。如果客户端和服务端都在同一个环境,并且客户端先于服务端启动,那么很有可能产生自连接的现象。我们选取一个没有正在监听的端口,可以通过。原创 2024-04-29 21:07:45 · 608 阅读 · 0 评论 -
阻塞IO下的echo实验
我们在设计协议的时候,可以先让客户端发一个header,告诉服务端数据的长度,然后服务端在接收到header后,准备好一个符合大小的buffer,将数据全部读取到buffer当中,之后再返回数据给客户端。:由于服务端在每次recv4K字节后需要send数据给客户端,但此时客户端正在send数据的过程中,没有recv数据,导致服务端send阻塞。:由于服务端阻塞在send中,没有继续recv数据,导致客户端也陷入send阻塞当中。客户端的逻辑主要就是,建立连接,发送数据,查看Recv-Q和Send-Q。原创 2024-04-27 12:28:31 · 238 阅读 · 0 评论 -
ttcp测试网络吞吐量
用来表示网络的通信线路传送数据的能力,通常是指单位时间内从网络中的某一点通过另一点的最高数据率,即网络设备所支持的最高速度。ttcp_blocking.cc就是简单的客户端服务端通信(阻塞IO),通信的过程中加入测试的逻辑。ttcp代码位置:muduo-master/examples/ace/ttcp。还有非阻塞IO版的,也就是ttcp.cc,大部份依照回调函数的方式实现。:表示单位时间内通过某个网络(或信道、接口)的数据量。环境:两条桥联的虚拟机(Centos)两种方式吞吐量差不多。原创 2024-04-26 20:54:13 · 363 阅读 · 2 评论