我正在我的微控制器(MSP432)上运行一个应用程序,它将数据写入以太网电缆以将其发送到PC。
我正在使用数据包发送方在MC上查看PC上端口(502)上收到的数据。 Data received on PC
正如我们在上图中所看到的,MC的端口号对于每个发送的数据包都是递增的。 达到最大数量时会发生什么? 它会在某个其他端口号重新启动并继续该过程还是会停止?
Edit1:从http://myarduinoprojects.com/modbus.html
使用的Modbus协议库EDIT2: 每当我有一个通过MODBUS发送的新数据时调用此函数。 Mb.Req(MB_FC_WRITE_MULTIPLE_REGISTERS,0,11,0);
if (MbmClient.connect(ServerIp,502)) {
digitalWrite(GREEN_LED, HIGH);
#if DEBUG
//Serial.println("connected with modbus slave");
// Serial.print("Master : ");
for(int i=0;i<MbmByteArray[5]+6;i++) {
if(MbmByteArray[i] < 16){
//Serial.print("0");
}
//Serial.print(MbmByteArray[i],HEX);
if (i != MbmByteArray[5]+5) {
//Serial.print(".");
} else {
//Serial.println();
}
}
#endif
MbmClient.write(MbmByteArray,13+(Count*2));
MbmCounter = 0;
MbmByteArray[7] = 0;
MbmPos = Pos;
MbmBitCount = Count;
*state= true;
MbmClient.stop();
delay(100);
digitalWrite(GREEN_LED, LOW);
} else {
*state= false;
MbmClient.stop();
}
答案 0 :(得分:0)
您似乎在使用this Modbus example 我从来没有使用过,但我想这是因为代码中的目标端口与your sniffing image中的目标端口相同:502
可能你反复称这种方法:
void MgsModbus::Req(MB_FC FC, word Ref, word Count, word Pos)
在此方法中,您可以看到以下行:
if (MbmClient.connect(ServerIp,502)) {
...
因此,每次调用该函数时,都会打开一个新连接。当您通过套接字打开连接时,操作系统或网络堆栈需要选择发送TCP消息的源端口和IP地址。
这就是为什么你总是看到一个新的源端口,并且该端口正在增加。这就是所谓的短暂端口。您正在使用的TCP堆栈如何选择源端口是依赖于实现的,尽管从某个端口开始非常常见,并且每次打开连接时,它都会选择下一个可用端口。
如果堆栈编程良好,很可能你的TCP堆栈会回转并从1024开始的某个特定端口开始(前1024个端口受到限制)。我看到的代码似乎用这个函数关闭了端口:
MbmClient.stop()
您需要在使用后检查端口是否已关闭。否则,在某些时候,您将耗尽可用端口(资源泄漏)。
如果您希望套接字绑定到特定的源端口,则需要使用类似于Linux socket bind的函数
现在,更明智的方法是始终使用相同的连接。您可能需要修改该示例。