我嘗試捕獲整個 TCP 流并將其保存到二進制檔案中。出于測驗目的,我撰寫了一個氣味 Python 腳本。這將創建 TCP 連接,并且流將以 1:1 的比例連接到二進制檔案流。在此之后,我可以使用第二個程式打開保存的檔案來分析捕獲的資料。這適用于 Python 腳本。
這是作業腳本
import socket
import sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((_ip, _port))
chunks = []
bytes_recd = 0
f = open("c:\\temp\\trace3.trace", "wb")
cnt = 1500
i = 0
lrcv = 0
print("Logging begins")
while True:
chunk = s.recv(1024)
if not chunk:
print("No Data received")
break
f.write(chunk)
lrcv = lrcv len(chunk)
i = i 1
if i % 50 == 0:
print("Msg: " str(i) ", " str(lrcv))
if i >= cnt :
break
f.close()
s.close()
這是 C# 中的“相同”。這被壓縮成只有有趣的部分,沒有任何錯誤處理等等。
IPAddress ipAddress = IPAddress.Parse(_ip);
IPEndPoint iPEndPoint = new IPEndPoint(ipAddress, _port);
_tcpClient = new TcpClient();
_tcpClient.Connect(iPEndPoint);
FileStream fstream = File.OpenWrite(fname);
using (var stream = _tcpClient.GetStream())
{
using (var binwriter = new BinaryWriter(fstream, Encoding.Unicode))
{
while(true)
{
if (!stream.DataAvailable)
{
lock (_lock)
{
iState = _started;
}
noDataCounter ;
if(noDataCounter > _connectionRetries)
{
noDataCounter = 0;
throw new Exception($"Timeout while reading data from target {_ip}:{_port}");
}
Thread.Sleep(100);
continue;
}
stream.Read(buffer, 0, buffer.Length);
noDataCounter = 0;
binwriter.Write(buffer, 0, buffer.Length);
}
}
}
如果我加載 C# 捕獲的檔案,第二個程式說該檔案已損壞。我嘗試將 BinaryWriter 與幾種編碼一起使用。總是同樣的問題。.Net 接縫在將傳入資料寫入驅動器之前對其進行更改。在我將 f = open("c:\temp\trace3.trace", "w") 更改為 f = open("c:\temp\trace3.trace", "wb ")
目前我沒有看到我的錯誤。這個程序很簡單。打開 TCP 連接并將傳入的資料保存到硬碟驅動器而不進行任何處理。該流是一個連續的資料流(FYI 序列化的 Java 物件)。
uj5u.com熱心網友回復:
stream.Read(buffer, 0, buffer.Length);
您沒有保存實際讀取的位元組數。它應該是
var noBytes = stream.Read(buffer, 0, buffer.Length);
binwriter.Write(buffer, 0, noBytes );
這是使用 raw tcp 時的常見錯誤,也是我通常建議使用一些支持寫入訊息的更高級別協議的原因之一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/530146.html
標籤:C#文件tcp溪流二进制
