项目名称 | 【苏嵌实训-嵌入式 linux C 第 10 天】 |
今日进度以及任务 | 对嵌入式linux网络编程的学习,以及对实训项目功能实现注意要点的学习,以便接下来的答辩 |
本日任务完成情况 (详细说明本日任务是否按计划完成,开发的量) | 1.socket的概述
Linux中的网络编程是通过socket接口来进行的,它也是一种文件描述符。通过它不仅可以在本地机器上实现进程间的通信,而且通过网络能够在不同的机器上的进程之间进行通信。socket也有一个类似打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立等操作都是通过socket来实现的。
socket类型常见有以下三种:
流式socket(SOCK_STREAM):流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,保证了数据的正确性和顺序性。 数据报socket(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,而且不保证是可靠、无差错的。使用数据报协议UDP。 原始socket:允许对底层协议进行直接访问,功能强大但使用不便,主要用于一些协议的开发。
2、地址及顺序处理 1)地址结构相关处理 一种常用的用于保存网络地址的数据结构sockaddr_in,其结构如下:
[csharp] view plaincopy
struct sockaddr_in { short int sin_family; /*地址族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin_addr; /*IP地址*/ unsigned char sin_zero[8]; /*填充0*/ }; 该结构sin_family字段可选常见值:
AF_INET:IPv4协议
AF_INET6:IPv6协议
AF_LOCAL:UNIX域协议
AF_LINK:链路地址协议
AF_KEY:密钥套接字
2)数据存储优先顺序 计算机数据存储有两种字节优先顺序:高位字节优先(大端模式)和低位字节优先(小段模式)。Internet上以高位字节优先的顺序在网络传输,而PC机通常采用小端模式,因此有时候需要对两个字节存储优先顺序进行转换。用到了4个函数:htons()、ntohs()、htonl()和ntohl()。h代表host,n代表network,s代表short,l代表long。通常16位的IP端口号用s,而IP地址用l。
3)地址格式转换 IP地址通常由数字加点(192.168.0.1)的形式表示,而在struct in_addr中使用的IP地址是由32位整数表示,为了转换可以使用下面三个函数:
[csharp] view plaincopy
int inet_aton(const char *cp,struct in_addr *inp); char *inet_ntoa(struct in_addr in); in_addr_t inet_addr(const char *cp); 其中inet_aton将a.b.c.d形式的IP转换为32位的IP,存储在inp指针里面;inet_ntoa是将32位IP转换为a.b.c.d的格式;inet_addr将一个点分十进制的IP转换成一个长整数型数。
4)名字地址转换 通常,人们在使用过程中不愿记忆冗长的IP地址,因此,使用主机名是很好的 |
本日开发中出现的问题汇总 | 使用函数时 对于数据存储优先顺序 网络字节序和主机字节序的转化
对于网络字节序: 按从高到低的顺序存储,在网络上使用统一的网络字节顺序(大端模式)
对于主机字节顺序: 就是数据的存储顺序是由cpu(就是主机的cpu)决定的,而与操作系统无关 |
本日未解决问题 | 对编程语言还有很多不足 |
本日开发收获 | 总结性的复习了一遍嵌入式linux的基本知识,同时也算半只脚进去嵌入式的门 |
其他 | 通过这十来天的学习,初步学习了嵌入式开发的知识,对后面的学习也更有帮助 |