windows - 为什么套接字可以连接()到它自己的临时端口?

标签 windows sockets port winsock

如果我使用自动分配的临时端口 (5000–65534) 范围内的端口连接到本地主机,我可以可靠地获得一个 Winsock 套接字以 connect() 连接到自身。具体来说,Windows 似乎有一个系统范围的滚动端口号,这是它将尝试分配为客户端套接字的本地端口号的下一个端口。如果我创建套接字直到分配的数字刚好低于我的目标端口号,然后重复创建套接字并尝试连接到该端口号,我通常可以让套接字连接到它自己。

我首先发现它发生在一个反复尝试连接到本地主机上某个端口的应用程序中,当服务没有监听时,它很少成功建立连接并接收它最初发送的消息(恰好是 Redis PING 命令)。

一个例子,在 Python 中(运行时不监听目标端口):

import socket

TARGET_PORT = 49400

def mksocket():
    return socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)

while True:
    sock = mksocket()
    sock.bind(('127.0.0.1', 0))
    host, port = sock.getsockname()
    if port > TARGET_PORT - 10 and port < TARGET_PORT:
        break
    print port

while port < TARGET_PORT:
    sock = mksocket()
    err = None
    try:
        sock.connect(('127.0.0.1', TARGET_PORT))
    except socket.error, e:
        err = e
    host, port = sock.getsockname()
    if err:
        print 'Unable to connect to port %d, used local port %d: %s' % (TARGET_PORT, port, err)
    else:
        print 'Connected to port %d, used local port %d' (TARGET_PORT, port)

在我的 Mac 机器上,这最终以 无法连接到端口 49400,使用了本地端口 49400 终止。在我的 Windows 7 机器上,成功建立连接并打印 Connected to port 49400, used local port 49400。生成的套接字接收发送给它的任何数据。

这是 Winsock 中的错误吗?这是我的代码中的错误吗?

编辑:这是TcpView的截图显示有问题的连接:

python.exe 8108 TCP (my HOSTNAME) 49400 localhost 49400 ESTABLISHED

最佳答案

这似乎是一个“同时启动”,如 RFC 793 的#3.4 中所述。 .参见图 8。请注意,任何一方在任何阶段都不处于 LISTEN 状态。在您的情况下,两端是相同的:这将导致它完全按照 RFC 中的描述工作。

关于windows - 为什么套接字可以连接()到它自己的临时端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584383/

相关文章:

docker - 无法从Docker容器外部访问Namenode

windows - Docker机器无法使用hyperv成功到达IP地址/机器

docker - Ftps 服务器无法使用 kubernetes 正常工作

python - 使用 Python 在 Windows 中注销或切换用户

sockets - Haskell 'timeout' 函数在应用于 'connect' 时不起作用

c++ - MinGW64 和 "conflicting declaration of C function int select(...)"

sockets - 为什么 UDP 编写器要拨号?

linux - tomcat7 localhost :8080 is not working?时怎么办

r - 当我使用 knitr 和 RStudio 在 Windows 上生成 pdf 文件时无法安装 framed.sty

c++ - 更改整个控制台背景颜色 (Win32 C++)