snifer

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

0
阅读(2461)

嵌入式系统中采用了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编程:

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