网络编程基础
本文文件夹:
一:网络地址结构体的介绍
二:大端序和小端序的简介以及它们转换的函数接接口
一:网络地址结构体的介绍
Linux中的网络编程通过Socket(套接字)接口实现,Socket是一种特殊的文件描写叙述符。
套接字socket有三种类型:
• 流式套接字(SOCK_STREAM):流式的套接字能够提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP保证了传输数据的正确性和顺序性。
• 数据报套接字(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,而且不保证可靠,无差错,它使用数据报协议UDP。
•原始套接字(SOCK_RAM):原始套接字同意对低层协议如IP或ICMP直接訪问,主要用于新的网络协议的測试等。
网络地址结构体:
struct sockaddr
{
u_short sa_family; //Sa_family:地址族。採用“AF_xxx”的形式,如:AF_INET。
char sa_data[14]; //Sa_data:14字节的特定协议地址。
}
struct sockaddr_in
{
short int sin_family; /* Internet地址族*/
unsigned short int sin_port; /* 端口号*/
struct in_addr sin_addr; /* IP地址*/
unsigned char sin_zero[8]; /* 填0 */
}
struct in_addr
{
unsigned long s_addr;
}
S_addr: 32位的地址。
编程中一般并不直接针对sockaddr数据结构操作,而是使用与sockaddr等价的sockaddr_in数据结构。
二:大端序和小端序的简介以及它们转换的函数接接口
IP地址通常由数字加点(192.168.0.1)的形式表示。而在struct in_addr中使用的是IP地址是由32位的整数表示
的。为了转换我们能够使用以下两个函数:
int inet_aton(const char *cp,struct in_addr *inp)
char *inet_ntoa(struct in_addr in)
函数里面a 代表ascii n代表network.第一个函数表示将a.b.c.d形式的IP转换为32位的IP,存储在inp指针里面。第二个是将32位IP转换为a.b.c.d的格式。
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与详细的CPU类型、操作系统等无关。从而可以保证数据在不同主机之间传输时可以被正确解释。网络字节顺序採用big endian排序方式。
传输时可以被正确解释。网络字节顺序採用big endian排序方式。
32bit的整数(0x01234567)从地址0x100開始:
小端字节序:
大端字节序:
字节序转换
htons把unsigned short类型从主机序转换到网络序;
vhtonl把unsigned long类型从主机序转换到网络序。
vntohs把unsigned short类型从网络序转换到主机序;
vntohl把unsigned long类型从网络序转换到主机序;
注意:在实验编码中,有非常多的与地址相关的函数,如htons(),thonl(),inet_addr()等。是我们进行网络编程必须掌握的相关知识,当中htonl用于将本机上的long型数据转换为网络上的long型数据,htons()转化为的对象时short型的,inet_addr()能够将字符串表示的ip地址转化为整形的ip地址。