gpt4 book ai didi

c# - 如何从 tcp 段构建消息

转载 作者:可可西里 更新时间:2023-11-01 02:55:05 25 4
gpt4 key购买 nike

在 C# 中工作,我使用 SharpPCap 从 winpcap 跟踪中获取段。

我需要重建该跟踪中发送和接收的所有消息。

在我的情况下,客户端和服务器的 IP 永远不会相同。客户端的端口不一定改变。

消息使用的协议(protocol)可能是 HTTP 或我不知道的自定义协议(protocol)。

这就是我目前的做法:

            if (ipPacket.Protocol == IPProtocolType.TCP)
{
TcpPacket tcpPacket = (TcpPacket)ipPacket.PayloadPacket;

Packet dataPacket = tcpPacket;
while (dataPacket.PayloadPacket != null)
dataPacket = dataPacket.PayloadPacket;

if (dataPacket.PayloadData.Length > 0)
{
if (m_MessageContainer.IsEmpty()
|| ((m_MessageContainer.Last().SourceIp.ToString() != ipPacket.SourceAddress.ToString())
&& tcpPacket.Psh))
{
m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));
}
m_MessageContainer.Last().AddData(dataPacket.PayloadData);
}
}

我的解决方案的问题是客户端连续发送两个请求。我只是将两条消息合二为一。如果我改变

if (m_MessageContainer.IsEmpty()
|| ((m_MessageContainer.Last().SourceIp.ToString() != ipPacket.SourceAddress.ToString())
&& tcpPacket.Psh))
{
m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));
}

if (m_MessageContainer.IsEmpty()
|| tcpPacket.Psh)
{
m_MessageContainer.Add(BuildMessage(ipPacket, tcpPacket));
}

当一条消息在多个 tcp 段之间拆分并且标志 psh 至少在这些 tcp 段中的两个上设置时,就会出现问题。

我需要一种方法来正确合并片段以重建原始消息。我不能依赖通过 TCP 使用的协议(protocol)。

谢谢!

编辑:在 wireshark 中,当您遵循 tcp 流时,它不一定知道 tcp 上的协议(protocol),但它能够以不同的颜色显示每个请求和响应。它是怎么做到的?我正在寻求相同的功能,因为在我的情况下,在流中收到响应之前永远不会有第二个请求。谢谢

最佳答案

无法仅通过观察线路上的流来了解原始应用程序代码是如何写入套接字的。您正在谈论使用在某些情况下可能会出现的提示,但您不能依赖它们(正如您所发现的那样)。

write(sock, "GET / HTTP/1.0\r\n\r\n", len);

write(sock, "GET / HTTP/1.0\r\n", len);
write(sock, "\r\n", 2);

write(sock, "GET / HTTP/1.0\r\n", len);
sleep(1);
write(sock, "\r\n", 2);

所有这三个示例都是编写 HTTP 查询的合法方法。这三个在电线上看起来都一样。当然,最后一个很有可能是不同的,即使它意味着同样的事情(想象 sleep 不是明确的,但可能是由于从磁盘读取 cookie 引起的)。即使如此,如果特定 TCP 套接字在两次写入发生时因重试而被阻止,则最后一个可以折叠成单个传输。第二个示例可能仅根据接口(interface)上的其他负载(或 CORK 等套接字选项)显示为一个或两个数据包。

关于c# - 如何从 tcp 段构建消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com