想象一下,用户坐在以太网连接的PC上.他打开了一个浏览器.他在地址栏中输入"www.google.com"并点击进入.
现在告诉我在以太网上出现的第一个数据包是什么.
我在这里找到了这个问题:关于套接字编程和多线程的访谈问题
由于我不是网络专家,我想听听答案(我认为这是"它取决于";)).
使用像Wireshark这样的工具,我显然可以检查自己的计算机行为.我想知道我看到的数据包(例如ARP,DNS,VRRP)在每个以太网配置中是否相同(它依赖于操作系统?驱动程序?浏览器甚至:)?)以及哪些条件它们出现了.在数据链路层,它是否可能依赖于物理网络(连接到集线器/交换机/路由器)?
是否有一个库允许我对传入和传出数据包执行链路层数据包修改?
基本上我想根据传入的MAC地址,IP地址,端口等对数据包进行一些转换(例如,更改IP有效负载).我还希望能够对传出的数据包执行相同的操作,即修改数据包在他们离开系统之前.
基本上,我在查看Motorstorm排行榜的同时在我的PS3上收发数据包.排行榜以XML格式发送到我的ps3,但只有在我获得授权后才能发送.那么有人可以告诉我这三个数据包之间发生了什么以及我如何在浏览器中复制它?
数据包1从我的PS3到索尼服务器
POST /ranking_view/func/get_player_rank HTTP/1.1
Host: ranking-view-a01.u0.np.community.playstation.net
Connection: Keep-Alive
Content-Length: 213
Authorization: Digest username="c7y-ranking01", realm="c7y-ranking", nonce="2SpsV4WABAA=47a2b36030cd94de1190f6b9f05db1bd5584bc2a", uri="/ranking_view/func/get_player_rank", qop="auth", nc="00000001", cnonce="d4eb1eb60ab4efaea1476869d83a6e0b", response="96b55c6e79f84dd41b46eb66bed1c167"
Accept-Encoding: identity
User-Agent: PS3Community-agent/1.0.0 libhttp/1.0.0
<?xml version="1.0" encoding="utf-8"?><ranking platform="ps3" sv="3.15"><titleid>NPWR00012_00</titleid><board>7</board><jid>Panzerborn@a5.gb.np.playstation.net</jid><option message="false" info="false"/></ranking>
Run Code Online (Sandbox Code Playgroud)
Packet 2 Sony Server回应我的PS3
Date: Fri, 26 Feb 2010 19:06:12 GMT
WWW-Authenticate: Digest realm="c7y-ranking", nonce="a3PFl4WABAA=6d375259676ec79641448a8032a795b8e12ccae4", algorithm=MD5, stale=true, qop="auth"
Content-Length: 401
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that …
Run Code Online (Sandbox Code Playgroud) 我正在使用UdpClient来查询游戏服务器有关服务器名称,地图,玩家数量等的信息.
我已按照此页面上的指南(A2S_INFO) http://developer.valvesoftware.com/wiki/Server_queries#Source_servers
我收到了正确答复:
替代文字http://data.fuskbugg.se/skalman01/reply.JPG
我不知道如何获取每一块信息(服务器名称,地图等).
有帮助吗?我假设我必须查看我链接的wiki中指定的回复格式,但我不知道该怎么做.
是否有一些花哨的printf语法在打印字符串时忽略空值?
示例用例:打印包含一堆空终止字符串的网络数据包.
我的测试代码来说明问题:
#include <cstdio>
#include <cstring>
void main()
{
char buffer[32];
const char h[] = "hello";
const char w[] = "world";
const int size = sizeof(w) + sizeof(h);
memcpy(buffer, h, sizeof(h));
memcpy(buffer + sizeof(h), w, sizeof(w));
//try printing stuff with printf
printf("prints only 'hello' [%s]\n",buffer);
printf("this prints '<bunch of spaces> hello' [%*s]\n",size,buffer);
printf("and this prints 'hello' [%.*s]\n",size,buffer);
//hack fixup code
for(int i = 0; i < size; ++i)
{
if(buffer[i] == 0)
buffer[i] = ' ';
}
printf("this prints …
Run Code Online (Sandbox Code Playgroud) 我在一段时间后想出了一种技术,我一直在多个项目中使用它.它使用单个字符串来存储值列表.每个值都以值的大小为前缀,然后是分隔符(大小之后),然后是数据 - 并重复.使用此技术意味着您可以在字面上存储任何类型的字符,而不会尝试在值之间排除使用分隔符.
这是一个这样的字符串示例:
23|This is the first value13|Another value5|third
这转换为这些值的列表:
我通过测试得知这个方法(以及我在这个字符串和数组或字符串列表之间进行转换的函数)非常快,同时保持最小的内存.它对于发送数据包也非常有用(这是我第一次提出这种方法的地方).
这有技术名称吗?在这种情况下,解析过于宽泛,必须有一个更具体的术语.
通常我们可以通过某种工具设置代理服务器,例如CCProxy,它为HTTP,SOCKS,FTP数据包等提供代理服务.此外,Proxifier或Proxycap用于在客户端PC上转发特定应用程序的数据包.但是,当UDP数据包转发到代理服务器时,这些数据包无法正确转发到应用程序希望它们去的目标.当我使用网络分析仪观察UDP流量时,UDP数据包只是从我的PC传递到代理服务器,最后没有到达正确的目的地.
此外,有人建议在代理服务器中未启用UDP中继,因此UDP数据包无法成功路由.如何在代理服务器上启用UDP中继功能?(假设我可以完全控制代理服务器)
我试图在我的Python3本地LAN服务器脚本和我的Android设备之间建立连接.在测试时我正在使用Android虚拟设备管理器.主要目标是长时间(1小时)保持服务器和客户端之间的连接.
是否有任何好的库可以发送和接收Android的数据包并使事情变得更容易?电话必须作为客户端工作,可以从服务器发送和接收数据.
PS Im针对API 15.
我只设法将数据包发送到Python并在控制台中打印它们.我正在使用PrintWriter类发送数据和java.net.Socket类来打开一个套接字.试图读取传入的数据,但有很多错误.
我已经制作了一个包内部的数据包,如下所示:
//A packet buffer object
package Packet
import (
"bytes"
"encoding/binary"
)
type Packet struct {
buffer bytes.Buffer
}
func (p Packet) GetBytes() []byte {
return p.buffer.Bytes()
}
func (p Packet) AddString(s string) {
p.buffer.Write([]byte(s))
}
func (p Packet) AddInt(i_ int) {
//Convert int to byte
b := make([]byte, 2)
binary.LittleEndian.PutUint16(b, uint16(i_))
//Push byte to buffer
p.buffer.Write([]byte(b))
}
func (p Packet) AddByte(b []byte) {
p.buffer.Write(b)
}
Run Code Online (Sandbox Code Playgroud)
这是使用数据包结构形成数据包并将其发送到客户端的会话包
package Session
type MapleSession struct {
connection net.Conn
EncryptIV, DecryptIV []byte
isConnected bool …
Run Code Online (Sandbox Code Playgroud) 假设我有一个支持GSM 800/900Mhz频段的Android设备,我想用它作为发射器远程控制汽车或其他任何东西.是否可以在Android上编程这样的东西?也许使用NDK?目的是在这些频率上发送自定义数据包.
谢谢.