在前面的文章中,我们使用了UDP进行网络编程,这篇文章我们就来使用另一个TCP进行网络编程,我们知道UDP和TCP都是传输层协议,但是特点不同,前者无连接,不可靠传输,面向数据报,后者有连接,可靠传输 大体框架 1.1 补充 首先,在之前的UDP网络编程中,我们是直接使用的硬编码,例如退出码直接就设为1、2、3等,显然这并不是一个很好的选择,那么这里我们可以统一设计一个服务器的退出码,就像之前设计日志等级一样 (网卡)发来的连接我们都愿意接受,所以我们地址结构中的成员 sin_addr 需要设置为 INADDR_ANY,也就是IP地址此时为0,这在UDP网络编程时我们已经详细介绍了原因,这意味着我们服务端在使用 直接向目标服务器发起建立连接的请求 return 0; } 我们这里也不需要显式bind,关于原因我们在udp网络编程时已经说明了,那我们应该做什么呢? ,上层服务我们可以和UDP网络编程一样,直接在服务端主程序调用其他的服务,就比如之前实现的翻译和路由转发,然后在服务端接收数据时,将数据回调处理,最后将结果写回客户端。
HTTP网络编程 网络接口文档 用来描述客户端和服务端的数据交互 Http的格式规范 请求部分 请求消息行:定义请求类型,请求的地址,http的版本号 请求消息头:定义请求的消息头 请求消息内容实体:消息的内容实体 : zh-CN,zh;q=0.8 Cookie: BAIDUID=BECE0B98C5D5A8EA4C5A93221901CC58:FG=1; BAIDUPSID=BECE0B98C5D5A8EA4C5A93221901CC58 ; BDUSS=l1MmM3MEVEclRYR1RZc1ZJTnBDb2RBUTY1YktTUFc0a2pBYVlHNkxOZDk4N0JVQVFBQUFBJCQAAAAAAAAAAAEAAABoRLMjd2FuZ2Rha2U4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH1miVR9ZolUVm 因此在主线程中调用异步任务时需要设置回调 开发过程中UI控制层访问网络最关心的是什么 UI控制层访问网络的目的是为了获得网络返回数据,UI层最关心返回的数据结果;在java开发中,一切皆有面向对象的思想 如何为UI控制层封装好网络请求 异步 + 回调 + 接口文档规范 http 后台任务 后台任务是处理 及时性不高的任务,不需要耗用太多资源去做网络请求,UI也不是很关心数据返回 通常应用程序只会给到一个线程去处理所有的后台任务
HTTP网络编程 网络接口文档 用来描述客户端和服务端的数据交互 Http的格式规范 请求部分 请求消息行:定义请求类型,请求的地址,http的版本号 请求消息头:定义请求的消息头 请求消息内容实体:消息的内容实体 : zh-CN,zh;q=0.8 Cookie: BAIDUID=BECE0B98C5D5A8EA4C5A93221901CC58:FG=1; BAIDUPSID=BECE0B98C5D5A8EA4C5A93221901CC58 ; BDUSS=l1MmM3MEVEclRYR1RZc1ZJTnBDb2RBUTY1YktTUFc0a2pBYVlHNkxOZDk4N0JVQVFBQUFBJCQAAAAAAAAAAAEAAABoRLMjd2FuZ2Rha2U4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH1miVR9ZolUVm 因此在主线程中调用异步任务时需要设置回调 开发过程中UI控制层访问网络最关心的是什么 UI控制层访问网络的目的是为了获得网络返回数据,UI层最关心返回的数据结果;在java开发中,一切皆有面向对象的思想 如何为UI控制层封装好网络请求 异步 + 回调 + 接口文档规范 http 后台任务 后台任务是处理 及时性不高的任务,不需要耗用太多资源去做网络请求,UI也不是很关心数据返回 通常应用程序只会给到一个线程去处理所有的后台任务
Linux Socket编程 ---- 目录 前言 Socket的功能 Socket基础 Socket类型 基本结构 基本转换函数 基本Socket使用 TCP Socket实例 UDP Socket实例 疑难问题记录 总结 ---- 前言 socket(套接字)是网络编程编程的一种技巧。 本篇不涉及太底层的网络原理,仅说明socket的基本使用方法。主要参考《Linux网络编程》。本篇源码获取方式见文底小字。 gethostbyaddr()函数 —— 通过一个IPv4的地址来获取主机信息。 getprotobyname()函数 —— 获得网络协议名。 网络编程非常有趣,能够实现天南海北之间的通讯,让远距离的人与人、人与物或者物与物之间产生联系,很有意思! 最后 用心感悟,认真记录,写好每一篇文章,分享每一框干货。
之前我们在学习系统编程的时候知道访问公共资源就是临界资源,那么这里的局域网就是一个临界资源(以太网中, 任何时刻, 只允许一台机器向网络中发送数据)。 数据包封装和分用 数据封装的过程: 数据分用的过程: 跨网络传输流程图 IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址,对于 IPv4 来说, IP 地址是一个 4 字节, 32 : IP 网络层存在的意义: 提供网络虚拟层, 让世界的所有网络都是 IP 网络, 屏蔽 最底层网络的差异 Socket 编程预备 理解源 IP 地址和目的 IP 地址 IP在网络中是用来标识主机的唯一性 sockadder结构 socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、 IPv6,以及 后面要讲的 UNIX Domain Socket. 关于Socket套接字编程后续文章会详细讲解。
文章目录 前言 一、UDP是什么 二、UDP 数据报服务特点 二、UDP 编程流程 1.服务器 2.客户端 3.输出结果 总结 前言 浅谈UDP。 二、UDP 编程流程 1.服务器 代码如下(示例): int main() { int sockfd = socket(AF_INET,SOCK_DGRAM,0); assert( sockfd
缺点: 功能单一,没有个性化设置,响应速度相对慢一些. 2.网络通信原理 80年代,固定电话联系,(还没有推广普通话) 1. 两台电话之间一堆物理连接介质连接. 2. 拨号,锁定对方电话的位置. 你必须知道对方的mac地址你才可以以广播的形式发消息.实际上,网络通信中,你只要知道对方的IP与自己的IP即可. 缓冲区存在如果你的网络波动,保证数据的收发稳定,匀速. 获取bytes形式的报头的总字节数 len_head_dic_json_bytes = len(head_dic_json_bytes) 5.将不固定的int总字节数编程固定长度的 形式的报头的总字节数 four_head_bytes = struct.pack('i', len_head_dic_json_bytes) # 5 将不固定的int总字节数编程固定长度的
为什么网络字节序采用的是大端?而不是小端? 网络字节序采用的是大端,而主机字节序一般采用的是小端,那为什么网络字节序不采用小端呢? socket编程接口 socket常见接口: 创建套接字:(TCP/UDP,客户端+服务器) int socket(int domain, int type, int protocol); 绑定端口号 IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址。 IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6。 socket API可以都用struct sockaddr*类型表示,在使用的时候需要强制转化成sockaddr_in;这样的好处是程序的通用性,可以接收IPv4、IPv6,以及UNIX Domain
TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。 OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的 Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。 TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。 sin_port; /*网络字节序表示的端口号*/ struct in_addr sin_addr; /*ipv4地址*/ } /* Internet address. */ struct in_addr
《计算机网络系统方法(原书第4版)》 作 者: (美)彼得森(Peterson,L.L.) 详解的作者还写了另外2本经典著作,《Unix环境高级编程》,《Unix网络编程》二卷本。 说明:搞Linux网络编程的,想学TCP/IP的一定要看大师W.Richard Stevens这六本书,基本上六本书看完基础也就搭好了。 ? ? ? ? ? ? 网络体系结构:linux内核中网络协议的设计与实现》 ? 一本在kernel实现网络功能的基础书籍,最好还是看英文版的,翻译的实在太烂了。有条件的还是看原版吧,没办法啊,中国的此类书籍基本上落后老美3-4年。结合linux源代码分析一书收获更多。
上篇文章我们实现了英译汉的网络字典,客服端向服务端发送英文,服务端接收数据后回调处理,将翻译后的中文再转发给客户端,这其实和EchoSever一样都是一对一的网络通信。 local.sin_port = htons(_port); local.sin_addr.s_addr = INADDR_ANY; // 绑定IPv4地址结构 route.MessageRoute(sockfs, message, client); }); usvr->Init(); usvr->Start(); return 0; } 4. const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 参数说明 af:地址族,如 AF_INET (IPv4) Presentation to Network) int inet_pton(int af, const char *src, void *dst); 参数 af:地址族 - AF_INET (IPv4)
网络通信部分 首先我们网络通信不需要改变,只需要稍微修改添加一些新的变量,服务端在接收客户端发来的数据,然后回调去处理翻译这个动作,所以我们可以使用包装器function来包装一个函数指针,用于回调处理翻译 local.sin_addr.s_addr = inet_addr(_ip.c_str()); // TODO local.sin_addr.s_addr = INADDR_ANY; // 绑定IPv4地址结构 Udpserver.cc 服务端主程序已经有网络通信的功能了,我们现在只需要实例化字典对象,先加载字典到哈希表中,再在网络通信时进行翻译 代码如下: #include <memory> #include Enable_Console_Log_Strategy(); // 字典对象提供翻译功能 Dict dict; dict.LoadDict(); // 网络服务器对象提供网络通信功能 buffer[m] = 0; std::cout << buffer << std::endl; } } return 0; } 运行测试一下: 4.
中的编程实现 在嵌入式Linux应用开发中,可以使用socket编程接口来实现UDP协议的数据传输。 具体步骤如下: 创建socket:使用socket()函数创建一个新的socket,指定使用的地址类型和协议(如PF_INET和SOCK_DGRAM表示使用IPv4和UDP协议)。 缺乏拥塞控制:UDP 协议没有拥塞控制机制,当网络拥塞时,可能会导致大量数据包丢失,影响网络性能。 九、嵌入式开发注意事项 9.1. ,开发者可以在嵌入式Linux系统中实现高效的网络通信,特别适合需要快速响应、可接受少量数据丢失的物联网应用场景。 Linux 网络编程 - UDP 协议详解:该博客对 UDP 协议在 Linux 环境下的特点、首部格式、校验和计算等方面进行了详细的讲解,并对比了 UDP 和 TCP 协议的优劣,同时给出了一些 UDP
一,基础概念 数据报文在网络中的点对点传输方式通常有以下三种: 单播(Unicast): 数据报文从一个发送端到一个接收端的通信方式。 组播的实现需要设置组播地址 在IPv4中组播的地址范围是:224.0.0.0到239.255.255.255。 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('', MCAST_PORT)) mreq = struct.pack("4sl designs-examples-using-multicasting-af-inet https://os.mbed.com/handbook/Socket https://subingwen.cn/linux
在上篇文章中,我们已经铺垫了一些前置知识,这一篇文章我们就来实现UDP网络编程,实现一个Echo Server,就是客户端给服务端发送一条消息,服务端接收后,再转发给客户端,回显出来 1. :操作系统内核实现了复杂的TCP/IP协议栈,用户不能直接操作这些协议栈,所以我们说它是一组API,是应用程序与网络协议栈之间的编程接口。 这么说也没有毛病 在哲学上:我们认为它是一种抽象和解耦,它隐藏了网络协议的所有复杂性,让程序员可以用“打开-读-写-关闭”这种类似文件操作的简单模式来进行网络编程。 那还说啥了,更没毛病了 用一句话来概括,Socket(套接字)是网络通信的端点,是操作系统提供给应用程序的一组编程接口(API),应用程序通过调用这套接口,就可以利用网络协议栈(如TCP/IP)进行网络通信 关于网络字节序在上篇文章中做过介绍 sin_addr: 作用:存储IPv4地址。
IP协议的协议头格式 4位版本号 :指定IP协议的版本,对于IPv4,版本号就是4。 4位首部长度:表名IP协议报头的长度,单位是4字节,所以IP协议报头的最大长度是15*4=60字节。 8位服务类型:3 位优先权字段(已经弃用),,4 位 TOS 字段, 和1 位保留字段(必须置为 0)。 4 位 TOS 分别表示:最小延时,,最大吞吐量, 最高可靠性,最小成本。 网段划分 IP地址分为两部分:网络号和主机号 网络号: 保证相互连接的两个网段具有不同的标识; 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号; 不同的子网其实就是把网络号相同的主机放到一起 *的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1; IP地址的数量限制 我们知道,IP 地址(IPv4)是一个 4 字节 32 位的正整数。 ; IPv6:IPv6 并不是 IPv4 的简单升级版。
在Linux系统中,我们可以通过ifconfig命令来查看自己机器的MAC地址: ether后面就是mac地址。 IP地址是在IP协议中,用来标识网络中不同主机的地址。 对于IPv4来说,IP地址是一个4字节,32位的整数。 IP层的引入屏蔽了底层网络差异(如以太网、Wi-Fi、光纤),通过逻辑化的IP地址实现全球路由,让不同技术的网络能无缝互联。 二、socket编程预备 IP在网络中,用来标识一个主机的唯一性。 我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程 ; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系 ? 2.4、sockaddr 结构 socket API 是一层抽象的网络编程接口 , 适用于各种底层网络协议 , 如 IPv4 、 IPv6, 以及后面要讲的 UNIX Domain Socket.
好在Linux内核检测到TCP紧急标志时,将通知应用程序有带外数据需要接收。内核通知应用程序带外数据到达的两种常见方式是: 1O复用产生的异常事件和SIGURG信号。 对这种情况,Linux给开发人员提供的解决方案是:对监听socket设置这些socket选项,那么accept返回的连接socket将自动继承这些选项。 网络信息API 利用域名获取IP地址 IP地址比域名发生变更的概率要高,所以利用IP地址编写程序并非上策。 若是 IPV4 ,则此变量中存有 AF_INET。 h_length:保存IP地址长度。若是 IPV4 地址,因为是 4 个字节,则保存4;IPV6 时,因为是 16 个字节,故保存16。 addrinfo结构体中,ai_ protocol 成员是指具体的网络协议,其含义和socket系统调用的第三个参数相同,它通常被设置为0。ai_fags 成员可以取表中的标志的按位或。
一、IP地址 1、概念 IP地址是在IP协议中,用来标识网络中不同主机的地址,它有两个版本,一个是IPv4,一个是IPv6,IPv4是一个32位4字节的数字,通常使用点分十进制的字符串表示IP地址,例如 192.168.1.1,IPv6是一个108位16字节的数字,一般来说,现在在世界上使用规模最大的就是IPv4,但是因为4字节能表示的数字只有不到43亿,随着时代的进步,入网设备从电脑和手机逐渐变成了除了它们以外其他的例如空调 网络层主要负责将数据包从源主机传输到目标主机,进行路由选择和寻址,该层的常见协议有: 网际协议(IP):是 TCP/IP 协议族的核心协议之一,分为 IPv4 和 IPv6 两个版本,IPv4 而不仅仅是下载邮件到本地 域名系统(DNS):用于将域名解析为对应的 IP 地址,当用户在浏览器中输入域名时,DNS 服务器会将域名转换为对应的 IP 地址,以便浏览器能够找到对应的 Web 服务器 七、socket编程基础 socket(int domain, int type, int protocol); 返回值:成功返回套接字描述符sockfd,失败返回-1 domain:指定通信域 通信域 意义 AF_INET IPv4网络协议
相关API笔记(二) Linux网络编程高级I/O函数 1. pipe pipe函数用于创建一个管道,实现进程间通信 #include <unistd.h> //成功返回0,失败返回-1并设置errno file_descriptor_two); 参数: dup和dup2的参数都是文件描述符,具体作用如下: dup函数创建一个新的文件描述符,该新的描述符和原有文件描述符file_descriptor指向相同文件,管道或者网络连接 count: 指定在文件描述符in_fd和out_fd之间传输的字节数 4. mmap和munmap mmap用于申请一段内存空间,这段内存可以作为进程间通信的共享内存,可以将文件直接映射到其中。