在C中如果你有一个特定类型的数据包,你通常做的是定义一些结构并将char*转换为指向结构的指针.在此之后,您可以直接以编程方式访问网络数据包中的所有数据字段.像这样:
struct rdp_header {
int version;
char serverId[20];
};
Run Code Online (Sandbox Code Playgroud)
获得网络数据包后,您可以快速执行以下操作:
char * packet;
// receive packet
rdp_header * pckt = (rdp_header * packet);
printf("Servername : %20.20s\n", pckt.serverId);
Run Code Online (Sandbox Code Playgroud)
这种技术对基于UDP的协议非常有用,并且允许使用非常少的代码进行非常快速和非常有效的数据包解析和发送,以及简单的错误处理(只需检查数据包的长度).在java中有同样的,同样快速的方法吗?或者你被迫使用基于流的技术?
在实现dataReceived方法时,在Twisted中,似乎没有任何示例涉及被分段的数据包.在其他所有语言中,这是你手动实现的东西,所以我只是想知道这是否已经为你做了扭曲或者什么?如果是这样,我是否需要在数据包前加上长度标题?或者我必须手动执行此操作吗?如果是这样,那将是什么方式?
使用.NET,如何在任何端口上监听发送到.255的udp广播数据包,而无需绑定到特定端口?
有没有办法告诉我的网站上的用户是否已经离开(即连接丢失,导航等)?
我正在建立一个RoR网站,并且想要在用户出于任何原因离开我的网站时立即发起活动(例如,连接,离开域等)
在此先感谢您的帮助.

我如何使用此图并将其转换为可用程序.我不太确定如何阅读这个图表.如果有人可以通过我的方式,可能会显示一个代码示例以及它与图表的关系,那就太棒了.
谢谢!
我知道如何在Android中开发并使用Apache HTTP lib,但我想降低速度,掌握无线接口适配器并能够无线发送和接收数据包.我知道它可能因为在Android市场上有嗅探器应用程序.我环顾四周,谷歌搜索了很多,但似乎无法得到任何关于如何开始的想法.令人惊讶的是,似乎没有人在此之前提出这个问题.
我想没有Android API为你做这件事.请建议一种在android中发送/接收数据包的方式或发布对任何此类资源的引用.
谢谢!
注意:我知道java.net api可以在android中使用(虽然我之前没有使用它)但是这并没有给我那种我想要的访问权限.
tcmpdump可以查看eth2上特定组和端口的所有组播流量,但我的Python程序不能.在Ubuntu 12.04上运行的Python程序:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Multicast port is 52122
sock.bind(('', 52122))
# Interface eth2 IP is 1.2.3.4, multicast group is 6.7.8.9
mreq = socket.inet_aton('6.7.8.9')+socket.inet_aton('1.2.3.4')
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print '\nwaiting to receive message'
data, address = sock.recvfrom(1024)
print data
Run Code Online (Sandbox Code Playgroud)
当我使用另一个程序向eth2发送组播数据包时,它可以工作并打印数据包.但它无法看到所有当前的多播流量.如果我在与上述程序相同的端口和组上的eth2上运行tcpdump:
sudo tcpdump -i eth2 host 6.7.8.9 and port 52122
Run Code Online (Sandbox Code Playgroud)
它会看到我从另一个程序发送的数据包和所有当前的多播流量.它的输出看起来像这样......
# Packet sent from my other program
09:52:51.952714 IP 1.2.3.4.57940 > 6.7.8.9.52122: UDP, length 19
# Packet send from the outside world
09:52:52.143339 IP …Run Code Online (Sandbox Code Playgroud) 使用{packet,4}在localhost上通过两个不同的端口传输1G数据只需要8秒,而使用{packet,raw}在30秒内无法完成相同的任务.我知道如果使用后一种方法,数据将达到数万个小块(在archlinux上大小为1460字节).我已经学习了TCP/IP协议的某些方面,并且已经思考了这个问题好几天但仍然无法弄清楚什么是确切的区别.真诚期待一些自下而上的解释.
-module(test).
-export([main/1]).
-define(SOCKOPT, [binary,{active,true},{packet,4}]).
main(_) ->
{ok, LSock} = gen_tcp:listen(6677, ?SOCKOPT),
spawn(fun() -> send() end),
recv(LSock).
recv(LSock) ->
{ok, Sock} = gen_tcp:accept(LSock),
inet:setopts(Sock, ?SOCKOPT),
loop(Sock).
loop(Sock) ->
receive
{tcp, Sock, Data} ->
io:fwrite("~p~n",[bit_size(Data)]),
loop(Sock);
{tcp_closed, Sock} -> ok
end.
send() ->
timer:sleep(500),
{ok, Sock}=gen_tcp:connect("localhost", 6677, ?SOCKOPT),
gen_tcp:send(Sock, binary:copy(<<"1">>, 1073741824)),
gen_tcp:close(Sock).
Run Code Online (Sandbox Code Playgroud)
$ time escript test.erl
8589934592
real 0m8.919s
user 0m6.643s
sys 0m2.257s
有很多提供生成和发送UDP / TCP数据包的应用程序,但是我正在寻找一些在线等效的应用程序。类似于www.wakeonlan.me,但适用于由我定义的有效负载的UDP / TCP数据包(不仅仅是简单的WoL数据包)。
我编写了一些PHP代码来发送简单的UDP数据包,但不幸的是,出于安全原因,该代码已被阻止(我使用了免费的托管服务器)。
有谁知道一些用于简单数据包生成的站点?
此致,
Mopsiok
我试图解析一个TCP包,然后分配给指向有效负载开始的指针.
我正在使用C,这是我的代码到目前为止:
void dump(const unsigned char *data, int length) { //*data contains the raw packet data
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]); //? Why don't i use nthos here?
if (i < 5) printf(":");
}
unsigned short ethernet_type = ntohs(eth_header->ether_type);
printf("\nType: %hu\n", ethernet_type);
if …Run Code Online (Sandbox Code Playgroud)