111,097
社区成员




Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Any, 10086));//监听vps 10086端口
sock.Listen(5);
while (true) {
try {
Socket sock_client = sock.Accept();
textBox1.BeginInvoke(new MethodInvoker(() => {
textBox1.Text += sock_client.RemoteEndPoint.ToString() + " -> in\r\n";
}));
sock_client.Send(Encoding.UTF8.GetBytes("welcome"));//回应连接好了
}
然后 上图黑框我是 telnet到 vps 的 10086 端口的 可以看到上面有 welcome字样 说明我连接过去了
然后下面是我用原始套接字发送的数据包
Socket sock_raw = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sock_raw.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
//TcpDefine 自己定义的一个类
//获取IP报文数据包 64 那个ip 差不多就是(服务器上 sock.RemoteEndPoint.IP的值)这里可乱填 因为不需要服务器来回应我
TcpDefine.IP_HEADER ipHeader = TcpDefine.GetIPHeader("64.xxx.xxx.xxx", "218.xxx.xxx.xxx");
//获取tcp报文数据包
TcpDefine.TCP_HEADER tcpHeader = TcpDefine.GetTcpHeader(
10086, //对方能获取到的远程主机的端口 差不多就是(服务器上 sock.RemoteEndPoint.Port的值) 这里可乱填不需要回应
24295, //到达端口
BitConverter.ToInt32(new byte[] { 0xc6, 0x2a, 0x35, 0x73 }, 0), //seq验证序列号 抓包抓出来的 这个不能错
BitConverter.ToInt32(new byte[] { 0x4e, 0x78, 0x28, 0x7a }, 0), //ack回应序列号(服务器回应时候 seq = ack + 1)
TcpDefine.Flag.ACK | TcpDefine.Flag.PSH //标志
);
//构造数据包
byte[] bySend = TcpDefine.GetPacketHeader(ipHeader, tcpHeader, Encoding.UTF8.GetBytes("this is a test hahaha "));
sock_raw.SendTo(bySend, new IPEndPoint(IPAddress.Parse("218.xxx.xxx.xxx"), 24295));//发送数据包
可见我执行这个程序后 在我上面 telnet 的框中出现了 test 字样 说明我的数据包正确的被接收了
下面是抓包数据
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Any, 10086));//监听vps 10086端口
sock.Listen(5);
while (true) {
try {
Socket sock_client = sock.Accept();
textBox1.BeginInvoke(new MethodInvoker(() => {
textBox1.Text += sock_client.RemoteEndPoint.ToString() + " -> in\r\n";
}));
sock_client.Send(Encoding.UTF8.GetBytes("welcome"));//回应连接好了
}
Socket sock_raw = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sock_raw.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
//TcpDefine 自己定义的一个类
//获取IP报文数据包 64 那个ip 差不多就是(服务器上 sock.RemoteEndPoint.IP的值)这里可乱填 因为不需要服务器来回应我
TcpDefine.IP_HEADER ipHeader = TcpDefine.GetIPHeader("64.xxx.xxx.xxx", "218.xxx.xxx.xxx");
//获取tcp报文数据包
TcpDefine.TCP_HEADER tcpHeader = TcpDefine.GetTcpHeader(
10086, //对方能获取到的远程主机的端口 差不多就是(服务器上 sock.RemoteEndPoint.Port的值) 这里可乱填不需要回应
24295, //到达端口
BitConverter.ToInt32(new byte[] { 0xc6, 0x2a, 0x35, 0x73 }, 0), //seq验证序列号 抓包抓出来的 这个不能错
BitConverter.ToInt32(new byte[] { 0x4e, 0x78, 0x28, 0x7a }, 0), //ack回应序列号(服务器回应时候 seq = ack + 1)
TcpDefine.Flag.ACK | TcpDefine.Flag.PSH //标志
);
//构造数据包
byte[] bySend = TcpDefine.GetPacketHeader(ipHeader, tcpHeader, Encoding.UTF8.GetBytes("this is a test hahaha "));
sock_raw.SendTo(bySend, new IPEndPoint(IPAddress.Parse("218.xxx.xxx.xxx"), 24295));//发送数据包