snifer

【原创】嵌入式系统无线网络编程之万丈高楼平地起

0
阅读(2296)

嵌入式系统中采用了OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。

在嵌入式网络编程中第一重要的内容就是套接字(socket)

套接字定义

在Linux中的网络编程是通过socket接口来进行的。套接字(socket)是一种特殊的I/O接口,它也是一种文件描述符。socket是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。

每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的。

套接字类型

1、流式套接字(SOCK_STREAM)

流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的可靠性和顺序性。

2、数据报套接字(SOCK_DGRAM)

数据报套接字定义了一种无可靠、面向无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用数据报协议UDP。

3、3、原始套接字(SOCK_RAW)

原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

2 地址及顺序处理
地址结构处理

struct sockaddr

{

unsigned short sa_family; /*地址族*/

char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/

};

struct sockaddr_in

{

short int sa_family; /*地址族*/

unsigned short int sin_port; /*端口号*/

struct in_addr sin_addr; /*IP地址*/

unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/

};

这两个数据类型是等效的,可以相互转化,通常sockaddr_in数据类型使用更为方便。在建立socketadd或sockaddr_in后,就可以对该socket进行适当的操作了。



地址及顺序处理

地址格式转化

用户在表达地址时通常采用点分十进制表示的数值字符串(或者是以冒号分开的十进制IPv6地址),而在通常使用的socket编程中所使用的则是二进制值(例如,用in_addr结构和in6_addr结构分别表示IPv4和IPv6中的网络地址),这就需要将这两个数值进行转换。

这里在IPv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函数有inet_pton()和inet_ntop()。inet_pton()函数是将点分十进制地址字符串转换为二进制地址而inet_ntop()是inet_pton()的反操向作,将二进制地址转换为点分十进制地址字符串。

名字地址转换 }gthostbyname()和gethostbyaddr()都涉及到一个hostent的结构体

struct hostent

{

char *h_name; /*正式主机名*/

char **h_aliases; /*主机别名*/

int h_addrtype; /*地址类型*/

int h_length; /*地址字节长度*/

char **h_addr_list; /*指向IPv4或IPv6的地址指针数组*/

}


名字地址转换
getaddrinfo()函数涉及到一个addrinfo的结构体

struct addrinfo

{

int ai_flags; /*AI_PASSIVE, AI_CANONNAME;*/

int ai_family; /*地址族*/

int ai_socktype; /*socket类型*/

int ai_protocol; /*协议类型*/

size_t ai_addrlen; /*地址字节长度*/

char *ai_canonname; /*主机名*/

struct sockaddr *ai_addr; /*socket结构体*/

struct addrinfo *ai_next; /*下一个指针链表*/

}

3 套接字编程


函数说明
socket() 创建套接字
bind() 绑定本机端口
connect() 建立连接
listen() 监听端口
accept() 接受连接
recv(), read(), recvfrom() 数据接收
send(), write(), sendto() 数据发送

lose(), shutdown() 关闭套接字

二、如何使用TCP时Socket编程


使用UDP时Socket编程:

可以说学会套接字编程,走遍天下都不怕,在无线传输中才能打好基础。






Baidu
map