为什么端口x向自己发出tcp连接请求,连接到的不是listen状态的x呢?

发布于 2022-09-06 11:54:21 字数 1641 浏览 48 评论 0

问题如下:
我在python下测试端口X连接自己的例子,发现一个问题百思不得其解,希望大牛点播:
首先第一步:我在实验中对本机8000端口进行监听
然后第二步:从本机8000端口发出tcp连接,连接本机8000端口,这时我以为连接成功后,第一步监听的程序会返回一个连接后的sock,然而并不是这样,真相是第二步中8000发出的connect他返回的sock,可以自己进行send和recv
最后第三步:从本机8001端口发出tcp连接,连接本机8000端口,这时第一步中的监听成功返回连接的sock,这个sock就是第三步中8001与第一步中8000的连接

代码如下
第一步,终端一:
from socket import *
t1 = socket()
t1.setsockopt(SOL_SOCKET,SO_REUSEPORT,1)
t1.bind(("127.0.0.1",8000))
t1.listen(1)
s,a = t1.accept() //进入阻塞

第二步,终端二:
from socket import *
t2 = socket()
t2.setsockopt(SOL_SOCKET,SO_REUSEPORT,1)
t2.bind(("127.0.0.1",8000))
t2.connect(("127.0.0.1",8000)) //t1仍旧阻塞

clipboard.png

第三步,终端三:
from socket import *
t3 = socket()
t3.bind(("127.0.0.1",8001))
t3.connect(("127.0.0.1",8000)) //这时t1返回连接sock

clipboard.png

求问大牛,这是为什么??
为什么t3连接的是t1,但t2的连接的却是t2自己呢?
t2连接自己:
clipboard.png

t3连接t1:

clipboard.png
clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

木落 2022-09-13 11:54:21

python的socket默认是单进程状态,是堵塞的,所以支持多个进程绑定同一个端口,目的是当一个进程阻塞的时候,同一端口的其他空闲进程进行响应。
t2.connect很好理解啊,首先A端口connect B端口,那么A端口肯定也要listen啊,因为tcp是三次握手信号,所以connect默认listen不用像accept之前要先listen一下。所以t2 connect 8000的同时也listen 8000 那么t2和t1谁的距离近就不用说了吧,就近原则(或者底层lru缓存,t1 8000->t2 8000 connect 8000 t2)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文