本文主要是介绍关于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)来表示
}
这篇关于关于inaddr_any和UDP中的sendto的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!