唯有前进值得敬仰

---等得越久,相聚时越幸福
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

linux socket编程基础1

Posted on 2010-07-08 23:30  绿豆芽33  阅读(443)  评论(0编辑  收藏  举报

套接字基础1

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

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

#include<linux/socket.h>

struct sockaddr{

  unsigned short sa_family;

  char            sa_data[14];

};

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

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

#include<linux/in.h>

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.当使用这两种结构时,应包含与平台无关的<sys/socket.h>和<netinet/in.h>文件。

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<netinet/in.h>

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<string.h>

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。