snifer

【技术分享】【原创】linux网络编程应用

0
阅读(4011)

嵌入式设计 竞赛开始了,进行的如火如荼啊,写写这方面的基础知识。

 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()



基于数据报的编程流程流程图,如图所示哦:





按照这个流程就有可以了,今天上了很久,写这么多吧。