![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
socket网络编程
文章平均质量分 59
Mister Zhu
云在青天水在瓶
展开
-
【c++】25.事件驱动的详解
事件驱动和异步IO 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求; (2)每收到一个请求,创建一个新的线程,来处理该请求; (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 上面的几种方式,各有千秋, 第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。 第(2)种方式,由于要涉及到...转载 2021-05-08 10:29:37 · 1157 阅读 · 0 评论 -
【c++】27.事件驱动、IO复用、sellect、poll、epoll三者的区别
事件驱动的理解: 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而...转载 2021-05-08 20:01:32 · 814 阅读 · 0 评论 -
【c++】26.浅谈“事件驱动”、select、poll、epoll
浅谈“事件驱动”1.通常,我们设计一个事件处理模型的程序有两种思路:一种是通过轮询的方式;一种通过事件驱动的方式,事件驱动方式也被称为消息通知方式。下面举个简单收信的例子,来说明两种实现方式的不同:(1) 传统的邮件,邮递员把它放到你家的邮箱里。因为你不知道什么时候有邮件,所以你要经常去检查邮箱,最近到底有没有邮件。这就是所谓的轮询方式,你要时常去检查,有没有发生事件发生,当你检查到有事件发生时,你采取相应措施,处理相关事件。(2)现代的电子邮件,你不用自己去查看邮箱,如果有新邮件,电脑转载 2021-05-08 19:58:25 · 773 阅读 · 0 评论 -
【Socket网络编程】17. recv() 函数详解
recv函数 int recv( SOCKET s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度;第四个参数一般置0。同步Socket的recv函数的执行流程 当应用程序调用recv函数时: recv先等待 SOCKE...转载 2021-06-29 19:01:12 · 29756 阅读 · 1 评论 -
【Socket网络编程】16.UDP 循环读取recvfrom() 与 循环发送 sendto()
recv()和send()的第三个参数len都是指定第二个参数buf的长度。1.recv()从输入缓冲区中拷贝数据到应用程序缓冲区buf,在此需要指定buf的长度。他的长度一般在定义缓冲buf时就定下来了,如constexpr std::size_t kBufferSize = 1024;...uint8_t buf[kBufferSize] = {0}; //定义buf时,长度也定下来了std::memset(buf, 0, kBufferSize);...length = data_原创 2021-06-29 18:56:27 · 6776 阅读 · 1 评论 -
【Socket网络编程】15. 发送端和接收端数据大小不一致时 的分析
发送端发送的数据大小和频率 与 接收端接收的数据大小和频率都可以不一样;例1:发送端以20Hz的频率,每次发100字节大小的数据包;接收端以10Hz的频率,每次能接收400字节的大小的数据包;那么,接收端每次接收的数据包,可能包含发送端好几次发来的数据。例2:发送端以20Hz的频率,每次发400字节大小的数据包;接收端以10Hz的频率,每次能接收100字节的大小的数据包;那么,接收端每次接收的数据包,只是发送端一次发来的数据的一部分。...原创 2021-06-29 14:30:55 · 2397 阅读 · 0 评论 -
【Socket网络编程】14. perror()、errno 的使用
经常会在cocket在见到errno和perror(),他们是什么呢?函数定义:void perror(const char *s); perror ("open_port");他是c语言库函数,需要包含头文件(不可以掉了这个头文件):#include <stdio.h>//包含perror的头文件函数说明perror ( )用 来 将 上 一 个函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原转载 2021-06-29 12:07:13 · 1894 阅读 · 0 评论 -
【socket网络编程】13.把udp数据写入发送缓冲区sendto()代码实例
向发送缓冲区写入udp数据,下面这例子是说明,一个udp数据包加上ip信息在网络层进行封装时,可能需要多次写入才能完成写进发送缓冲区,使用一个while循环来实现。@zhz: 写入发送缓冲区的数据是ip数据包,并没有封装mac地址,所以在将发送缓冲区中的数据发送出去后,加上mac地址封装为以太网数据包时,如果数据包太大,还得分成多帧进行发送。size_t UdpStream::write(const uint8_t* data, size_t length, uint8_t flag) { size原创 2021-06-16 17:35:05 · 656 阅读 · 3 评论 -
【Socket网络编程】12. send()、recv()、sendto() 和 recvfrom() 函数解析
send、recv、sendto和recvfrom函数解析send、recv和sendto、recvfrom,一般情况下,send、recv在TCP协议下使用,sendto、recvfrom在UDP协议下使用,也可以在TCP协议下使用,不过用的很少。1、send()这里只描述同步socket的send函数的执行流程。s:套接字 | buf:存储发送数据 | len:发送数据长度当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函转载 2021-06-16 12:06:24 · 4733 阅读 · 0 评论 -
【Socket网络编程】11.网络编程中的 数据封装 和 数据拆封
1.数据封装:是指将协议数据单元封装在一组协议头和协议尾中的过程。由于用户传输的数据一般比较大,一次性发送出去十分困难,于是需要把数据分成多段,再按照一定的次序发送出去,这个过程就需要对数据进行封装:⑴ 应用层准备数据–>⑵ 传输层接受应用层数据添加上TCP的控制信息(称为TCP头部),这个数据单元叫段(segment),将段交给网络层–>⑶ 网络层接收到段,再添加上IP头部,这个数据单元叫包(packet),将包交给数据链路层–>⑷ 数据链路层将包再添加上MAC转载 2021-06-16 09:25:09 · 2122 阅读 · 0 评论 -
【Socket网络编程】7.以太网数据包、IP数据包、UDP数据包
以太网数据包、ip数据包、udp数据包【以太网数据包】即“帧”,每一帧分成两个部分:标头(Head)和数据(Data)。“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;"数据"则是数据包的具体内容。“标头”的长度,固定为 18 字节。"数据"的长度,最短为 46 字节,最长为 1500 字节。因此,整个"帧"最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。####【IP数据包】根据 IP 协议发送的数据,就叫做 IP 数据包。不难想象,其中原创 2021-04-22 20:27:44 · 1240 阅读 · 0 评论 -
【Socket网络编程】6.两个既能收也能发的udp客户端进行通信的原理
两个既能收也能发的udp客户端进行通信的原理发送数据时可能会用到INADDR_BROADCAST代表255.255.255.255的广播地址,作用范围只能在当前局域网。接收数据可能会用到INADDR_ANY,它是在socket绑定bind()时使用了,会监听本机所有网卡的ip。本机socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)创建套接字后,只赋予其所使用的协议为udp、数据报,并未分配地址。接着setsockopt(fd, SOL_SOCKET, SO_BROAD原创 2021-04-21 11:54:52 · 701 阅读 · 0 评论 -
【Socket网络编程】5.单播、多播(组播)、广播
【单播】、【多播(组播)】、【广播】https://blog.csdn.net/daaikuaichuan/article/details/83474089####【单播】用于两个主机之间的端对端通信,【广播】用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是【多播】的用途。###【IP多播】(也称多址广播或组播)技术,是一种允许一台或原创 2021-04-22 20:28:51 · 956 阅读 · 0 评论 -
【Socket网络编程】4.tcp和udp的客户端和服务端收发流程
tcp和udp的客户端和服务端收发流程1.udp服务器流程:1.创建serverSocket2.设置服务器地址 serverAddr3.将serverSocket和serverAddr绑定 bind4.开始进行读写 sendto和recvfrom5.关闭serverSocket2.udp客户端流程1.创建clientSocket2.设置服务器地址 serverAddr3.可选 设置clientAddr并和clientSocket(一般不用绑定)4.进行发送操作 sendto5.关闭c原创 2021-04-21 11:56:00 · 399 阅读 · 0 评论 -
【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr
字节序转换函数htons、htonl地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr1.字节序转换函数#include <arpa/inet.h>// 将 32位主机字节序数据转换成网络字节序数据//(h:host, n:net,l:long)uint32_t htonl(uint32_t hostint32);// 将 16 位主机字节序数据转换成网络字节序数据uint16_t htons(uint16_t hostint16);//原创 2021-04-22 20:30:10 · 1008 阅读 · 0 评论 -
【Socket网络编程】2.sockaddr 和 sockaddr_in
sockaddr 和 sockaddr_in参考 https://blog.csdn.net/ZWE7616175/article/details/80252048sockaddr在/usr/include/bits/socket.h下,查看sockaddr的结构:struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. 协议族 */ char sa_da原创 2021-04-21 12:57:42 · 245 阅读 · 0 评论 -
【Socket网络编程】1.bind()和 INADDR_ANY 解析
bind()和 INADDR_ANY 解析linux网络编程之UDP通信 http://blog.sina.com.cn/s/blog_c2f250bd0101ii14.html 该博客讲了tcp和udp的一些常用参数bind()解析当使用socket()创建套接字后,只赋予其所使用的协议,并未分配地址。在接受其它主机的连接前,必须先调用bind()为套接字分配一个地址。bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,关联一个指定的本地端口和IP地址。bind()原创 2021-04-21 12:55:42 · 2352 阅读 · 0 评论 -
【Socket网络编程】0.socket TCP/UDP 可参考 【lx青萍之末】 的 【Linux网络编程 】系列博客
关于socket TCP/UDP 相关知识 可参考博主【 lx青萍之末】 的 【Linux网络编程 】系列博客https://blog.csdn.net/daaikuaichuan/category_7980354.html?spm=1001.2014.3001.5482原创 2021-04-21 11:07:17 · 183 阅读 · 0 评论