Chinaunix首页 | 论坛 | 博客
  • 博客访问: 409257
  • 博文数量: 117
  • 博客积分: 5235
  • 博客等级: 大校
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-12 15:51
文章分类

全部博文(117)

文章存档

2012年(9)

2011年(2)

2010年(21)

2009年(13)

2008年(72)

我的朋友

分类: C/C++

2008-04-17 09:10:07

背景:
    写了好多网络程序了,第一次在这里总结一下。
 
正文:
 

1.数据结构

1.1 struct in_addr

        struct in_addr {
                in_addr_t s_addr; /* 32位IPV4地址 */
        };
1.2 struct sockaddr_in
        struct sockaddr_in {
                short int sin_family; /* 地址族 */
                unsigned short int sin_port; /* 端口 */
                struct in_addr sin_addr; /* internet地址(32位IPV4) */
                unsigned char sin_zero[8]; /* 不知道什么用,反正没用到过 */
        };

1.3 struct sockaddr

        struct sockaddr {
                unsigned short sa_family; /* 地族,当然也是 AF_xxx */
                char sa_data[14]; /* 14 bytes 协议地址 */
        };

1.4 struct hostent

  struct hostent { 
   char *h_name; /* 主机的官方域名 */ 
   char **h_aliases; /* 一个以NULL结尾的主机别名数组 */ 
   int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */ 
   int h_length; /*地址的字节长度 */ 
   char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/ 
  };
>>>struct hostent *gethostbyname(const char *name); 产生,参数是域名
1.5 用法

struct sockaddr_in server;

1.5.1用点分IP地址赋值IP

server.sin_addr.s_addr=inet_addr("192.168.0.1");

>>>char *inet_ntoa(struct in_addr in); //in一般来源于struct sockaddr_in中的sin_addr成员,与上面函数功能基本相反

1.5.2赋值端口号

server.sin_port=hton(port);

>>>     htons()
        htonl()
        ntohs()
        ntohl()

>>>

htons把16位本地字节序转换成16位网络字节序,ntohs刚好相反
htonl把32位本地字节序转换成32位网络字节序,ntohl刚好相反

>>>取出sin_port时要ntoh(sin_port)才行

1.5.3赋值sin_family

server.sin_family = AF_INET;

bzero(server.sin_zero, 8);    >>>置0

1.5.4

数据结构类型转换

  (struct sockaddr *)&server  >>>转换成struct sockaddr,我们一直可以用struct sockaddr_in来欺骗

阅读(776) | 评论(0) | 转发(0) |
0

上一篇:实例概述

下一篇:友情链接

给主人留下些什么吧!~~