关于bind函数的疑问import sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)servaddr (12
关于bind函数的疑问
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servaddr = ('127.0.0.2', 3456)
#s.setsockopt(socket.sol, option, value)
s.bind(servaddr)
s.listen(5)
print s.getsockname()
while 1:
sockClient, addrClient = s.accept()
print 'get accept from', sockClient.getpeername()
sockClient.close()
用命令 telnet 127.0.0.2 3456可以连接
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servaddr = ('127.0.0.1', 3456)
#s.setsockopt(socket.sol, option, value)
s.bind(servaddr)
s.listen(5)
print s.getsockname()
while 1:
sockClient, addrClient = s.accept()
print 'get accept from', sockClient.getpeername()
sockClient.close()
用命令 telnet 127.0.0.1 3456也可以连接
估计已127.0.0.x的都可以绑定并且连接成功吧,反正后面我没有试验。
用ipconfig查看本地地址是192.168.1.106
然后服务器地址改为192.168.1.106 3456之后也是可以连接。
我现在想问,到底这些地址有什么区别呢?
如果我的服务器要人别人访问,该怎么绑定? 服务器 Python socket bind
[解决办法]localhost一般绑定127.0.0.1,就是本机,需要在hosts文件内指定
同理,在hosts内绑定任何ip到localhost,也能用该ip访问本机,不冲突就行
192.168.x.x一般是局域网ip,局域网内其他机器访问就需要这个ip
假设你用apache建一个web服务,那么你就要在apache的conf文件内写上 listen 192.168.x.x 才能对外
如果只有listen 127.0.0.1则只能本机访问,其他机器一概不能访问的
然后假如接入到 internet,你还能从isp那里分配到一个公网ip,公网ip只是指向网关所在机器(例如路由器)
如果局域网某台机器想对公网开放,就需要在网关做端口映射(或叫转发)
相关软件(如apache)在已经开放192.168.x.x的前提下,就无需再其他设置了
做好端口映射,公网的人就能通过公网ip和端口访问这台机器了
补充,不要忘了网关也是一个系统(服务器),即使一般路由器也是
也就是说它也有自己的端口和服务,公网其他人访问的ip:port指的是网关机器的端口,而不是局域网其他机器的端口,所以转发的时候要搞清不要搞混了
例如路由器本身有web服务(平常用浏览器修改路由器设置那个),如果是80端口,局域网内的机器要对公网开放web的话,就不能在80端口转发了
上述都需要在防火墙(每一层机器都是)通行的情况下实现
[解决办法]127.x.x.x是本地环回地址,用于网络协议测试;
凡是发往这些地址的 数据,都不会离开本机。
所以,只要是127.x,不论你的x是什么,在本机都可以收到。
至于你的第二个问题,不是1、2句话能解释清楚。
请自行查阅:IP地址分类、public IP和private IP。
要想做服务器,供外网的用户能够访问,Server必须是public IP。
private IP的数据包到路由器是直接被丢掉的。
[解决办法]
172.21.96.1 的路由不是你的网关,哪台机器要对外服务就在那台机器自己的网关设置
看样子你连基本的局域网概念都没有……