关于inaddr_any和UDP中的sendto

UDP中由于没有connect到目标机的iP地址,所以要用sendto(参数里有struct sockaddr_in addr 即目标机的ip地址)


 所以一定要绑定ip地址(当然,如何用socket做本地主机的进程通信,就不用绑定了)  那么这个inaddr_any是干什么的呢? 

我们知道ip不同于mac地址,是可以指定的,所以一个主机可能有多个ip地址。如果我把服务器主机的某个ip地址跟socket绑定,客户端进程访问服务器主机时,只能访问我绑定的ip地址,如果用inaddr_any的话,可以绑定服务器主机的任何ip都是可以通信的。例子如下:

是用于多IP机器上   
    
  比如你的机器有三个ip   
  192.168.1.1   
  202.202.202.202   
  61.1.2.3   
    
  如果你serv.sin_addr.s_addr=inet_addr("192.168.1.1");   
    
  然后监听100端口   
    
  这时其他机器只有connect   192.168.1.1:100才能成功。   
  connect   202.202.202.202:100和connect   61.1.2.3:100都会失败。   
    
  如果serv.sin_addr.s_addr=htonl(INADDR_ANY);   的话,无论连接哪个ip都可以连上的。


几个地址格式常用的数据结构:

struct sockaddr_in

{

short int sin_family;/* internet协议族*/

unsigned short int sin_port;/* 端口号 */

struct in_addr sin_addr;/*ip地址*/

unsigned char sin_zero[8];/*填0*/

}

其中struct in_addr

{

unsigned long  s_addr;/*32位ip地址*/   //有这个看出,我们用ASCII码表示的ip地址必须用 inet_aton(const char *cp,struct in_addr * inp)来进行转换

//而long 类型的地址变成我们熟知的....表示的ip地址则用char *inet_ntoa(struct in_addr in)来表示

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值