
网络编程
文章平均质量分 53
modi000
生命不止,奋斗不息!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
listen函数与TCP连接建立过程的关系
这时在操作系统内核会建立SYN队列(未完成握手队列)和ACCEPT队列(已完成握手队列),队列长度由listen函数backlog参数指定。2) 客户端发起服务端的SYN应答ACK包,内核会把连接信息从SYN队列取出来插入到ACCEPT队列,如图2.1~2.3所示。1) 客户端发SYN包到服务端,内核把这一信息放入SYN队列,同时回一个SYN+ACK包给客户端,如图1.1~1.3所示。3) 服务端调用accept接受连接,其实就是从内核ACCEPT队列中取出已经建立成功的连接,拷贝到用户空间,并创建一个。转载 2024-05-31 15:18:46 · 109 阅读 · 0 评论 -
两款网络分析工具Sniffer和Wireshark的比较
通过专家系统,Sniffer能够帮助我们评估网络的性能,比如,网络的使用率,网络性能的趋势,网络中哪一些应用消耗最多带宽,网络上哪一些用户消耗最多带宽,不同协议的流量状况等等。Wireshark并不具有分析功能,当一个网络发生异常的时候,Wireshark只会记录数据,它仅仅是一个测量工具,并不能操作网络,不发送数据包或者做其它的主动动作。通过专家系统,Sniffer可以帮助我们评估业务运行状态,比如各个应用的响应时间,一个操作需要的时间,应用带宽的消耗,应用的行为特征,应用性能的瓶颈等等。转载 2024-05-31 15:13:23 · 3295 阅读 · 0 评论 -
套接字的读写操作在阻塞、非阻塞模式下的表现
想要读取的数据字节数并不一定等于实际读取到的字节数,如何使读操作实际读取的字节数与想要获取的字节数一样?而对于单纯的读写套接字来说,非阻塞并没有带来其他的便利。综上来说,读写套接字时将其设置为非阻塞?了解套接字的读写操作在阻塞模式、非阻塞模式下的表现会有差异,但是不知道。为什么读写操作时,套接字一般被设置为阻塞模式、而不设置为非阻塞模式?写(write):同理,写套接字是将应用层中数据写到套接字。套接字为非阻塞模式时,读写操作被阻塞则直接返回,如果还想使。实际读写的数据与想要操作的数据相同,那么就。转载 2024-05-13 16:24:53 · 268 阅读 · 0 评论 -
网络编程Socket之TCP之read/write
对于write调用(套接字标志为阻塞),如果请求写100个字节,而发送缓冲区中只有20个字节的空闲位置,那么write会阻塞,直到把100个字节全部交给发送缓冲区才返回,如果write中得套接字标志为非阻塞,则直接返回20,因此我们可以实现自己的readn和writen函数。对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字发送缓冲区中丢弃已确认的数据,TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。再屏蔽掉服务端的休眠代码,重新运行,服务端打印信息如下。转载 2024-05-13 16:21:46 · 1098 阅读 · 0 评论 -
多路转接之epoll
返回的文件描述符是一棵红黑树的树根。对二叉树的结点进行操作。原创 2024-03-03 23:07:16 · 470 阅读 · 0 评论 -
多路IO转接之 poll方式
1)可以突破1024个文件描述符限制。poll是select函数的升级版。3)搜索文件描述符范围变小了。2)监听、返回集合实现分离。fds:数组的首地址;nfds:数组的个数。原创 2024-03-03 16:58:26 · 416 阅读 · 0 评论 -
通过多线程并发方式实现服务器
【代码】通过多线程并发方式(fork)实现服务器。原创 2024-02-29 00:15:20 · 767 阅读 · 0 评论 -
listen函数的理解
网络编程中,listen函数直的同时发起与服务建立连接(三次握手)的客户端个数,最多是128个。并不是指能最多实现与客户端建立连接的客户端个数。原创 2024-02-28 23:56:00 · 423 阅读 · 0 评论 -
通过多进程并发方式(fork)实现服务器(注意要回收子进程)
2、子进程完成数据交互后,close(cfd);此时成为僵尸进程,所以需要在父进程中收尸,回收进程描述符等资源。但此时父进程在accept,无法waitpid(),此时使用signal的方式SIGCHILD来解决收尸问题,当子进程成僵尸进程后,由内核自动回收。调用fork()创建子进程后,子进程继承cfd,lfd,通过该cfd与连接过来的客户端通信,lfd对子进程来说没用,可以直接close(lfd);对于父进程来说,只是用来建立连接的,故父进程中的cfd没有用,直接close(cfd);原创 2024-02-28 23:52:08 · 653 阅读 · 0 评论 -
网络编程中的read、write函数的三种返回值处理及readn和writen函数
比如:总共想读4096个字节,每次只发1500个字节,就需要读多次。write函数返回值为0,表示什么东西都没写。read函数返回值为0,表示对端关闭。readn函数读一行,读到\n。原创 2024-02-26 00:46:11 · 799 阅读 · 0 评论 -
gcc联合编译
Wall 参数:打开gcc所有警告。原创 2024-02-25 23:21:10 · 371 阅读 · 0 评论 -
KeepAlive
首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。TCP的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方端掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。转载 2023-11-02 17:30:37 · 117 阅读 · 0 评论 -
TCP socket心跳包示例程序
在TCP socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能更大。可以看出,客户端启动以后发送了15次心跳包,然后停止发送心跳包。在做游戏开发时,经常需要在应用层实现自己的心跳机制,即定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性。若 count 等于 5,说明已经15秒未收到该用户心跳包,判定该用户已经掉线;2) 客户端则只是开辟子线程,定时给服务器发送心跳包(本示例中定时时间为3秒)。转载 2023-09-14 17:24:17 · 598 阅读 · 0 评论 -
TCP协议规定2MSL等待的原因
所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。也就是说有可能新连接和老连接的端口号是相同的。假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是。pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。转载 2023-08-30 13:12:14 · 1196 阅读 · 0 评论 -
【通俗易懂】三次握手与四次挥手
该报文段表明:“我收到了你发起建立连接的请求,该请求报文的初始序号是x(确认号ack=x+1就表明了我收到了初始序号seq=x的报文),我同意建立该连接,我的初始序号是y。4.第四次挥手:客户端收到报文后,一样发出一个ACK报文段做出应答,上一次客户端发送的报文段序号为u,那么这次序号就是seq=u+1,确认号为ack=w+1。如果服务器收到了最后一段ACK报文,客户端在2MSL的时间内就不会收到任何报文,客户端就知道刚刚发送的ACK报文没有丢失,不需要再次发送,可以安心进入CLOSED状态了。转载 2023-08-28 12:15:31 · 306 阅读 · 0 评论 -
字节序的理解
其实,如果考虑字节序的话, 若是小端序机器,0xFF,可以理解为FF000000这种存法,与运算后还是同样的结果,故同一主机中,不考虑字节序。4)socket两端是相同的字节序的话,不需要字节转换。因为此时可以理解为在一台主机上操作,不需要考虑字节序;2)socket套接字时,我们考虑字节序,是因为发送端是字节拷贝,比如一个int 拷贝到char数组。5)socket两端是不同的字节序的话,就需要考虑字节序;1)在字节拷贝的时候,才会考虑字节序的概念。6)平常的与运算,不用考虑字节序;原创 2022-09-28 11:00:31 · 589 阅读 · 0 评论 -
阻塞和非阻塞的write函数(send同理)返回值实验(带实例)
服务器端程序,只连接客户端,不recv,即:不读缓冲区运行服务器程序。1、默认的阻塞客户端。实验结果:阻塞的客户端程序,当缓冲区空间不足的时候,会阻塞等待。 注意:我们将设置非阻塞代码放在connect的后面了。若放在connect之前会出现如下错误:实验结果: 我们看到发送缓冲区满了,非阻塞的客户端,会立即返回。..................原创 2022-06-15 09:34:41 · 909 阅读 · 0 评论 -
linux ipv4 keepalive,tcp_keepalive的设置
1.参数设置查看相关的参数sysctl -a|grep tcp_keepalivenet.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 2net.ipv4.tcp_keepalive_time = 160设置相关的参数sysctl -w net.ipv4.tcp_keepalive_time = 7500也可以直接打开/etc/sysctl.conf加入net.ipv4.tcp_keepalive_time = 7500,然后保存退转载 2022-06-14 11:16:12 · 6746 阅读 · 0 评论 -
recv和send函数循环接收和发送数据问题理解
send函数参考该文。阻塞send,不需要循环发送(当然循环也可以)。非阻塞send,需要循环发送()。阻塞recv(需要循环读)非阻塞recv(需要循环读)send函数,会比较应用buff和输出缓冲区的大小,recv函数,则是输入缓冲区有数据,就能读取(阻塞和非阻塞都是这样),循环读取,一个原因是当不知道对方的数据大小时,需要循环读取,才能保证把缓冲区数据完全读空。另一个原因:当知道对方发送的报文字节数的时候,可能因为网络卡顿等原因导致,发送和接收的数据长度不一样。参考该文。...原创 2022-06-14 09:43:25 · 3179 阅读 · 0 评论 -
send()和recv()函数详解(send返回值举例)
转载:send()和recv()函数详解_weixin_34281537的博客-优快云博客不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的参数:这里只描述同步Socket的send函数的执行流程。当调用该函数时:(1) send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回 SOCKET_ERROR;(2) 如果转载 2022-06-14 08:53:30 · 5247 阅读 · 0 评论 -
Select函数实现达到定时器的效果
————————————————版权声明:本文为优快云博主「晓春三月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/courageously/article/details/107138839...转载 2022-06-13 16:42:36 · 864 阅读 · 0 评论 -
select函数配合阻塞或非阻塞socket测试(带实例)
select超时等待过程中不占用cpu.服务器程序客服端程序:启动两个客户端,连接如下。,实现了多路复用。服务器端的连接的cfd都采用默认的阻塞形式。 结论:虽然我们起了 两个客户端,但是第二个客户端程序也建立连接了,虽然不知道为什么没有打印信息, 我们将新生成的客户端程序设置为非阻塞,就可以避免这种情况。服务器程序中修改如下: 结果如下: 服务器程序中的第二个read函数在客户端没有写数据的时候,也自动返回了。 这也是select函数一般与非阻塞socket连用的原因之一吧...原创 2022-06-10 16:50:59 · 1161 阅读 · 0 评论 -
socket阻塞与非阻塞实验(recv或read读返回值)(带实例)
状态处于睡眠和运行中交替执行,且cpu占用率高。 屏蔽以下两行。 int flags = fcntl(sfd, F_GETFL, 0); //获取文件的flags值。 fcntl(sfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式; 阻塞在accept这里。不执行了。 进程状态如下,一直处于sleep状态中,且不占用cpu.客户端程序:2.1服务器端阻塞的cfd1)此时listenfd为阻塞态原创 2022-06-10 15:13:20 · 1356 阅读 · 0 评论 -
【win网络编程】socket中的recv阻塞和select的用法
转载请注明出处:作者 kikilizhm在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在阅读recv的说明时讲到返回值即是接收到的字节数,那么返回0的时候就代表结束了,实践发现recv是个阻塞函数,在连接不断开的情况下,会一直处于阻塞状态,也不会返回0.也就是说程序不能这么一直读,如果对端连接没有关闭,则在没有数据的情况下,调用recv会阻塞,如果对端关闭连转载 2022-06-10 11:17:30 · 2475 阅读 · 1 评论 -
select系统调用
select函数简介 select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使用 selcet函数就可以实现非阻塞编程。 selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行。 select()转载 2022-06-10 08:54:15 · 1468 阅读 · 0 评论 -
字节序的深入理解
总结:1)inet_aton()、inet_addr()函数是将字符串ip传递给网络(大端序);inet_aton()是将网络(大端序)转换为字符串ip。2)转给网络的是大端序形式,所以在小端序机器上,需要后加ntohl();3)从网络接收的时大端序形式,所以,在小端序机器上显示,需要先加htonl();.........原创 2022-06-08 09:03:01 · 166 阅读 · 0 评论 -
socket实现进程间通信示例
服务器端程序:客户端程序:原创 2022-06-07 13:10:20 · 452 阅读 · 0 评论 -
为什么网络socket编程是阻塞的?因为非阻塞轮询占CPU,用多线程和IO复用
2020.8.27一直不明白为什么网络socket编程默认都是阻塞的,阻塞了程序不就停了不响应了吗,好纠结。现在有点了解了,阻塞时是等待状态,类似于内核把它sleep,不占用CPU,对操作系统正常运转是非常有利的。非阻塞方式:程序不会停止响应,socket函数会马上返回,但程序需要一直轮询socket,如果socket没有动作,那其实就是在while(1)啊,CPU占用是100%啊。不行啊,操作系统要完蛋的。所以还是用阻塞方式吧,内核已经把最优方案给我们了。但是,一个socket这么用是没问题的,多个soc转载 2022-06-06 16:36:41 · 1806 阅读 · 0 评论 -
网络编程 read 阻塞和非阻塞下的区别
-----read,只是将内核中缓冲区的数据搬到用户进程空间。参数:fd:某个连接的套接字。buf:从内核缓冲区读入的数据放到用户缓冲区的地址。nbytes:希望读入的数据大小,一般不是真正读人的大小。返回值:实际读取的长度。-1:error会被置为相应的值。error:为EAGAIN,表示在非阻塞下,此时无数据到达,立即返回。error:为EINTR,表示被信号中断了。0:对端已关闭,本端也需要close 该套接字。 >0:实际读取的数据长度。2,read 阻塞和非阻塞下的区别:阻塞下转载 2022-06-06 13:56:53 · 2872 阅读 · 0 评论 -
网络编程中的 SIGPIPE 信号
在网络编程中经常会遇到信号,默认情况下这个信号会终止整个进程,当然你并不想让进程被信号杀死。我们不禁会这样思考: 产生的原因是这样的:如果一个 socket 在接收到了 RST packet 之后,程序仍然向这个 socket 写入数据,那么就会产生信号。 这种现象是很常见的,譬如说,当 client 连接到 server 之后,这时候 server 准备向 client 发送多条消息,但在发送消息之前,client 进程意外奔溃了,那么接下来 server 在发送多条消息的过程中,就会出现信号。对一转载 2022-06-01 09:44:57 · 728 阅读 · 0 评论 -
#pragma pack() 易忽略的问题
#pragma pack() 易忽略的问题 C/C++中,class、struct、union默认的大小对齐方式为按照成员变量所占空间最大的大小进行对齐,如:typedef struct test{ char a; int b; double c;}test_t;则test结构体内所有成员变量按照double类型进行字节对齐,此时sizeof(test_t)等于8*3。在网络通信中,为了让数据包更紧凑些,我们往往希望能够通过#pragma pack预编译命令改变默转载 2022-05-30 14:28:02 · 822 阅读 · 0 评论 -
报文中是大端序,小端序主机取数
例如:2字节的长度:方法一:uchar ch[2] = {0x12,0x34};usigned int lenght = ch[0]<<8 + ch[1];方法二:uchar ch[2] = {0x12,0x34};usigned int lenght = ntohs(ch);原创 2022-03-03 15:48:38 · 219 阅读 · 0 评论 -
socket编程中while死循环的注意事项
1、while死循环中一定要加sleep2、客户端,如果connect失败的话,关闭socket,并重新初始化sd =1if(connect() == -1){ shutdown(sd,2); delay(100); close(sd); sd =-1;}3、客户端中ip地址的赋值,使用inet_addr(ip);即可,ip为点分十进制。...原创 2022-03-03 09:55:21 · 1354 阅读 · 0 评论 -
TCPDUMP——抓包、筛选、高级筛选
https://wiki.wireshark.org/SampleCaptures/ 下载各种网络包的示例TCPDUMP——抓包抓包默认之抓包68个字节 tcpdump -i eth0 -s 0 -w file.pcapTcpdump -i eth0 port 22读取抓包文件Tcpdump -r file.pcap实际操作:查看参数:tcpdump -h常用: tcpdump -i eth0 -s 0 -w a.acp-i eth0: 用eth0 接口进行抓包...转载 2022-02-08 09:53:41 · 2632 阅读 · 0 评论 -
优雅的关闭连接 --- 使用shutdown和setsockopt(SO_LINGER)实现
优雅关闭:如果发送缓存中还有数据未发出则其发出去,并且收到所有数据的ACK之后,发送FIN包,开始关闭过程。TCP连接线关闭一个方向,此时另外一个方向还是可以正常进行数据传输。强制关闭:如果缓存中还有数据,则这些数据都将被丢弃,然后发送RST包,直接重置TCP连接。两边都关闭了,服务端处理完的信息没有正常传给客户端。一、使用shudown优雅的关闭连接1.1、close()函数: #include <unistd.h> int close(int...转载 2021-12-16 14:30:34 · 1392 阅读 · 2 评论 -
UDP的使用总结
UDP是短连接,作为客户端的时候,就两步:1、socket2、sendto没有tcp的connect操作,使用netstat -an 参数也无法查看udp连接。当服务器端进程没有启动的时候,客户端进程也只需 socket 一次即可,在while循环中不断的sendto即可。...原创 2021-09-14 11:24:42 · 871 阅读 · 0 评论 -
float类型数据在报文中的传输方法
方法1:转化成整型传输假如保留float类型数据为两位小数,我们可以将float数据*100,转换成整型数据传输,对端收到后,再/100,转换成float类型。方法2:直接传输例如:传输float类型占4个字节,大端序传输以下环境为windows 系统下的 Qt 编译:1、.pro中添加LIBS += -lws2_322、cpp中添加头文件#include <WinSock2.h>3、程序代码#include <WinSock2.h>.原创 2021-12-16 13:03:21 · 5817 阅读 · 0 评论 -
select与阻塞和非阻塞
select与阻塞和非阻塞这2天一直和同事在讨论socket的非阻塞用在什么场合,并且认为在select时,使用的socket要设置成阻塞的,今天在网上搜了一下,才发现,原来,我们搞错了,一个套接字阻塞或者不阻塞,select就在那里,它可以针对这2种套接字使用,对任何一种套接字的轮询检测,超时时间都是有效的,区别就在于:当select完毕,认为该套接字可读时,1 .阻塞的套接字,会让read阻塞,直到读到所需要的所有字节;2 .非阻塞的套接字,会让read读完fd中的数据后就返回,但如果原转载 2021-12-15 15:08:42 · 1068 阅读 · 0 评论 -
linux下socket编程 select实现非阻塞模式多台客户端与服务器通信
select函数原型如下:int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);select系统调用是用来让我们的程序监视多个文件句柄(socket 句柄)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变有一片博文写得非常详细易理解http://blog.youkuaiyun.com/lingfengtengfei/转载 2021-12-15 14:54:21 · 728 阅读 · 0 评论 -
Linux下网络socket编程——实现服务器(select)与多个客户端通信
一、关于socket通信服务器端工作流程:调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定调用listen()函数监听socket() 函数创建的套接字,等待客户端连接 当客户端请求到来之后调用 accept()函数接受连接请求,返回一个对应于此连接的新的套接字,做好通信准备调用 write()/read() 函数和 send()/recv()函数进行数据的读写,通过 accept() 返回的套接字和客户端进行通信 关闭socket(c.转载 2021-12-15 10:50:54 · 2241 阅读 · 1 评论