博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【VS开发】从sockaddr中取得客户端或者数据源的Ip地址和端口号
阅读量:4586 次
发布时间:2019-06-09

本文共 1684 字,大约阅读时间需要 5 分钟。

在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢?

实际上,当sockaddr_in.sin_family = AF_INET时,sockaddr = sockaddr_in。

据此,我们可以做一下转换,就可以利用 inet_ntoa() 来得到ip地址和端口号了:

    
int
 new_fd 
=
 accept(sock, 
&
clientAddr, 
&
sin_size);
    
if
(new_fd
<
0
)
    {
        
char
 msg[
64
];
        bzero(msg,
sizeof
(msg));
        sprintf(msg,
"
accept failed
"
);
        log::outputSysErr(msg);
    }
    
else
    {
        
//
 将sockaddr强制转换为 sockaddr_in
        sockaddr_in sin;
        memncpy(
&
sin, 
&
clientAddr, sizoef(sin));
        
//
 取得ip和端口号
        sprintf(info.ip, inet_ntoa(sin.sin_addr));
        info.port 
=
 sin.sin_port;
        info.sock 
=
 new_fd;
    }

 

 上面说的“转换”看起来是不是有些奇怪?实际上,你可以通过真正意义上的强制转来转换:

 

sockaddr_in
*
 pSin 
=
 (sockaddr_in
*
)
&
clientAddr;

 

 

而第一种方法,间接说明了另外一个意思:他们占用的内存大小是一样的,当sockaddr_in.sin_family = AF_INET时,他们的内存布局也一样的!看看sockaddr结构体自身就知道了,它仅仅是个char数组,大小与sockaddr_in等同:

 

/*
 Structure describing a generic socket address.  
*/
struct
 sockaddr
  {
    __SOCKADDR_COMMON (sa_); 
/*
 Common data: address family and length.  
*/
    
char
 sa_data[
14
];  
/*
 Address data.  
*/
  };

 

 

sockaddr_in的结构定义如下:

 

/*
 Structure describing an Internet socket address.  
*/
struct
 sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;   
/*
 Port number.  
*/
    
struct
 in_addr sin_addr;  
/*
 Internet address.  
*/
    
/*
 Pad to size of `struct sockaddr'.  
*/
    unsigned 
char
 sin_zero[
sizeof
 (
struct
 sockaddr) 
-
      __SOCKADDR_COMMON_SIZE 
-
      
sizeof
 (in_port_t) 
-
      
sizeof
 (
struct
 in_addr)];
  };
/*
 Ditto, for IPv6.  
*/
struct
 sockaddr_in6
  {
    __SOCKADDR_COMMON (sin6_);
    in_port_t sin6_port; 
/*
 Transport layer port # 
*/
    uint32_t sin6_flowinfo; 
/*
 IPv6 flow information 
*/
    
struct
 in6_addr sin6_addr; 
/*
 IPv6 address 
*/
    uint32_t sin6_scope_id; 
/*
 IPv6 scope-id 
*/
  };

转载于:https://www.cnblogs.com/huty/p/8517272.html

你可能感兴趣的文章
git命令的使用 【备用】
查看>>
uva1391 2-SAT 问题
查看>>
冲刺2-4
查看>>
Matlab画图-非常具体,非常全面
查看>>
泛泰A880S升级官方4.4.2 binx教程
查看>>
Python装饰器
查看>>
Java String format 对%的处理
查看>>
跨平台移动应用开发AppCan开发文档阅读指南
查看>>
Lind.DDD敏捷领域驱动框架~介绍
查看>>
PHP自带函数给数字前补0或补位(转)
查看>>
iOS runtime实用篇--和常见崩溃say good-bye!
查看>>
细说Cookie
查看>>
Javascript 第二章
查看>>
几个常用算法及反射+多线程调用
查看>>
ubuntu12.04 上面配置blogilo的博客园客户端的步骤
查看>>
Codeforces Gym101170I:Iron and Coal(建多幅图+多次BFS)***
查看>>
Python杂俎 —— 自动压缩指定格式文件&自动删除
查看>>
2017年01月。。
查看>>
bcmath(精准数学的计算)
查看>>
ASP.NET的路由系统:根据路由规则生成URL
查看>>