嵌入式设计 竞赛开始了,进行的如火如荼啊,写写这方面的基础知识。
linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,它也是一种文件描述符。一个完整的Socket 都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每一个Socket 有一个本地的唯一Socket 号,由操作系统分配。
套接字有三种类型:
1、流式套接字(SOCK_STREAM)
流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP 保证了数据传输的正确性和顺序性。
2、数据报套接字(SOCK_DGRAM)
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。
3 、原始套接字。
原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
如:
struct sockaddr {
unsigned short sa_family; /* address族, AF_xxx */
char sa_data[14]; /* 14 bytes的协议地址 */
};
sa_family 一般来说, IPV4使用“AF_INET”。
sa_data 包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一起的。
struct sockaddr_in {
short int sin_family; /* Internet地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* Internet地址 */
unsigned char sin_zero[8]; /* 添0(和struct sockaddr一样大小)*/
};
这两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便,因为每一个机器内部对变量的字节存储顺序不同(有的系统是高位在前,底位在后,而有的系统是底位在前,高位在后 ),而网络传输的数据大家是一定要统一顺序的。所以对与内部字节表示顺序和网络字节顺序不同的机器,就一定要对数据进行转换。
下面给出套接字字节转换程序的列表:
1 htons()——“Host to Network Short” 主机字节顺序转换为网络字节顺序(对无符号短型进行操作2bytes)
2 htonl()——“Host to Network Long”主机字节顺序转换为网络字节顺序(对无符号长型进行操作4bytes)
3 ntohs()——“Network to Host Short”网络字节顺序转换为主机字节顺序(对无符号短型进行操作2bytes)
4 ntohl()——“Network to Host Long ”网络字节顺序转换为主机字节顺序(对无符号长型进行操作4bytes)
Linux提供将点分格式的地址转于长整型数之间的转换函数。如: inet_addr()能够把一个用数字和点表示IP 地址的字符串转换成一个无符号长整型。
inet_ntoa()(“ntoa”代表“Network to ASCII”);
包括:inet_aton, inet_ntoa, inet_addr等。
socket() bind() connect()
listen() accept() send()
recv() sendto() shutdown()
recvfrom() close() getsockopt() setsockopt() getpeername()
getsockname() gethostbyname()
gethostbyaddr() getprotobyname()
fcntl()
基于数据报的编程流程流程图,如图所示哦:
按照这个流程就有可以了,今天上了很久,写这么多吧。