我刚刚开始网络编程,但我在跟上一些东西方面遇到了困难。那是因为有很多自动魔法的东西隐藏在我看不见的地方,而我无法理解这一切。在我当前的应用程序中,我像这样接受用户输入:
char buff[1024];
cout << "Enter a message:";
fgets(buff, 1024, stdin);
Run Code Online (Sandbox Code Playgroud)
我可以通过基本上这样做来轻松地发送它:
sendto(m_socket, buff, size, flags, (SOCKADDR*)&addr, sizeof(addr));
Run Code Online (Sandbox Code Playgroud)
其他变量(大小、标志等)显然是在输入和 sendto 调用之间的某个位置进行初始化和配置的。
这一切都工作正常,另一端也可以正常接收数据。服务器做
recvfrom(m_socket, (char*)data, max, flags, (SOCKADDR*)&fromAddr, &fromLength)
Run Code Online (Sandbox Code Playgroud)
然后我可以将“数据”打印到控制台中,这就是我的消息。
那么我的 UDP 数据包标头到底在哪里?我必须指定它吗?当我传入一些数据时,标准 UDP 数据包的“数据”部分是否填充了我指定的数据,并且标头自动为我填充(源 IP、目标 IP)?如果是这样,我该如何访问它?
我看过的很多网站都讨论了标题和其他内容。这似乎是一个非常具体的事情。但我不明白这个虚幻的标头是如何工作的。我想用段号、总段等来定义我自己的标头,但我根本不知道如何去做。我的谷歌搜索也没有引导我走向正确的方向..!
我正在转储传出流量。我只想要发往局域网外的 TCP 和 UDP 数据包,别无其他。我只是在 tcpdump 中使用了以下过滤器:
ip and (tcp or udp) and (not icmp) and src host myIPAddr and not dst net myNet/myNetBits and not ip broadcast
Run Code Online (Sandbox Code Playgroud)
但我捕获了以下数据包:
###[ Ethernet ]###
dst = ff:ff:ff:ff:ff:ff
src = 00:1e:4a:e0:9e:00
type = 0x806
###[ ARP ]###
hwtype = 0x1
ptype = 0x800
hwlen = 6
plen = 4
op = who-has
hwsrc = 00:1e:4a:e0:9e:00
psrc = X.X.X.X
hwdst = 00:00:00:00:00:00
pdst = Y.Y.Y.Y
###[ Padding ]###
load = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我以为我只转储IP …
我在android中开发防火墙应用程序,我需要根据uid识别应用程序。我已经创建了一个vpn服务,并且能够捕获数据包并获取目标ip地址。
有什么方法可以从数据包或数据报套接字获取应用程序的uid。
void
got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
static int count = 1; /* packet counter */
/* declare pointers to packet headers */
const struct sniff_ethernet *ethernet; /* The ethernet header [1] */
const struct sniff_ip *ip; /* The IP header */
const struct sniff_tcp *tcp; /* The TCP header */
const char *payload; /* Packet payload */
int size_ip;
int size_tcp;
int size_payload;
printf("\nPacket number %d:\n", count);
count++;
/* define ethernet header */
ethernet = …Run Code Online (Sandbox Code Playgroud) 我正在寻找创建我称之为代理的东西,尽管这个定义可能有点不准确.
通常,你有这样的事情:
Client --------- Server
Run Code Online (Sandbox Code Playgroud)
我想要做的是引入代理,没有新的层,如下所示:
Client ----+---- Server
|
Proxy
Run Code Online (Sandbox Code Playgroud)
我不想要这个:
Client---Proxy---Server
Run Code Online (Sandbox Code Playgroud)
我知道WinPCap做了类似的事情,但据我所知,这是一个记录不完整的主题.
到目前为止,我已经尝试了一些事情,最值得注意的是在与客户端相同的端口上侦听消息.这导致了从随机应用程序接收到大量垃圾数据包(尽管在特定端口上侦听).我找不到很多建议我正在阅读正确的数据,虽然我相信我已经发现现在,经过一些小的修改.
有没有人知道反对使用这种方法的任何理由?或者有更可持续的方式吗?
我想知道如何发送语言C的ARP数据包,从套接字发送和发送的函数通过TCP或UDP发送,但我没有找到如何使用ARP.
我正在使用kryonet从服务器和客户端来回发送对象.只要收到对象,就会运行一个侦听器.它似乎决定对象实例的唯一方法是使用:
if(object instanceof ClientLoginPacket){
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么是instanceof检查以确定对象是否属于特定类型.它检查类是否与所有代码完全相同,是否检查变量和名称?它也检查导入的包吗?你给我的任何信息都可以提供帮助.
我想知道这个的原因是因为我制作数据包的方式,服务器方法中的代码与客户端不同.例如,在我的客户端发送数据包我做:
public void send(){
Client.sendPacketTCP(this);
}
Run Code Online (Sandbox Code Playgroud)
在我的服务器上我这样做:
public void send(){
Server.sendPacketTCP(this);
}
Run Code Online (Sandbox Code Playgroud) 我很困惑何时使用ntohs和ntohl.我知道你在uint16_t和ntohl uint32_t使用ntohs的时候.但是那些使用unsigned int或者指定了特定位数的那些(例如u_int16_t doff:4;).
这是我的工作代码来说明问题:
// Utility/Debugging method for dumping raw packet data
void dump(const unsigned char *data, int length) {
unsigned int i;
static unsigned long pcount = 0;
// Decode Packet Header
struct ether_header *eth_header = (struct ether_header *) data;
printf("\n\n === PACKET %ld HEADER ===\n", pcount);
printf("\nSource MAC: ");
for (i = 0; i < 6; ++i) {
printf("%02x", eth_header->ether_shost[i]);
if (i < 5) {
printf(":");
}
}
printf("\nDestination MAC: ");
unsigned short ethernet_type = ntohs(eth_header->ether_type);
printf("\nType: …Run Code Online (Sandbox Code Playgroud) 我正在写一个MPEG-TS文件解析器,我一直在从PAT部分获取program_numbers和PID.我正在使用数据包分析器来比较我的结果.
例如,这是一个PAT数据包
47 40 00 16 00 00 B0 31 00 14 D7 00 00 00 00 E0
10 00 01 E0 24 00 02 E0 25 00 03 E0 30 00 04 E0
31 00 1A E0 67 00 1C E0 6F 43 9D E3 F1 43 A3 E3
F7 43 AC E4 00 C3 69 A6 D8 FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF …Run Code Online (Sandbox Code Playgroud)