Joh*_*eek 6 sockets windows port winsock
connect()如果我使用自动分配的临时端口(5000-65534)范围内的端口连接到localhost,我可以可靠地获得一个Winsock套接字.具体来说,Windows似乎有一个系统范围的滚动端口号,它将尝试将其指定为客户端套接字的本地端口号.如果我创建套接字直到分配的数字刚好低于我的目标端口号,然后重复创建套接字并尝试连接到该端口号,我通常可以让套接字连接到自己.
我首先在一个重复尝试连接到localhost上的某个端口的应用程序中发生这种情况,当服务没有监听时,它很少成功建立连接并接收它最初发送的消息(恰好是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)
Run Code Online (Sandbox Code Playgroud)
在我的Mac机器上,这最终终止于Unable to connect to port 49400, used local port 49400.在我的Windows 7计算机上,已成功建立连接并打印Connected to port 49400, used local port 49400.生成的套接字接收发送给它的任何数据.
这是Winsock中的一个错误吗?这是我的代码中的错误吗?
编辑:这是TcpView的屏幕截图,其中显示了违规连接:

| 归档时间: |
|
| 查看次数: |
1929 次 |
| 最近记录: |