套接字編程簡介
- 套接字地址結(jié)構(gòu)
- inet_aton、inet_addr和inet_ntoa函數(shù)
- inet_pton 和 inet_ntop函數(shù)
1、套接字地址結(jié)構(gòu)
ipv4套接字地址結(jié)構(gòu)
<netinet/in.h>
struct in_addr{
in_addr_t s_addr;
}
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_adr sin_addr;
char sin_aero[8];
}
sin_addr 是ip地址
sin_port 是端口號
sin_family 是指具體的協(xié)議 套接字地址結(jié)構(gòu)的地址族
通用套接字地址結(jié)構(gòu)
<sys/socket.h>
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
}
由于套接字函數(shù)是在ANSIC之前定義的爽锥,沒有void*類型的指針,所以在使用某些函數(shù)時需要將套接字地址結(jié)構(gòu)強(qiáng)制轉(zhuǎn)化為該結(jié)構(gòu)
IPV6的套接字地址結(jié)構(gòu)
<netinet/in.h>
struct in6_addr{
uint8_t s6_addr[16];
};
#define SIN6_LEN
struct sockaddr_in6 {
uint8_t sin6_len;
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id
};
新的通用套接字地址接結(jié)構(gòu)
<netinet/in.h>
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
};
2值骇、inet_aton害驹、inet_addr和inet_ntoa函數(shù)
inet_aton、inet_addr和inet_ntoa在點(diǎn)分十進(jìn)制數(shù)串(206.168.112.96)與它長度為32位的網(wǎng)絡(luò)字節(jié)序二進(jìn)制值間轉(zhuǎn)換IPV4地址苟耻。
#include<arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
char *inet_ntoa(struct in_addr inaddr);
第一個函數(shù)inet_aton將strptr所指C字符串轉(zhuǎn)換成一個32位的網(wǎng)絡(luò)字節(jié)序二進(jìn)制值篇恒,并通過指針addrptr來存儲。若成功則返回1凶杖,否則返回0 inet_addr進(jìn)行相同的轉(zhuǎn)換胁艰,但是當(dāng)出錯時該函數(shù)返回INADDR_NONE常值。因?yàn)樗亩M(jìn)制值被用來指示該函數(shù)失敗,inet_ntoa將一個32位網(wǎng)絡(luò)字節(jié)序二進(jìn)制IPv4地址轉(zhuǎn)換成相應(yīng)的點(diǎn)分十進(jìn)制數(shù)串
3腾么、inet_pton和inet_ntop函數(shù)
#include<arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
family 既可以是AF_INET 也可以是AF_INET6 .第一個函數(shù)嘗試轉(zhuǎn)換由strptr指針?biāo)傅淖址茁玻⑼ㄟ^addrptr指針存放二進(jìn)制結(jié)果。若成功則返回值為1哮翘,否則為0颈嚼, inet_ntop進(jìn)行相反的轉(zhuǎn)換。