我一直在尝试编写一个可以嗅探HTTP头的脚本.到目前为止,我已经将套接字绑定到端口80并且数据包似乎已被接收,但我无法将它们转换为字符串形式.所有输出都是"E"连续.我之前将字节更改为十六进制,似乎有一些数据进入,但当前代码无法将字节更改为字符串.有没有其他方法解码将提供正确字符串的字节?
byte[] input = BitConverter.GetBytes(1);
byte[] buffer = new byte[4096];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse(strIP), 80));
s.IOControl(IOControlCode.ReceiveAll, input, null);
int bytes;
bytes = s.Receive(buffer);
while (bytes > 0)
{
log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes));
bytes = s.Receive(buffer);
}
Run Code Online (Sandbox Code Playgroud) 我有关于串行通信中的消息解析的想法,有很多种具有不同形式的数据包。但它们都是通过字节数组发送的。
所以我想使用 union 来解析每条消息。但效果不佳。以下代码是我出错的示例代码
[StructLayout(LayoutKind.Explicit, Size=12)]
public struct UnionPacket
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=12)]
public byte[] data;
[FieldOffset(0)]
public float Time;
[FieldOffset(4)]
public Int16 CoordX;
[FieldOffset(6)]
public Int16 CoordY;
[FieldOffset(8)]
public byte Red;
[FieldOffset(9)]
public byte Green;
[FieldOffset(10)]
public byte Blue;
[FieldOffset(11)]
public byte Alpha;
}
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,它会很高兴,但事实并非如此。此代码发生 TypeLoadException “...因为它在偏移 0 处包含一个对象字段,该字段未正确对齐或与非对象字段重叠。”
所以我改变了一些这样的代码
[StructLayout(LayoutKind.Explicit, Size= 12)]
public struct UnionPacket
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
[FieldOffset(0)]
public byte[] data;
//[FieldOffset(0)]
//public float Time;
[FieldOffset(4)]
public Int16 CoordX;
[FieldOffset(6)]
public Int16 CoordY;
[FieldOffset(8)]
public byte …Run Code Online (Sandbox Code Playgroud) 我发现这个教程是为了唤醒局域网,但我无法完全理解它.它在Qt3中实现.我想要可以使用Qt5编译的LAN唤醒功能.如何使用上述代码使用Qt5通过LAN唤醒计算机?
我一直在研究一个基本上像Minechat(基于文本的应用程序,只是查看聊天)的java程序.我从来没有真正使用过网络,所以问题是弄清楚如何正确发送数据包.我目前处于与服务器创建握手的位置.经过几个小时的研究,我提出了以下代码,但它总是遇到"Failed!(Exception)"消息.对我而言,一切看起来都是正确的,但据我所知,这可能是100%错误的.如果有人能指出我在这里做错了什么,我真的很感激.
public static void main(String[] args) throws IOException {
host = new InetSocketAddress("162.244.165.111", 48040);
socket = new Socket();
System.out.println("Connecting...");
socket.connect(host, 3000);
System.out.println("Done!");
System.out.println("Making streams...");
output = new DataOutputStream(socket.getOutputStream());
input = new DataInputStream(socket.getInputStream());
System.out.println("Done!");
System.out.println("Attempting handshake... "+host.getAddress().toString().substring(1));
byte[] msg = ("47;"+host.getAddress().toString().substring(1)+";"+host.getPort()+";2;").getBytes(Charset.forName("UTF-16"));
output.writeInt(msg.length+Integer.valueOf(0x00));
output.writeByte(0x00);
output.write(msg);
output.flush();
try {
if (input.readByte() != 0x02)
System.out.println("Failed!");
else
System.out.println("Done!");
} catch (EOFException e) {
System.out.println("Failed! (Exception)");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:更多的研究表明我使用字节数组,但这让我对如何表示字符串和使用字符串感到困惑?
我尝试在连接到 wifi 时使用 scapy 发送数据包,但出现关于“dnet.pyx”的错误。但是当我连接到有线连接时,它起作用了。我在互联网上搜索了很多关于这个问题的信息,但没有任何答案。scapy和wifi有问题吗?还是我的电脑/scapy有问题?
编辑:
send(IP(dst="204.11.192.171")/UDP(dport=5070)/"hello world")
Run Code Online (Sandbox Code Playgroud)
使用wifi,错误消息是:
Traceback (most recent call last):
File "C:/Users/Tamir/PycharmProjects/SIP/main.py", line 10, in <module>
send(IP(dst="204.11.192.171")/UDP(dport=5070)/"hello world")
File "C:\Python27\lib\site-packages\scapy_real-2.2.0_dev-py2.7.egg\scapy\sendrecv.py", line 251, in send
__gen_send(conf.L3socket(*args, **kargs), x, inter=inter, loop=loop, count=count,verbose=verbose, realtime=realtime)
File "C:\Python27\lib\site-packages\scapy_real-2.2.0_dev-py2.7.egg\scapy\sendrecv.py", line 234, in __gen_send
s.send(p)
File "C:\Python27\lib\site-packages\scapy_real-2.2.0_dev-py2.7.egg\scapy\arch\pcapdnet.py", line 237, in send
ifs = dnet.eth(iff)
File "dnet.pyx", line 112, in dnet.eth.__init__ (./dnet.c:1764)
OSError: No such file or directory
Run Code Online (Sandbox Code Playgroud)
有线连接没有错误
我正在编写一个Java TCP客户端,它将数据块发送到C服务器.客户端 - 服务器在我的开发PC上运行良好.在硬件板上部署时,此代码显示数据包丢失.我只有我的日志,我知道服务器没有收到所有数据包.我没有要测试的硬件.因此,在第一级,我想非常确定客户端代码确实发送了所有必需的数据.
这是我的代码(Java中的客户端部分).我如何确保这样做?是否有一些重定时命令等命令?
Socket mySocket = new Socket("10.0.0.2",2800);
OutputStream os = mySocket.getOutputStream();
System.out.println(" Sending 8 byte Header Msg with length of following data to Server");
os.write(hdr, 0, 8);
os.flush();
System.out.println(" Sending Data ");
start = 0;
for(int index=0; index < ((rbuffer.length/chucksize)+1); index++){
if(start + chucksize > rbuffer.length) {
System.arraycopy(rbuffer, start, val, 0, rbuffer.length - start);
} else {
System.arraycopy(rbuffer, start, val, 0, chucksize);
}
start += chucksize ;
os.write(val,0,chucksize);
os.flush();
}
Run Code Online (Sandbox Code Playgroud)
以下是接收此数据的C片段:
while ((bytes_received = recv(connected, rMsg, sizeof(rMsg),0)) …Run Code Online (Sandbox Code Playgroud) 我学习了在小型网络中使用voip over udp.我知道有一些库准备好了,并且通过一些方法调用来完成我所需要的一切,但正如我所说的我正在学习,所以需要重新发明轮子以了解它是如何工作的.
我目前正在调查DatagramPacket类,我注意到没有方法可以在DatagramPacket类中设置标头信息(即我需要知道的用于交错的包顺序序列号).
一个反映环境的小代码:
byte[] block;
DatagramPacket packet; // UDP packet
/* x Bytes per block , y blocks per second,
z ms time block playback duration */
block = recorder.getBlock(); // assume I have class that handles audio
// recording and returns speech in a
// uncompressed form of bytes
packet = new DatagramPacket(block, block.length, clientIP, PORT);
Run Code Online (Sandbox Code Playgroud)
首先,我假设因为它是UDP,除了他在某处抛出数据包的简单事实之外,发送者并不真正关心任何事情.所以这就是内部没有这种方法的原因.
其次,我假设我需要自己做 - 在要发送的字节块中添加额外的字节,其中包含数据包的序列号?但是我也担心如果我这样做,那么我如何识别字节是字节字节而不是音频字节?我可以假设第一个字节代表一个数字,但我们知道该字节只能代表258个数字.我以前从未在字节级别上工作过.或者可能有其他技术?
简而言之,要做交错,我需要知道如何设置数据包序列号,因为我无法订购无序数据包:-)
谢谢,
众所周知,UDP(用户数据报协议)是不安全的,因为与它一起发送的数据包的顺序可能无法按顺序传递,甚至根本不可能.但是,如果传送UDP数据包.实际意义上(99.99%及以上)的数据包中的信息是否保证是正确的?
在实际意义上(99.99%及以上),UDP数据包是否被保证完整(未损坏)?
提前致谢!
我使用Boost C++实现了一个P2P应用程序.因为你没有UDP不保证数据包顺序甚至数据包传递,所以我想到:
将所有收到的UDP数据包放入链接列表中的一个请求并正确排序,以便可以以健壮的方式识别序列和丢失的数据包.链接列表使用struct.或者
我想把它放在一个向量中并在一个单独的线程中将数据包安排在向量中.
哪一个是最好的方法?或者除了窗口滑动之外你还有其他最好的方法吗?
我已经看到(通过实际读取 tun 设备)Linux 上的 tun 驱动程序可以在一次读取中返回多个 IP 数据包。反之亦然 - 您可以在一次写入 tun 设备中写入多个 IP 数据包吗?