套接字编程

网际套接字地址结构,以sockaddr_in命名,定义在<netinet/in.h>

struct in_addr {

  in_addr_t   s_addr;  /* 32位 IPv4 地址*/

};

struct sockaddr_in {

  uint8_t    sin_len;

  sa_family_t  sin_family;

  in_port_t   sin_addr;

  struct in_addr  sin_addr;

  char       sin_zero[8];

};

通用套接字地址结构

struct sockaddr {

  uint8_t sa_len;

  sa_family_t sa_family;

  char sa_data[14];

};

IPv6套接字地址结构

struct in6_addr {

  uint8_t  s6_addr[16];  

};

#define SIN6_LEN

struct sockaddr_in6 {

  uint8_t  sin6_len;

  sa_family_t  sin6_family;  /*AF_INET6*/

  in_port_t    sin6_port;

  uint32_t    sin6_flowinfo;

  struct in6_addr  sin6_addr;

  uint32_t      sin6_scope_id;

}

 

 /////////主机字节序和网络字节序之间的相互转换////////////////////

#include<netinet/in.h>

uint16_t htons(uint16_t host16bitvalue);

uint32_t htonl(uint32_t host32bitvalue); //均返回:网络字节序的值

uint16_t ntohs(uint16_t net16bitvalue);

uint32_t ntohl(uint32_t net32bitvalue); //均返回:主机字节序的值

h代表host, n代表network, s代表short, l代表long.

////////////////////////////////////////////////////////////////////////

 

#include <arpa/inet.h>

int inet_aton(const char *strptr, struct int_addr *addrptr);

inet_aton将strptr所指C字符串换成一个32位的网络字节序二进制,并通过指针addptr来存储。若成功返回1,否则返回2.

char *inet_ntoa(struct in_addr inaddr);

inet_ntoa函数将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。

#include<arpa/inet.h>

int inet_pton(int family, char *strptr, void *addrptr);

p和n分别代表表达(presentation)和数值(numberic),inet_pton转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

inet_pton进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。

 

posted @ 2015-01-11 19:46  soul390  阅读(122)  评论(0编辑  收藏  举报