我想知道如何通过php的unpack函数读取结构中的结构.当我得到一个IS_MCI数据包时,我检查它的类型以确保它等于ISP_MCI,然后检查NumC以找出该数据包中有多少个CompCar结构.问题是尝试通过单个函数将这些内容解压缩到一个数组中.我总是得到一个未定义的偏移量.所以,我正在寻找一些新的眼睛.
你会如何处理这个数据包?
有问题的结构是这样的:
struct IS_MCI // Multi Car Info - if more than 8 in race then more than one of these is sent
{
byte Size; // 4 + NumC * 28
byte Type; // ISP_MCI
byte ReqI; // 0 unless this is a reply to an TINY_MCI request
byte NumC; // number of valid CompCar structs in this packet
CompCar Info[8]; // car info for each player, 1 to 8 of these (NumC)
};
struct CompCar …Run Code Online (Sandbox Code Playgroud) 我尝试在我的本地网络上发送SYN数据包并使用Wireshark监控它们,一切正常,除非我尝试将数据包发送到我自己的IP地址,它似乎"工作",因为它说发送1数据包,但它是没有真正发送,我看不到Wireshark中的数据包,也没有任何数据包的答案.我的设置是计算机A(192.168.0.1),其中TCP套接字服务器侦听端口40508,计算机B(192.168.0.2).
在计算机B上我测试:
ip=IP(src="192.168.0.2",dst="192.168.0.1")
SYN=TCP(sport=40508,dport=40508,flags="S",seq=12345)
send(ip/SYN)
Run Code Online (Sandbox Code Playgroud)
它工作正常,我看到Wireshark上的SYN数据包和192.168.0.1的SYN/ACK响应
在计算机A我测试:
ip=IP(src="192.168.0.1",dst="192.168.0.2")
SYN=TCP(sport=40508,dport=40508,flags="S",seq=12345)
send(ip/SYN)
Run Code Online (Sandbox Code Playgroud)
它工作正常,我看到SYN数据包和RST/ACK(没有服务器侦听192.168.0.2上的端口40508,因此它发送RST/ACK)响应来自192.168.0.2
但是当我尝试使用计算机A:
ip=IP(src="192.168.0.2",dst="192.168.0.1")
SYN=TCP(sport=40508,dport=40508,flags="S",seq=12345)
send(ip/SYN)
Run Code Online (Sandbox Code Playgroud)
Wireshark中没有任何内容,好像数据包从未发送过,但它像其他测试一样说:发送1个数据包.并且没有任何错误返回.如果我在计算机B上运行相同的测试并尝试将数据包发送到自己的IP地址,我遇到了同样的问题.
对于我的程序,我真的需要将SYN数据包发送到我自己的IP地址,有没有办法做到这一点还是不可能?
提前致谢,
Nolhian
我正在尝试使用tcpdump来显示在我的网络上流动的tcp数据包的内容.我有类似的东西:
tcpdump -i wlan0 -l -A
Run Code Online (Sandbox Code Playgroud)
-A选项将内容显示为ASCII文本,但我的文本似乎是UTF-8.有没有办法使用tcpdump正确显示UTF-8?你知道其他任何有用的工具吗?
非常感谢
我不想修改帧的以太网部分,但我需要修改IP数据包和帧的数据部分.
我尝试发送一个原始帧,它仍然输入IP信息.我基本上需要发送一个帧而不定义端点,除了我发送的位.
这是我得到的:
Socket s = new Socket(AddressFamily.Unspecified, SocketType.Raw, ProtocolType.Raw);
EndPoint ep = new IPEndPoint(IPAddress.Parse("205.188.100.58"),80);
s.SendTo(GetBytes(""),ep); //im sending nothing, so i expect the frame to just have ethernet stuff
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, false);
Run Code Online (Sandbox Code Playgroud)
我的问题: 使用SendTo添加帧的IP部分,我不希望这样,因为我想欺骗源IP.使用"发送"将崩溃,因为它说我需要指定一个端点.有关该怎么办的任何建议?我只是想发送一个数据包并自己定义IP部分和数据部分.
注意:不,我没有进行DOS攻击,我需要这个才能合法使用!
我知道如何定义IP部分,它只是在没有生成IP部分的情况下实际发送数据.
我正在用Java编写一个类,用于大大简化多播过程.但是,我遇到了两个大问题:
有人可以帮帮我吗?我一直在努力寻找几小时的答案,看来我的代码遵循了从多播主机连接,加入,发送和接收数据的所有基本过程.
以下是该课程相关部分的片段:
Multicaster类:
public class Multicaster {
public int port = 5540;
protected String IPAddress;
private MulticastSocket msConn;
private InetAddress netAddr;
public Multicaster(String IPAddress) {
this.IPAddress = IPAddress;
}
public String recieveData() {
byte[] buf = new byte[1000];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
try {
this.msConn.receive(pack);
new Message(pack);
String out = new String(pack.getData());
return out.substring(0, pack.getLength());
} catch (IOException e) {
return new String("");
}
}
public void joinGroup() {
try {
this.msConn.joinGroup(this.netAddr);
} catch (IOException …Run Code Online (Sandbox Code Playgroud) 我的问题是:
如何从网络接口捕获传入的IP数据包,更改其内容并从另一个网络接口重新发送?
我正在尝试发送一个DatagramPacket,然后必须等待来自服务器的Acknowlegment,以便我知道是否必须重新发送相同的数据包或发送下一个数据包.
我在客户端使用相同的套接字,发送数据包并接收确认(ack),在服务器端使用相同的,另一个套接字用于接收数据包,然后将确认发送给客户..
第一个问题是客户端正在发送数据包,服务器正在接收它,然后将确认发送给客户端,但客户端在接收确认数据包时阻塞.
我正在制作一些System.out.println以确定问题所在,但我无法找到解决此问题的方法.
第二个问题是服务器仍然总是接收数据,并且不要等待客户端发送内容,我检查了因为我得到了那些行(例如"得到长度为xxx的数据包""ack与ackNr yyy一起发送"... "虽然客户端在发送第一个数据包后仍在阻塞,但始终打印在服务器端,因为它正在等待未收到的确认!
这是CLIENT的代码:
package blatt7;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.zip.CRC32;
public class FileSender {
String zielRechner;
String filePath;
InetAddress host;
File file;
FileInputStream fis;
int readLength;
int sequenceNr = 0;
int receivedSeqNr = 1;
static int port = 7777;
int packetNr = 0;
byte[] packet = new byte[1216];
byte[] data = new byte[1200];
byte[] header = new byte[16]; …Run Code Online (Sandbox Code Playgroud) 最近,我设法在我的PC和Raspberry Pi上创建套接字,以实现两个设备之间的通信.目前,客户端能够自动向服务器发送消息.我想知道,如果有可能修改脚本来发送tcp数据包而不是纯文本消息,因为我非常希望将来使用我的PC来控制覆盆子pi,而不需要ssh/etc.
我看了一些例子,但由于我在编写自己的脚本/代码方面没有太多经验,所以我不太清楚如何去做.如果有人可以通过解释和一些例子(如果可能的话)指导我正确的方向,我将不胜感激.
无论如何这里是我正在运行的服务器/客户端脚本:
客户:
import socket
import sys
import struct
import time
#main function
if __name__ == "__main__":
if(len(sys.argv) < 2) :
print 'Usage : python client.py hostname'
sys.exit()
host = sys.argv[1]
port = 8888
#create an INET, STREAMing socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print 'Failed to create socket'
sys.exit()
print 'Socket Created'
try:
remote_ip = socket.gethostbyname( host )
s.connect((host, port))
except socket.gaierror:
print 'Hostname could not be resolved. Exiting'
sys.exit()
print 'Socket Connected to ' …Run Code Online (Sandbox Code Playgroud) 根据我对UDP的了解,它没有错误处理,没有检查发送/接收的数据序列,没有检查重复的数据包,没有检查损坏的数据包以及显然不能保证已接收发送的数据包。 。
因此,考虑到这一点,为什么实际上在UDP中存在使用校验和的选项?因为可以肯定的是,如果您要确保以正确的顺序接收发送的数据(而不损坏等),则可以使用TCP ...
谢谢你的时间 :)
我正在尝试剖析数据包,它封装了另一个类似于数据包的结构,称为"标记".结构看起来像这样
+---------+
|Ether |
+---------+
|IP | a tag
+---------+
|UDP | +------------+
+---------+ |tagNumber |
|BVLC | +------------+
+---------+ |tagClass |
|NPDU | +------------+
+---------+ +-+ |LVT field |
|APDU | | +------------+
| +------+--+ | | |
| |Tag 1 | <------+ | data |
| +---------+ | |
| |Tag 2 | +------------+
| +---------+
| |Tag n |
+------------+
Run Code Online (Sandbox Code Playgroud)
为此,我创建了一个派生自现有的类PacketListField,如下所示:
class TagListField(PacketListField):
def __init__(self):
PacketListField.__init__(
self,
"tags",
[],
guessBACNetTagClass,
Run Code Online (Sandbox Code Playgroud)
引用guessBACNetTagClass的函数返回解析标记所需的正确类.
BACNetTagClasses = …Run Code Online (Sandbox Code Playgroud)