方向有点不对。
获取本机IP地址,一般是不通过socket这个途径,当然这个途径可以获得地址,但一般不会这么做。你可以查下getsockbyname这个函数。
至于这里为啥会显示0。0。0。0,可能是你在SOCKET理解上有点出入。
my_addr。sin_addr。s_addr在不一样的情形有不一样的含义,假如是TCP监听套接口,则它的含义是比较的标准,而不是本机的IP。
例如你的机器,它有多个地址,首先127。0。0。1是它的回路地址,本机可以通过127。
0。0。1来访问自己。其次他可能有一个内部局域网地址,例如说是192。168。1。5,局域网络(互联网)上机器都可以通过这个地址访问你的机器。还有可能你的机器有一个外网地址,例如202。101。56。3,internet上的机器都可以通过这个地址访问你的机器。
接下来说下my_addr。sin_addr。s_addr的含义:
假如你创建了TCP监听套接口,并且你执行的是 my_addr。sin_addr。s_addr赋值为127。0。0。1,意思就是仅有目的地址为127。
0。0。1的包才会被监听套接口获取,这就是一种后果,由于127。0。0。1是回路地址,根本就不会出网卡,假如其它机器输入127。0。0。1最后会被送回自己本机,包根本就不会到达你的机器,也就是这种接口只可以接受自己本地的包。假如内网的机器发送包目的地址是你的局域网地址192。
168。1。5,并且端口也是你这个套接口监听的端口,可惜的是这个端口只收目的地址是127。0。0。1的包,192。168。1。5的包会被丢弃。这种接口最终结果就是只收本机的包。
假如绑定的是192。168。1。5的地址,则任何目的地址是192。
168。1。5的包都会被接受(当然端口必须是一致)。这种只可以局域网络(互联网)上的机器包会被你的端口收到,外网则不成,原因很容易,外网的192。168。1。5的包是不可能通过路由到达你的机器。
假如是你的外网地址,则同理任何外网地址到达的包都会被收到。
假如是INADDR_ANY,则意思就是不管目的地址是啥,都会被你接受。可能有点不可思议,但放心,路由器不会让啥地址的包都会到达你的主机的。
总之就是这个是监听的标准,而不是你的IP,你甚至可以把它设置成他人的IP地址,但可惜的是他人的IP地址的包,路由器是不会转发给你的,因此你啥都不会收到。
(至少在当今以太网作为局域网的天下你是收不到的,路由器不转发。不知道令牌环网或其它的局域网会怎样,当然即使是以太网也可以用ip欺骗的技术,这有点扯远了)。
不知道我说请不清楚。