还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程 TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素 与客户端建立连接, 拨号 # 1 制定file_info file_info = { 'file_path': r'D:\lnh.python\pyproject\PythonReview\网络编程 len(every_data) phone.send(every_data) phone.close() client端 FTP上传下载文件的代码(升级版)(注:咱们学完网络编程就留 网络编程的作业 好了同学们,到了这儿,我们的网络编程socket就讲完了,大致就是这些内容,给大家留个作业:(你的努力的成果你自己是看的到的~!)
在前面的文章中,我们使用了UDP进行网络编程,这篇文章我们就来使用另一个TCP进行网络编程,我们知道UDP和TCP都是传输层协议,但是特点不同,前者无连接,不可靠传输,面向数据报,后者有连接,可靠传输 大体框架 1.1 补充 首先,在之前的UDP网络编程中,我们是直接使用的硬编码,例如退出码直接就设为1、2、3等,显然这并不是一个很好的选择,那么这里我们可以统一设计一个服务器的退出码,就像之前设计日志等级一样 (网卡)发来的连接我们都愿意接受,所以我们地址结构中的成员 sin_addr 需要设置为 INADDR_ANY,也就是IP地址此时为0,这在UDP网络编程时我们已经详细介绍了原因,这意味着我们服务端在使用 直接向目标服务器发起建立连接的请求 return 0; } 我们这里也不需要显式bind,关于原因我们在udp网络编程时已经说明了,那我们应该做什么呢? ,上层服务我们可以和UDP网络编程一样,直接在服务端主程序调用其他的服务,就比如之前实现的翻译和路由转发,然后在服务端接收数据时,将数据回调处理,最后将结果写回客户端。
Linux Socket编程 ---- 目录 前言 Socket的功能 Socket基础 Socket类型 基本结构 基本转换函数 基本Socket使用 TCP Socket实例 UDP Socket实例 疑难问题记录 总结 ---- 前言 socket(套接字)是网络编程编程的一种技巧。 本篇不涉及太底层的网络原理,仅说明socket的基本使用方法。主要参考《Linux网络编程》。本篇源码获取方式见文底小字。 = 3) { TCLT_LOG("usage ./tcp_client <ip> <port>. 网络编程非常有趣,能够实现天南海北之间的通讯,让远距离的人与人、人与物或者物与物之间产生联系,很有意思! 最后 用心感悟,认真记录,写好每一篇文章,分享每一框干货。
我们的网络编程主要就是针对应用层. 物理层我们考虑的比较少, 我们只考虑软件相关的内容. 因此很多时候我们直接称为 TCP/IP 四层模型. 再识协议 为什么要有 TCP/IP 协议? 之前我们在学习系统编程的时候知道访问公共资源就是临界资源,那么这里的局域网就是一个临界资源(以太网中, 任何时刻, 只允许一台机器向网络中发送数据)。 : 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 recvfrom(sockfd,buff,127,0,(strcut sockaddr*)&caddr,&len); printf("buff=%s\n",buff); if(strncmp(buff,"end",3) while(1) { char buff[128]={ 0}; printf("input\n"); fgets(buff,127,stdin); if(strncmp(buff,"end",3) sockfd,buff,127,0,(struct sockaddr*)&saddr,&len); printf("recv:%s\n",buff); } close(sockfd); exit(0); } 3.
在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。 这时通过源IP地址+源端口号就能够在网络上唯一标识发送数据的进程,通过目的IP地址+目的端口号就能够在网络上唯一标识接收数据的进程,此时就实现了跨网络的进程间通信。 一台机器上可能会有大量的进程,但并不是所有的进程都要进行网络通信,可能有很大一部分的进程是不需要进行网络通信的本地进程,此时PID虽然也可以标识这些网络进程的唯一性,但在该场景下就不太合适了。 为什么网络字节序采用的是大端?而不是小端? 网络字节序采用的是大端,而主机字节序一般采用的是小端,那为什么网络字节序不采用小端呢? socket编程接口 socket常见接口: 创建套接字:(TCP/UDP,客户端+服务器) int socket(int domain, int type, int protocol); 绑定端口号
TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。 OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的 Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。 TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。 int default_port = 8000; struct sockaddr_in servaddr; /*判断是否为合法输入 必须传入一个参数:服务器Ip*/ if(argc<3)
先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。 详解的作者还写了另外2本经典著作,《Unix环境高级编程》,《Unix网络编程》二卷本。 说明:搞Linux网络编程的,想学TCP/IP的一定要看大师W.Richard Stevens这六本书,基本上六本书看完基础也就搭好了。 ? ? ? ? ? ? 网络体系结构:linux内核中网络协议的设计与实现》 ? 一本在kernel实现网络功能的基础书籍,最好还是看英文版的,翻译的实在太烂了。有条件的还是看原版吧,没办法啊,中国的此类书籍基本上落后老美3-4年。结合linux源代码分析一书收获更多。
1.找到对方ip 2.找到应用程序端口 3.定义相同的通信协议 关于ip: 127.0.0.1本地回环地址,可用于ping网卡 xxx.xxx.xxx.255 广播地址,网段内的计算机都能收到 关于端口 对osi参考模型的简单解释: 我想把数据“你好”通过qq发送给网络中的另一台计算机 先根据应用测数据封装规则,将数据进行封装,传到表示层 表示层根据自己的数据封装规则,再将数据进行分装,传到会话层, 会话层根据自己的数据封装规则 ,再将数据进行封装,传到传输层, 传输层根据自己的数据封装规则,再将数据进行封装,传到网络层, 网络层根据自己的数据封装规则,再将数据进行封装,传到数据链路层 数据链路层根据自己的数据封装规则,再将数据进行封装 另一台计算机,在按照相反的方向,进行每一层的解析,最后到应用层找到 qq应用程序的端口,传输给socket接收 其中应用层的常见协议有::HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等
上篇文章我们实现了英译汉的网络字典,客服端向服务端发送英文,服务端接收数据后回调处理,将翻译后的中文再转发给客户端,这其实和EchoSever一样都是一对一的网络通信。 } private: int _socketfd; uint16_t _port; // 端口号 bool _isrunning; func_t _func; }; 3. = 3) { std::cerr << "Usage: " << argv[0] << " server_ip server_port" << std::endl; if(n < 0) { LOG(LogLevel::FATAL) << "sendto error"; return 3; ; if (n < 0) { LOG(LogLevel::FATAL) << "sendto error"; exit(3)
网络通信部分 首先我们网络通信不需要改变,只需要稍微修改添加一些新的变量,服务端在接收客户端发来的数据,然后回调去处理翻译这个动作,所以我们可以使用包装器function来包装一个函数指针,用于回调处理翻译 { LOG(LogLevel::FATAL) << "sendto error"; exit(3) LogLevel::DEBUG) << "进入到了翻译模块: " << word << "->" << iter->second; return iter->second; } 3. = 3) { std::cerr << "Usage: " << argv[0] << " server_ip server_port" << std::endl; if(n < 0) { LOG(LogLevel::FATAL) << "sendto error"; return 3;
一,基础概念 数据报文在网络中的点对点传输方式通常有以下三种: 单播(Unicast): 数据报文从一个发送端到一个接收端的通信方式。 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)进行网络通信 /udpserver port ltx@qsy:~/gitLinux/Linux_network/SocketUDP/EchoServer$ .
8位服务类型:3 位优先权字段(已经弃用),,4 位 TOS 字段, 和1 位保留字段(必须置为 0)。 4 位 TOS 分别表示:最小延时,,最大吞吐量, 最高可靠性,最小成本。 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。 网段划分 IP地址分为两部分:网络号和主机号 网络号: 保证相互连接的两个网段具有不同的标识; 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号; 不同的子网其实就是把网络号相同的主机放到一起 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致, 但 是主机号必须不能和子网中的其他主机重复。 ,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
在Linux系统中,我们可以通过ifconfig命令来查看自己机器的MAC地址: ether后面就是mac地址。 IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异 最初通信依赖MAC地址,但MAC只能在局域网生效,且无法分层管理。 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地址编写程序并非上策。 addrinfo结构体中,ai_ protocol 成员是指具体的网络协议,其含义和socket系统调用的第三个参数相同,它通常被设置为0。ai_fags 成员可以取表中的标志的按位或。 getnameinfo和getaddrinfo函数成功时返回0,失败时返回错误码,可能的错误码如表: Linux下strerror函数能将数值错误码error转换成易读的字符串形式,同样下面的函数可将表错误码转换成字符串形式
,它们确保了数据在复杂的网络环境中能够准确、高效地传输,在数据发送前,发送设备会在 IP 数据包的头部封装好源 IP 地址和目的 IP 地址,然后数据在网络中传输时,路由器等网络设备会根据这些地址信息进行路由选择和数据转发 /将一个 32 位的无符号整数从网络字节序转换为主机字节序 uint16_t ntohs(uint16_t netshort);//将一个 16 位的无符号整数从网络字节序转换为主机字节序 五、网络通信的本质 连接,一个用于控制命令的传输,另一个用于数据的传输 简单邮件传输协议(SMTP):用于发送电子邮件,它规定了邮件客户端如何将邮件发送到邮件服务器,以及邮件服务器之间如何进行邮件的转发 邮局协议(POP3) 互联网消息访问协议(IMAP):也是用于接收电子邮件的协议,与 POP3 不同的是,IMAP 允许用户在邮件服务器上管理邮件,而不仅仅是下载邮件到本地 域名系统(DNS):用于将域名解析为对应的 IP 地址,当用户在浏览器中输入域名时,DNS 服务器会将域名转换为对应的 IP 地址,以便浏览器能够找到对应的 Web 服务器 七、socket编程基础 1、调用接口 (一)创建描述符 #include <
相关API笔记(二) Linux网络编程高级I/O函数 1. pipe pipe函数用于创建一个管道,实现进程间通信 #include <unistd.h> //成功返回0,失败返回-1并设置errno file_descriptor_two); 参数: dup和dup2的参数都是文件描述符,具体作用如下: dup函数创建一个新的文件描述符,该新的描述符和原有文件描述符file_descriptor指向相同文件,管道或者网络连接 close(fd); } //使用dup2 void dup2_out(){ dup2(fd, STDOUT); printf("dup2"); close(fd); } 3. connfd ret = writev(connfd, iv, 2); //readv,分散读,把键盘的输入读出并放入到buf1,buf2中 ret = readv(STDIN_FILENO, iv, 2); 3.
个人主页:island1314 个人专栏:Linux—登神长阶 1. 客户端程序的端口号, 就是由操作系统从这个范围分配的 3. Socket 编程 6.1 socket 常见API Socket API 是一层网络编程接口,抽象了底层的网络协议,定义在 netinet/in.h 中。 实际上在网络上通信的时候套接字种类是比较多的,下面是常见的三种: unix 域间套接字编程--同一个机器内 原始套接字编程--网络工具 网络套接字编程--用户间的网络通信 设计者想将网络接口统一抽象化 --参数的类型必须是统一的,底层是一种多态的设计 运用场景: 网络套接字:运用于网络跨主机之间通信+本地通信 unix域间套接字: 本地通信 我们现在在使用网络编程通信时是应用层调传输层的接口,而原始套接字
网络编程基本概念 1.1 什么是套接字 套接字,也叫socket,是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。 一类是用户自己定义的,通常是大于1024并且小于65535的整型值; 1.3 ip地址的表示 通常我们在表达IP地址时习惯使用点分十进制表示的数值(或者是为冒号分开的十六进制Ipv6地址),而在socket编程中使用的则是二进制值 Ipv6地址),而在socket编程中使用的则是32位的网络字节序的二进制值,这就需要对这两个数值进行转换。 inet_ntoa(myaddr)); /* inet_ntop */ inet_ntop(AF_INET, &myaddr, ip, 16); puts(ip); return 0; } 3. 在linux中,最常用的是gethostbyname()和gethostbyaddr(),它们都可以实现IPv4/IPv6的地址和主机名之间的转化。