所以我有一个 java 服务器和客户端,数据被发送到服务器很好,服务器正在交互它,但我发现客户端需要很长时间才能响应服务器发送的内容,经过一段时间环顾四周,我发现我的服务器发送给客户端的数据比应该发送的数据长得多。
发送到客户端的数据包包含我发送的所有数据,但是它后面也有很多空白,我想解决这个问题,有人有什么想法吗?
我获取数据的代码是服务器上每个客户端的简单 for 循环,这将客户端数据添加到一个字符串中,并将该字符串添加到一个数据包中:
类 PlayerList
public static String getString()
{
String message = "";
for(int x = 0; x < list.size(); x++)
{
Player player = list.get(x);
if(message.equals(""))
{
message += player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
}
else
{
message += ","+player.name+";"+player.address+";"+player.pos[0]+";"+player.pos[1]+";"+player.fakeRotation+";"+player.rotation+";"+player.rotationSpeed+";"+player.speed+";"+player.sheildEnabled+";"+player.sheildStrength+";"+player.health;
}
}
System.out.println(message);
return message;
}
Run Code Online (Sandbox Code Playgroud)
班级发送
while(Server.serverRunning)
{
for(int p = 0; p < PlayerList.list.size(); p++)
{
Player player = PlayerList.list.get(p);
try
{
byte[] buf = PlayerList.getString().getBytes();
//send the message to the client to the given address …
Run Code Online (Sandbox Code Playgroud) 我试图找出如何使用远程控制台建立连接和身份验证.
这个Wiki Wiki 1和这个Wiki 2告诉我,我需要构建一个数据包并将其发送到RECON,但我不知道如何做到这一点.
我是一个网络新手但是因为我在那里搜索然后我建立了这个:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Port:= 20001;
IdTCPClient1.Connect;
IdTcpClient1.IOHandler.Writeln('1234');
ShowMessage(IdTcpClient1.IOHandler.ReadLn);
end;
Run Code Online (Sandbox Code Playgroud)
我被困在那里,其中1234是RECON密码和它返回的消息:Connection正常关闭......
最后,我如何成功登录?并且至少发送一个命令"list"下一步将实时接收控制台日志?
谢谢
我想获得一些有关如何修改 TCP 标头以及更改 TCP 标头上的选项的帮助。我对选项的 MSS 部分特别感兴趣。
我尝试使用带有不同选项的setsockopt(),但没有成功。
以下是一些尝试更改 MSS 的代码:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#! Settings mss
s.setsockopt(socket.IPPROTO_TCP, socket.IP_OPTIONS , b"MSS:400")
Run Code Online (Sandbox Code Playgroud)
我预计 MSS 会更改为 400。代码会运行,但不会更改 MSS(使用 Wireshark 检查)。
PacketBuilder是一个允许写入char*数组的类.附加功能:
template <class T>
void PacketBuilder::Append(const T value)
{
memcpy((&m_Buffer) + m_Index, (const void*) &value, sizeof(T));
m_Index += sizeof(T);
}
Run Code Online (Sandbox Code Playgroud)
编译没有错误.如果我调用Append并使用T作为无符号短(WORD).它很棒.如果我使用T作为unsigned char.我收到链接器错误.
m_Builder.Append<unsigned char>(0x01); // Error: LNK1120
m_Builder.Append<unsigned short>(0x0001); // Works
Run Code Online (Sandbox Code Playgroud)
来自VS2010的错误(我得到了德国vs2010):
错误LNK2019:Verweis aufnichtaufgelöstesexternes符号""public:void __thiscall PacketBuilder :: Append(unsigned char)"(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)"在Funktion中""public:void __thiscall客户端: :DoHandshake(无效)"(?DoHandshake @ Client @@ QAEXXZ)".1> C:\ XXX\C++\SilkroadEmu\Debug\LoginServer.exe:致命错误LNK1120:1nichtaufgelösteexterneVerweise.
翻译成英文:
错误LNK2019:未解析的外部符号""public:void __thiscall PacketBuilder :: Append(unsigned char)"(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)"in Function""public:void __thiscall Client :: DoHandshake(无效)"(?DoHandshake @ …
我正在编写一个与网络相关的应用程序,如果检测到数据包嗅探器,我想通过关闭它来保护它免受逆向工程的影响.如何检测数据包嗅探器是否正在运行?我可以检查正在运行的应用程序,并根据预定义的字符串(wireshark,httpanalyzer等)检查它们的名称,但这似乎不是最好的方法.有没有办法确定应用程序是否在嗅探数据包?谢谢
我想使用 Qt for Windows 编写的重定向服务器和链代理客户端来制作透明的链代理。我尝试过 ndis+tdi 但对我来说太复杂了。我已经开始破解openVPN的代码了。因此,任务是启动虚拟 Tap 设备,即使不需要 OpenVPN 连接,并将数据包重定向到我的重定向服务器将绑定的某个地址:端口。也许实现新的插件功能会更好??...
我在c#中申请.我正在连续获取24097端口上的数据,我将数据记录为
UdpClient client = null;
IPEndPoint ipep = null;
client = new UdpClient(24097);
client.Client.ReceiveBufferSize = 25000;
ipep = new IPEndPoint(IPAddress.Any,24097);
while(flag)
{
byte[] data= = client.Receive(ref ipep);
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是我收到的数据包不按顺序排列.我希望以顺序方式接收它们.请帮帮我.谢谢.
关于TCP的几个问题.
我知道如果数据包遇到MTU等较低的网络设备,它将被"拆分"或碎片化.但我遇到的问题是了解如何在应用程序中"重建"我的有效负载.(我现在已经尝试了2-3个小时,但似乎无法做到正确)
首先要做的事情.发送数据包时,以下两个选项的优缺点是什么?
NetworkStream ns = client.GetStream();
ns.Write(BitConverter.GetBytes(100));
ns.Write(BitConverter.GetBytes("Test"));
Run Code Online (Sandbox Code Playgroud)
要么
NetworkStream ns = client.GetStream();
byte[] payload = BitConverter.GetBytes(100).Concat(BitConverter.GetBytes("Test"));
ns.Write(payload); //, 0, payload.Length);
Run Code Online (Sandbox Code Playgroud)
我如何在recv重建有效载荷.部分如果已被拆分?我会喜欢用这种勺子喂食,因为我似乎错过了一些非常重要的,但不是那么明显,在我目前的应用中.
我想在一个非常简单的网络上测试 UDP 广播:一个根本没有连接到互联网的旧 wifi 路由器(WRT54GS)、一个 Android 平板电脑和我的 MacBook:
[Tablet] <\/\/\/\/\/> [Wifi Router] <\/\/\/\/\/> [Macbook]
Run Code Online (Sandbox Code Playgroud)
其中波浪线表示无线连接。
Macbook 的 IP 地址为 192.168.1.101,平板电脑的 IP 地址为 192.168.1.102。路由器是192.168.1.1。
为了避免太多低级细节,我想使用 netcat 进行测试。我决定使用端口 11011,因为它很容易输入。
作为第一步,我想我应该尝试让 MacBook 上的这项功能恢复正常。在两个终端窗口中,我运行了这些程序
窗口 1:
% nc -ul 11011
我首先启动了它,然后:
窗口2:
% echo 'foo' | nc -v -u 255.255.255.255 11011
窗口 1 中没有任何显示。窗口 2 中的结果是这样的:
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif (null)
src 192.168.1.2 port 61985
dst 255.255.255.255 port 11011
rank info not available
Run Code Online (Sandbox Code Playgroud)
我相当确定我在这里遗漏了一些明显的东西。熟悉 nc 的人能发现我明显的错误吗?
我对以下用 Python 编写的代码有疑问:
def parse_ethernet(timestamp, packet)
ethernet = dpkt.ethernet.Ethernet(packet)
if isinstance(ethernet.data,dpkt.ip.IP):
parse_ip(ethernet.data)
Run Code Online (Sandbox Code Playgroud)
代码的想法是使用python中的dpkt库解析以太网数据包。我的问题是关于以下行:
if isinstance(ethernet.data,dpkt.ip.IP):
Run Code Online (Sandbox Code Playgroud)
为什么需要证明 ethernet.data 是否是 IP 数据包的实例?以太网数据不是总是包含 IP 数据包吗?