套接字基础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。