我正在研究数据包捕获程序.IP数据包是否可以设置FIN标志但是还有数据?
我正在编写一个基于UDP的客户端服务器并且已经获得了相当多的代码,但我对UDP服务器如何将响应发送回UDP客户端感到困惑,这是我的理解,直到现在:
我的困惑是,在服务器端,有一个套接字绑定到UDP端口并"连续"监听任何UDP客户端请求,但在客户端不是这样,UDP客户端将打开一个套接字发送请求到UDP服务器,那就是它,我认为它不能保持该端口挂起UDP服务器响应,如果该端口关闭,那么客户端将如何接收响应.
我的意思是说,UDP服务器的响应将返回UDP客户端,因为IP地址在那里,但一旦该响应已到达客户端的UDP模块,即使有一个端口,但UDP模块如何将其发送给最初的客户端发送请求是因为它会关闭绑定到该端口的套接字?或者它不会?
我正在寻找能够清楚地描述UDP通信的答案(我不想将它与TCP进行对比或解释TCP,因为我已经对TCP有了一定的了解),尤其是响应将如何回到UDP客户端.
我正在厨房打印机(Aclas KP71M)上实施ESC/POS(Epson销售点标准代码).
我有一个用户界面,POS用户将其字符串输入到用户界面,用户输入的字符串将被发送到打印机,打印机打印数据.
打印机与主机的接口使用以太网(100M)使用TCP/IP连接.
我已经设法将每个必要的命令嵌入到C#方法中,我还在服务器/客户端C#连接上获取了一些示例代码,并尝试将其包含在我的连接中.
我现在面临的问题是我的代码似乎开始连接但是它立即冻结而没有做任何事情并且停止了连接.如果有人可以纠正我,或者告诉我问题出在哪里,我将非常感激,或者给我一些关于如何进行的想法?
这是代码.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace ESC_POS
{
public partial class Form1 : Form
{
public string tableNumber;
public string itemOrdered;
public string orderedQuantity;
public string waiterName;
public string orderDestination;
public string orderNumber;
const int MAX_CLIENTS = 10;
public AsyncCallback pfnWorkerCallBack;
private Socket m_mainSocket;
private Socket[] m_workerSocket = new Socket[10];
private int m_clientCount = 0;//Server declarations
byte[] m_dataBuffer …Run Code Online (Sandbox Code Playgroud) 在Delphi XE2中,我使用该TTCPClient组件与RTSP服务器通信.在试验和错误没有得到服务器的响应后,我切换项目通过端口80发送HTTP请求(而不是RTSP的554)并尝试向网站发送请求(特别是www.google.com).我还没有得到任何回应.
我TTCPClient在主窗体(Form1)上调用了一个组件Client,一个TMemo名为control 的控件Log,一个TEdit名为control 的控件txtHost和一个TBitBtn控件.这是代码的相关部分:
连接到服务器
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Client.Active then Client.Disconnect;
Client.RemoteHost:= txtHost.Text;
Client.RemotePort:= '80'; // '554';
Client.Connect;
end;
Run Code Online (Sandbox Code Playgroud)
OnConnect事件处理程序(HTTP)
procedure TForm1.ClientConnect(Sender: TObject);
var
S: String;
begin
Client.Sendln('GET / HTTP/1.0');
Client.SendLn('');
end;
Run Code Online (Sandbox Code Playgroud)
OnConnect事件处理程序(RTSP)
procedure TForm1.ClientConnect(Sender: TObject);
var
S: String;
begin
Client.SendLn('OPTIONS * RTSP/1.0');
Client.SendLn('CSeq:0');
Client.SendLn('');
end;
Run Code Online (Sandbox Code Playgroud)
OnReceive事件处理程序
procedure TForm1.ClientReceive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
var
S, R: String; …Run Code Online (Sandbox Code Playgroud) Traceroute是一个跟踪从A到B的路径的应用程序.(A是您的位置,B是您要跟踪的服务器).在Windows中,您可以键入tracert.主要算法是:
send UDP with TTL = 1
Server A1 received, and return ICMP packet to A because TTL is expired.
--> know first machine between. For example A1.
send UDP with TTL = 2
Server A1 received, and send this UDP to server A2.
Server A2 received, and return ICMP packet to A because TTL is expired
--> know second machine between. In this example is A2.
Do it until to B. we can track down: A -> …Run Code Online (Sandbox Code Playgroud) 我已经整理了一个perl脚本,通过Linux :: TunTap将数据包读入用户空间,这一切似乎都运行良好:
#!/usr/bin/perl
use warnings;
use strict;
use Linux::TunTap;
$tun = new Linux::TunTap(NAME => 'localtun')
or die "Couldn't connect to IF\n";
while (my $packet = $tun->get_raw()) {
print Dumper($packet);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:如何将表示从tntap设备读取的原始IP数据包的字符串转换为适当的数据结构进行处理?特别是我在源,目的地和序列号之后.
显然,原始IP数据包的原始格式不是很易读.这是通过tuntap接口发送ping后的输出:
{{{?}/??8V?| !"#$%&'()*+,-./0123456ET??@@4
如何从此处继续以编程方式处理此数据?
我想以编程方式在 Android 中获取默认网关。我首先找到了以下解决方案:@Sandeep 回答的代码中路由器的 IP 地址
然后我意识到formatIpAddress已被弃用。如文档所述:我们可以getHostAddress()
我还认为,这更好,因为我可能不需要像@Sandeep 在他的回答中提到的那样为我的应用程序添加新权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)
我使用了以下解决方案get default gateway,例如:How to get default gateway using Ethernet, not wifi
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) …Run Code Online (Sandbox Code Playgroud) 我有一个动态的IP地址,事实上我可以从我的路由器页面(http://192.168.1.1)点击发布然后续订.
我可以通过curl将http请求发送到http://192.168.1.1页面,但这只能在我使用该路由器的计算机上解决问题.
所以我很想知道是否有办法通过c ++更新我的IP而不通过路由器页面(192.168.1.1).
我也从命令行尝试过没有正面结果.我试过的代码如下:
ipconfig /release
ipconfig /renew
Run Code Online (Sandbox Code Playgroud)
我也试过这段代码:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib, "iphlpapi.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
// Before calling IpReleaseAddress and IpRenewAddress we use
// GetInterfaceInfo to retrieve a handle to the adapter
void __cdecl main()
{
ULONG ulOutBufLen = 0;
DWORD dwRetVal = 0;
PIP_INTERFACE_INFO pInfo;
pInfo = (IP_INTERFACE_INFO *)MALLOC(sizeof(IP_INTERFACE_INFO));
// Make an …Run Code Online (Sandbox Code Playgroud) 我实际上在一个Web应用程序(ASP.NET MVC)上工作,它在TCP/IP的本地网络上向胖客户端应用程序(我无法修改)发送命令.我需要胖客户端应用程序响应我的命令或给我信息,所以连接需要一直打开.我创建一个循环来检查服务器响应,如下所示:
public static async void getMessage()
{
while(true)
{
// Buffer to store the response bytes.
Byte[] data = new Byte[100000];
// String to store the response ASCII representation.
String responseData = String.Empty;
// Read the first batch of the TcpServer response bytes.
Int32 bytes = await stream.ReadAsync(data, 0, data.Length);
if (bytes == 0) continue;
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Debug.Write(responseData);
await stream.ReadAsync(data, 0, data.Length);
}
}
Run Code Online (Sandbox Code Playgroud)
这实际上是有效的,我收到了来自服务器的响应,但是浏览器一直在"等待localhost",那么有没有更好的方法来做到这一点,没有浏览器上的循环?
非常感谢 !
我知道 RLPx 是基于 Kademlia DHT 的协议,但我不确定的一件事是该协议的需求或它试图解决的问题是什么?
此外它说它的目标是允许多个协议通过单个连接是什么意思?
还有这部分是什么意思
RLPx 是一种加密的对等网络和协议套件,它为应用程序通过 p2p 网络进行通信提供了通用传输和接口。
network-programming network-protocols tcp-ip blockchain ethereum