Socket 编程

IPV4套接口地址结构以“sockaddr_in”命名

sockaddr_in(在<netinet/in.h>中定义):

struct sockaddr_in {

short int sin_family; /* Address family */

unsigned short int sin_port;  /* Port number */

struct in_addr sin_addr; /* Internet address */

unsigned char sin_zero[8];  /* Same size as struct sockaddr */

};

struct  in_addr {

unsigned  long  s_addr;

};

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储端口号(使用网络字节顺序)

sin_addr存储IP地址,使用in_addr这个数据结构

sin_zero是为了让sockaddrsockaddr_in两个数据结构保持大小相同而保留的空字节。

s_addr按照网络字节顺序存储IP地址

/*****************************************************************************/

struct sockaddr_in servaddr;

int sockfd;

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

fprintf(stderr, "Socket error: %s\n", sterror(errno));

exit(1);

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(SERV_PORT);

/*****************************************************************************/

当作为参数传递给任何一个套接口函数时,套接口地址结构总是通过指针来传递,但通过指针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址结构。

有一个问题是如何声明所传递指针的数据类型。ANSI C中有很简单的解决把法:它有通用的指针类型 void * 。但是,套接口函数是在ANSI C之前定义的,1982年采用了这样的一个办法:在<sys/socket.h>头文件中定义一个通用的套接口地址结构:

struct sockaddr {

unsigned  short  sa_family;     /* 地址家族,一般都是“AF_xxx”的形式。通常大多 用的是都是AF_INET*/

char  sa_data[14];              /* 14字节协议地址*/

};

于是,套接口函数被定义为采用指向通用套接口地址结构的指针。这要求对这些函数的任何调用都必须将指向特定协议的套接口地址结构的指针类型转化成指向通用套接口地址结构的指针。(bindconnectrecvfromsendto)。

/*****************************************************************************/

struct sockaddr_in servaddr;

bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))

/*****************************************************************************/

sockaddr_in 中的成员struct in_addr sin_addr 表示32位的IP地址。但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr 表示之间转换。

/*****************************************************************************/

#include <arpa/inet.h> 


int inet_aton(const char *strptr, struct in_addr *addrptr); 

in_addr_t inet_addr(const char *strptr); 

int inet_pton(int family, const char *strptr, void *addrptr);  

/*****************************************************************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值