网络编程基础之---struct sockaddr_in, struct sockaddr, struct in_addr

结构体

  • struct sockaddr_in
  • struct sockaddr
  • struct in_addr

这三个结构体在网络编程中经常忘记各自的成员,需要临时查阅。

struct sockaddr
{
	/***** 地址族 AF_xxx *****/
	unsigned short sa_family;
	/***** 14字节的协议地址 *****/
	char sa_data[14];
};

以上是通用的socket地址,具体到internet socket 用下面的结构体,二者可以进行类型转换

struct sockaddr_in
{	
	/***** 地址族 *****/
	short int sin_family;
	/***** 端口号 *****/
	unsigned short int sin_port;
	/***** Internet 地址 *****/
	struct in_addr sin_addr;
	/***** 与 struct sockaddr 一样长度的填充 *****/
	unsigned char sin_zero[8];
};

/***** 32位IP地址 *****/
sturct in_addr
{
	unsinged long s_addr;
};
/***** 也有可能定义为以下 *****/
struct in_addr {
	union
	{
    	struct 
   		{ 
    		u_char s_b1,s_b2,s_b3,s_b4;
    	} S_un_b;
    	
    	struct 
    	{ 
    		u_short s_w1,s_w2;
    	}S_un_w;
    	
    	u_long S_addr;//成员s_addr为长整形结构
	} S_un;
};

u_long htonl(u_long hostlong) : 将主机字节序转换为TCP/IP网络字节序
u_short htons(u_short hostshort):将主机字节序转换为tcp/ip网络字节序
inet_addr 是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)

/***
**一般用法如下:
***/
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET,SOCK_STREAM,0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MY_PORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&my_addr.sin_zero,8);
  • inet_addr:将网络地址转为网络二进制数字,返回的IP地址是网络序的。原型为:
unsigned long int inet_addr(const char* ip);
  • inet_aton:将网络地址转为网络二进制数字,与inet_addr的却别是,保存形参inp所指向的in_addr结构体中:
int inet_aton(const char* ip,struct in_addr* sin_addr);
  • inet_ntoa:将网络二进制数字转为网络地址:
char* inet_ntoa(struct in_addr* sin_addr);

升级版的转换函数:

字符串到网络地址

  1. inet_pton
  2. inet_ntop
    后面补充。。。。

你可能感兴趣的:(linux,嵌入式硬件)