文档详情

嵌入式 网络编程(上).ppt

发布:2017-05-20约9.34千字共49页下载文档
文本预览下载声明
第4章内容回顾 进程间通信的各种方法 信号 文件锁 管道和FIFO 信号量 消息队列 共享内存 第5章 网络编程(上) 预习检查 网络模型有哪两类? OSI、TCP/IP OSI有哪七层? 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 端口号的作用? 区别不同服务 TCP建立与关闭连接分别几次握手? 3次 4次 本章目标 理解网络基本概念 掌握OSI 与TCP/IP模型每一层的名称与功能 理解数据在网络中传输过程中,数据包封装和拆封装的过程 理解TCP协议下的客户端和服务器端模型 掌握TCP协议网络编程 本章结构 计算机的联网可以实现 使用远程资源 共享信息、程序和数据 分布处理 OSI分层思想 数据的封装 IP地址 使用IP协议通讯的主机都有IP地址 在计算机中,IPv4地址用一个32位无符号整数表示 端口号 TCP/UDP协议使用16位整数存储端口号,所以每个主机拥有 65,535 个端口 一些端口被IANA分配给指定应用 21: FTP 23: Telnet 80: HTTP RFC 1700 (大约有2000个保留端口) TCP和UDP的区别 TCP提供一种面向连接的、可靠的字节流服务 UDP是无连接的、不可靠的数据协议报 套接字(Socket) Socket(套接字)是一种通 讯机制,它包含一整套的调 用接口和数据结构的定义, 它给应用进程提供了使用如 TCP/UDP等网络协议进行网 络通讯的手段。 TCP客户服务器编程模型 客户端通常的调用序列是: 调用socket函数创建套接字。 调用connect连接服务器端。 调用I/O函数(read/write)与服务器端通讯。 调用close关闭套接字。 服务器端通常的调用序列为: 调用socket函数创建套接字。 调用bind指定本地地址和端口。 调用listen启动监听。 调用accept从已连接列队中提取客户连接。 调用I/O函数(read/write)与客户端通讯。 调用close关闭连接。 TCP的连接和关闭过程 字节序 不同体系结构的主机使用不同的字节序存储器中保存多字节整数 字节序分为大端和小端字节序 网络协议使用网络字节序 网络字节序即大端字节序 判断字节序 static int isBigEndian() { uint32_t thisx = 0 uint8_t *thisp = (uint8_t *)thisx; return (*thisp == 1) ? 1 : 0; } int main(int argc, char **argv) { printf(Byte order: %s Endian\n, isBigEndian() ?Big :Little); return 0; } 字节序转换函数 htonl 将一个32位整数由主机字节序转换成网络字节序。 htons 将一个16位整数由主机字节序转换成网络字节序。 ntohl 将一个32位整数由网络字节序转换成主机字节序。 ntohs 将一个16位整数由网络字节序转换成主机字节序。 通用地址族结构 typedef unsigned short sa_family_t; #include sys/socket.h struct sockaddr { sa_family_t sa_family; /* 地址族 */ char sa_data[14]; /* 地址值,实际可能更长 */ }; #define SOCK_MAXADDRLEN 255 /* 可能的最长的地址长度 */ 我们不会真的用到sockaddr结构,我们需要填写真正的地址族相关的地址结构,然后在传递给需要地址结构的函数时, 把指向该结构的指针转换成(struct sockaddr *)就传递进去 IPV4地址族结构 #include netinet/in.h struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { uint16_t sin_family; uint16_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; sin_family 地址族,如AF_INET, 主机字节序。 sin_port,端口号,16位值,网络字节序。 sin_addr,IPv4地址,一个32位整数,网络字节序。 。 域sin_addr由于历史原因被声明为类型struct in_addr, 但它实际上只包含一个32位的整数,这个类型定义在 netinet/in.h之中。 I
显示全部
相似文档