在嵌入式网络编程中第一重要的内容就是套接字(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编程:
可以说学会套接字编程,走遍天下都不怕,在无线传输中才能打好基础。