Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1182042
  • 博文数量: 273
  • 博客积分: 6445
  • 博客等级: 准将
  • 技术积分: 2843
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-04 23:22
文章分类

全部博文(273)

文章存档

2024年(2)

2023年(5)

2022年(3)

2021年(18)

2020年(9)

2019年(1)

2018年(13)

2017年(11)

2015年(9)

2013年(2)

2012年(4)

2011年(24)

2010年(114)

2009年(6)

2008年(29)

2007年(13)

2006年(10)

我的朋友

分类: C/C++

2010-09-02 10:29:55

套接字基础1

套接字是网络编程的一个通用接口,支持很多协议,每种协议使用不同的套接字地址结构

linux系统定义了一种通用的套接字地址结构:

#include

struct sockaddr{

  unsigned short sa_family;

  char            sa_data[14];

};

其中的sa_family为套接字的协议簇地址类型,如TCP/IP的类型为AF_INET, sa_data中存储具体的协议地址。

每种协议都定义了自己的地址结构,以前缀sockaddr_开始,TCP/IP的就是sockaddr_in

#include

struct in_addr{

  __u32 s_addr;

};

struct sockaddr_in{

  short int sin_family;

  unsigned short int sin_port;

  struct in_addr sin_addr;

  unsigned char __pad[__SOCK__SIZE-sizeof(short int)-sizeof(unsigned short int)-sizeof(struct in_addr)];

  };

#define sin_zero __pad

说明:

1.当使用这两种结构时,应包含与平台无关的文件。

2.类型的端口号均以网络字节存储;

3.对ip地址的处理,尤其是将ip地址作为函数参数使用时,需要明确使用哪种类型的数据:.sin_addr还是.sin_addr.s_addr?

4.sin_zero未使用,一般为0,为了保持与通用套接字结构一致;

5.套接字本身不在网络上传输,其某些内容如ip地址和端口号是在网络上传输的;

设置sockaddr_in中ip地址时,需要将字符串形式转化为二进制形式。

int inet_aton(const char *cp,strcut in_addr *inp);

unsigned long int inet_addr(const char *cp);

char *inet_ntoa(struct in_addr in);

说明:

1.函数inet_aton将字符串形式的ip地址转换成二进制形式的ip地址,成功返回1,否则0,转换后存于inp中;

2.inet_addr与inet_aton作用相同,转换结果在返回值中,但该函数已过时,编程时使用inet_aton,因为inet_addr不

 能处理广播地址255.255.255.255;

3.inet_ntoa与前面两个作用相反。

字节顺序转换函数:

#include

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);

h——host,n——network,s——short,l——long。

字节处理函数

套接字地址是多字节数据不以空字符结尾,与C中的字符串不同。两组函数来处理多字节数据,一组是b开头,与

BSD系统兼容,一组是以mem开头,是ANSI C的函数。

#include

void bzero(void *s,int n);

void bcopy(const void *src,void *dest,int n);

int bcmp(const void *s1,const void *s2,int n);

--------------------------------------------------------

void *memset(void *s,int c,size_t n);

void *memcpy(void *dest,const void *src,size_t n);

int memcmp(const void *s1,const void *s2,size_t n);

bzero将s指定的内存的前n个字节设置为0,通常用来将套接字地址清零;拷贝时,如果src与dest所指区域有重叠,使用bcopy。

 

阅读(1192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~