现在的位置: 首页 > 综合 > 正文

socket编程中相关数据结构

2013年12月04日 ⁄ 综合 ⁄ 共 2188字 ⁄ 字号 评论关闭

hostent
      
数据结构:
       struct hostent{
       char *h_name;
       char **h_aliases;
       int h_addrtype;
       int h_length;
       char **h_addr_list;
       };
     
详细资料:
      h_name --
主机的正式名称;
      h_aliases --
空字节-主机的别名;
      h_addrtype --
主机ip地址类型;ipv4(AF_INET),ipv6(AF_INET6)
      h_length --
主机ip地址的比特长度;
      h_addr_list --
零字节-主机网络地址指针;网络字节序,所以要打印出的话要调用inet_ntop()
     
批注:
     
使用这个东西,首先要包含2个头文件:
       #include<netdb.h>
       #include<sys/socket.h>
       gethostbyname()
成功时返回一个指向结构体hostent指针,或者是个空(NULL)指针。
 
例子:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
struct hostent *h; 
if (argc != 2) { /*
检查命令行*/
   fprintf(stderr,"usage: getip address
"); 
   exit(1); 
   } 
if ((h=gethostbyname(argv[1])) == NULL) { /*
取得地址信息*/
   herror("gethostbyname"); 
   exit(1); 
   } 
printf("Host name : %s ", h->h_name);
printf("IP Address : %s ",inet_ntoa(*((struct in_addr *)h->h_addr))); 
return 0;
}

注意:在使用gethostbyname()时,不能用perror()打印错误信息(因为errno没有使用),应该调用herror().
struct hostent *gethostbyname(const char*name);
这个函数的传入值是域名或者主机名,例如:“www.google.com”等等。传出值是一个hostent的结构。如果函数调用失败,将返回NULL

sockaddr
sockaddr_in
   
数据结构:
    struct sockaddr{
    unsigned short sa_family;//
地址族,AF_xxx  
AF_INET
不涉及转序的问题
    char sa_data[14];//14
字节的协议地址,网络字节序
    }

此时:struct in_addr{
            unsigned
long s_addr;
            }

    struct sockeaddr_in {
    short int sin_family; //地址族
    unsigned short int sin_port; //
端口号
    struct in_addr sin_addr; //Internet
地址
    unsigned char sin_zero[8]; //
struct
sockaddr
一样的长度,16个字节
    };
此时: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_un;
             };
inet_addr()
是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32IP地址(0xC0A80001
通常的用法是:
socket sockfd;
struct hostent *he;
struct sockaddr_in my_addr;

if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1) {
    perror("socket");
    exit(1);
  }

my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero,8);//zero the rest of the struct

  if (bind(sockfd, (struct sockaddr *)&my_addr,sizeof(struct
sockaddr)) == -1){
    perror("bind");
    exit(1);
  }

抱歉!评论已关闭.