socket理解(1)
来源:互联网 发布:java uml建模工具 编辑:程序博客网 时间:2024/05/17 16:00
socket理解(1)
事情的起因是这样子的:
今天下午配置一个JDBC,使用的是INFORMIX数据库,按照往常的配置完毕后,无论如何也链接不到INFORMIX-SERVER,导致JAVA一直报错。
一开始我的JDBC是:
jdbc:informix-sqli://127.0.0.1:7776/dbname:informixserver=hdr1
[root@GNPIN1 ~]# netstat -anp | grep oninittcp 0 0 10.0.0.1:7776 0.0.0.0:* LISTEN 13003/oninit tcp 0 0 192.168.81.31:7778 0.0.0.0:* LISTEN 13005/oninit tcp 0 0 10.0.0.1:7776 10.0.0.2:46523 ESTABLISHED 13003/oninit tcp 0 0 10.0.0.1:7776 10.0.0.2:46431 ESTABLISHED 13003/oninit tcp 0 0 10.0.0.1:7776 10.0.0.1:41254 ESTABLISHED 13003/oninit tcp 0 0 10.0.0.1:34508 10.0.0.2:7777 ESTABLISHED 13003/oninit
[root@GNPIN1 ~]# ifconfig | grep "inet addr" inet addr:192.168.81.31 Bcast:192.168.81.255 Mask:255.255.255.0 inet addr:10.112.17.84 Bcast:10.112.17.95 Mask:255.255.255.240 inet addr:10.0.0.1 Bcast:10.0.0.3 Mask:255.255.255.252 inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0 inet addr:127.0.0.1 Mask:255.0.0.0
从ifconfig输出可以看到,这台机器有5个IP,也就是说,10.0.0.1与127.0.0.1是在一台机器上的。
而实际上INFORMIX监听的是10.0.0.1或者是192.168.81.131,并没有监听127.0.0.1.
我的第一感觉是,一台机器上有两个IP,一个是10.0.0.1,一个是127.0.0.1,那么往127.0.0.1发数据,不是相当于往10.0.0.1发送数据嘛?
实际上并不是这样子的。
Linux中总是以socket来作为链接的终端,啥叫socket?
socket = IP + PORT
也就是说,
socket1 = 10.0.0.1:7776
socket2 = 127.0.0.1:7776
是两个完全不同的socket(对象),那你说,我JDBC配置成127.0.0.1(socket2)可能链接到INFORMIX-SERVER(socket1)嘛?
很明显是不可以。
最后修改就简单了:
jdbc:informix-sqli://10.0.0.1:7776/dbname:informixserver=hdr1
当然也可以使用:
192.168.81.31:7778
OK。
我们接下来看一组实验:
实际环境:
tcp 0 0 10.0.0.1:7776 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:12001 0.0.0.0:* LISTEN tcp 0 0 192.168.81.31:7778 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::18081 :::* LISTEN tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN tcp 0 0 ::1:25 :::* LISTEN
[root@GNPIN1 ~]# ifconfig | grep "inet addr" inet addr:192.168.81.31 Bcast:192.168.81.255 Mask:255.255.255.0 inet addr:10.112.17.84 Bcast:10.112.17.95 Mask:255.255.255.240 inet addr:10.0.0.1 Bcast:10.0.0.3 Mask:255.255.255.252 inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0 inet addr:127.0.0.1 Mask:255.0.0.0
sample 1:
tcp 0 0 10.0.0.1:7776 0.0.0.0:* LISTEN telnet 10.0.0.1 7776 yestelnet 127.0.0.1 7776 notelnet 192.168.81.31 7776 notelnet 10.112.17.84 7776 notelnet 192.168.0.100 7776 no
此时有个socket=10.0.0.1:7776,那就仅仅
telnet 10.0.0.1 7776
可以链接成功,其余都不可能链接到服务器(服务进程)上(虽然什么127.0.0.1指代的是localhost,虽然192.168.81.31也是指代本机…)。
sample 2:
tcp 0 0 0.0.0.0:12001 0.0.0.0:* LISTEN telnet 192.168.81.31 12001 yestelnet 10.112.17.84 12001 yestelnet 10.0.0.1 12001 yestelnet 192.168.0.100 12001 yestelnet 127.0.0.1 12001 yes
这个0.0.0.0是啥意思?
本来是个保留地址,但是在这里的意思是,任何IP都可以链接过来:
你可以用192.168.81.31 12001来链接;
你可以用10.112.17.84 12001来链接;
你可以用192.168.0.100 12001来链接;
……
sample 3:
tcp 0 0 192.168.81.31:7778 0.0.0.0:* LISTEN telnet 192.168.81.31 7778 yestelnet 10.112.17.84 7778 notelnet 10.0.0.1 7778 notelnet 192.168.0.100 7778 notelnet 127.0.0.1 7778 no
同sample 1.
sample 4:
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN telnet 127.0.0.1 25 yestelnet 192.168.81.31 25 notelnet 10.112.17.84 25 notelnet 10.0.0.1 25 notelnet 192.168.0.100 25 no
同sample1.只不过这次是127.0.0.1,但是并没有什么特别的啊,不要以为在127.0.0.1这个IP上建立监听,就能在别的同台主机的IP上去访问…
sample 5:
tcp 0 0 :::18081 :::* LISTEN telnet 192.168.81.31 18081 yestelnet 10.112.17.84 18081 yestelnet 10.0.0.1 18081 yestelnet 192.168.0.100 18081 yestelnet 127.0.0.1 18081 yestelnet ::1 18081 yes
这里的:::是一个IPV6地址,其实它的含义在此处等价于0.0.0.0,谁都能链接来。
这里的::1也是一个IPV6地址,它的含义在此处等价于127.0.0.1.
sample 5其实等价于sample 2,只不过协议版本不一样。
这里还需要注意下,我使用ipv4的IP地址,比如10.112.17.84,也是可以链接到IPV6的,IPV6向下兼容IPV4。
sample 6:
tcp 0 0 ::1:25 :::* LISTENtelnet 192.168.81.31 25 notelnet 10.112.17.84 25 notelnet 10.0.0.1 25 notelnet 192.168.0.100 25 notelnet 127.0.0.1 25 yestelnet ::1 25 yes
::1啥意思上面已经解释过了,等价于IPV4的127.0.0.1,这个例子等价于IPV4版本的sample 4.
始终记住,socket是一个二元组,IP+PORT结合的!即使在同一台机器,即使在127.0.0.1上,他们并没有什么不同。
结尾的小问题:
端口占用–:
现在我们有socket:
10.0.0.1:7776
如果我再来个进程监听:
127.0.0.1:7776
会导致端口已被占用的问题吗?
不会!
可以同时存在
10.0.0.1:7776127.0.0.1:7776
在一台机器上,这台机器有两个IP:10.0.0.1,127.0.0.1。
完全没问题!他们是不同的socket。
- socket理解(1)
- 浅谈自己理解的socket(1)
- Socket理解。
- socket 理解
- Socket理解
- socket理解
- Socket理解
- socket理解
- 理解Socket
- socket理解
- 日常笔记之socket理解1
- Socket编程之accept()理解
- Socket理解-代码保存(服务器代码)
- 浅谈自己理解的socket(2)
- SOCKET.IO,理解SOCKET.IO
- SOCKET.IO,理解SOCKET.IO
- SOCKET.IO,理解SOCKET.IO
- 对Socket CAN的理解(1)——【CAN总线原理】
- Spring IOC容器的初始化过程(1)
- 《统计学习方法》笔记——支持向量机(SVM)
- 立体声、双声道、单声道的区别
- faster rcnn训练过程出现loss=nan解决办法
- 数据结构C++栈
- socket理解(1)
- MySql中一个简单的存储过程刷数据库数据
- 整数划分
- JAVA上加密算法的实现用例
- kafka broker的常用配置
- 关于UIImage图片处理详细使用
- HttpClient 教程 (三)
- c++引用作为参数和返回值小结
- 170607 杂项-数据压缩和错误纠正