TCP 的自连接

TCP自连接是指同一IP地址的同一端口之间尝试建立连接的现象。这通常发生在未指定本地端口时,Linux系统从`net.ipv4.ip_local_port_range`范围中分配端口。当尝试连接的端口未开放时,会收到RST标志的TCP报文段,导致自连接。解决办法是在连接后通过getpeername和getsockname检查本地和目标地址是否相同,以防止误操作。
摘要由CSDN通过智能技术生成

自连接

1. 如何实验出现这个现象

创建python 脚本 self_connect.py

#!/usr/bin/python
import errno
import socket
import sys
import time

if len(sys.argv) < 2:
    print "must input port."
    print "port should in net.ipv4.ip_local_port_range"
    exit()

port = int(sys.argv[1])
for i in range(65536):
    try:
        sock = socket.create_connection(("127.0.0.1", port))
        print "connected", sock.getsockname(), sock.getpeername()
        time.sleep(60*60)  # to netstat port
    except socket.error,  e:
        if e.errno != errno.ECONNREFUSED:
            print e.errno, errno.ECONNREFUSED
            break

执行该脚本,可以看到结果为:
脚本执行结果
netstat查看端口状态
从截图可以看到,同一ip下的同一端口,相互连接。
这不是内核bug

2. 原因

2.1 连接的时候,没有指定本地端口(local port),Linux系统会在 net.ipv4.ip_local_port_range 指定的端口范围内分配一个未被占用的端口。比如选择了端口N,如果N端口拒绝连接,就会发送包含RST标志的TCP报文段,本地
2.2 TCP协议支持同时打开

在WinForm中使用Modbus TCP自动连接的实现过程如下: 1. 添加Modbus TCP库:首先,需要在项目中添加Modbus TCP库。可以通过NuGet包管理器安装相应的Modbus TCP库,例如NModbus或EasyModbus。 2. 创建连接配置:在WinForm中创建一个用于配置连接参数的窗体或控件,包括主机地址、端口号等信息。用户可以通过此窗体输入和保存连接配置。 3. 自动连接功能:在主窗体的Load事件中实现自动连接功能。首先,读取之前保存的连接配置,如果配置存在,则尝试自动连接。如果配置不存在,或者连接失败,则弹出连接配置窗体供用户手动输入参数。 4. 连接状态显示:在主窗体中添加一个连接状态的标签或图标,用于显示当前连接状态。当自动连接或手动连接成功时,更新连接状态为“已连接”。当连接断开时,更新连接状态为“连接断开”。 5. 连接处理:使用Modbus TCP库提供的方法,在连接成功后,可以执行读写Modbus数据的操作。例如,读取某个寄存器值并在界面上显示,或者写入数据到寄存器等。 6. 重连逻辑:在连接断开后,可以通过设置一个定时器,在一定时间间隔后尝试重新连接,以实现自动重连功能。当连接成功后,停止定时器。 7. 异常处理:在连接过程和数据读写过程中,要进行异常处理。例如,捕获连接超时、连接拒绝等异常,并进行相应的处理,如提示用户重新配置连接参数或重连。 通过以上步骤,可以在WinForm中实现Modbus TCP自动连接的功能。这样可以简化用户的操作,提高软件的易用性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值