网络编程--sockaddr 与 sockaddr_in

From: http://www.it165.NET/pro/html/201211/4066.html

在初学的时候对二者甚是迷茫一会就晕了
在这里总结一句话:

struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。在实际编程中这个结构体会被一个struct sockaddr_in所填充。

sockaddr 在bind的man手册中提到

      struct sockaddr {
           sa_family_t sa_family;    //所选协议族AF_INET
           char        sa_data[14];    //ip地址及端口号
       }

而sockaddr_in

  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;             /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */

    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
  };

虽然是两个结构体可是二者的占用的内存是一致的,因此可以互相转化。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。

而sockaddr_in 一般是储存地址和端口的。用于信息的显示及存储使用

例如:

struct sockaddr_in addr_server;

addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(RPORT);
addr_server.sin_addr.s_addr = inet_addr(RHOST);

然而,在类似于bind accept的函数中

ret = bind(fd_sock, (struct sockaddr *)&addr_server, 
        sizeof(addr_server));
if(ret < 0){
    perror("bind");
    return -1;
}

之前只是这样的记下来了,可是知道一天,想显示所连接的客户端的ip地址的时候,就发现了问题所在

char *inet_ntoa(struct in_addr in);

函数原型是这样的,可是在

struct in_addr
{
    in_addr_t s_addr;
};

这个in_addr是sockaddr_in的一个mamber

    fd_connection = accept(fd_sock, 
        (struct sockaddr *)&addr_client, &addr_client_len);
    if(fd_connection < 0){
        perror("accept");
        return -1;
    }
    printf("connected! : %d
", fd_connection);

    printf("%s%s
", "the client ip is :",
        inet_ntoa(addr_client.sin_addr));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值