关于socket编程中,经常用到的字节转换的问题
网络上不同的机器类型可能在表示数据字节时的字节顺序是不一样的,所以在linux下,有专门的字节转换函数:
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
htonl():表示将本机上的long数据转换成网络上的long数据,其他的意思基本相同.
IP和域名的转换:
网络上标识一台机器可以用IP或者域名,下面的函数可以实现转换:
struct hostent *gethostbyname(const char *hostname);
struct hostent *gethostbyaddr(const char *addr,int len,int type);
关于结构体hostent的定义:
struct hostent
{
char *h_name;//主机的名称
char *aliases;//主机的别名
int h_addrtype;//主机地址类型,AF_INET
int h_length;//主机地址长度
char **h_addr_list;//主机的IP地址列表
}
#define h_addr h_addr_list[0] //主机的第一个IP地址
gethostbyname():可以将机器名转换为一个结构指针,这个结构里面存储了域名的信息.
gethostbyaddr():可以将一个32位的IP地址转换为结构指针.
失败时返回NULL,在h_strerror()里面能得到详细的出错信息.
字符串IP和32位IP的转换:
网络上IP是用(192.168.1.1)表示的,而在struct sockaddr中是用32位的IP(C0A80101),可以使用下面的函数实现转换:
int inet_aton(const char *ptr,struct in_addr *inp);
char * inet_ntoa(struct in_addr in);
a:ascii,n:network,第一个函数表示将a.b.c.d的IP格式转换为32位的IP格式.
服务信息函数:
在网络程序里,如果需要IP,port和服务信息,使用如下函数:
int getsockname(int sockfd,struct sockaddr *localaddr,int *addrlen);
int getpeername(int sockfd,struct sockaddr *peeraddr,int *addrlen);
struct servent *getserverbyname(const char *servname,const char *protoname);
struct servent *getserverbyport(int port,const char *protoname);
struct servent
{
char *s_name;
char **s_aliases;
int port;
char *s_proto;
}
在网络上有很多默认端口的服务,如端口21,为了得到指定端口的服务,我们可以使用第四个函数,需求相反,我们可以用第三个函数.