我想以编程方式在 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) 我知道 RLPx 是基于 Kademlia DHT 的协议,但我不确定的一件事是该协议的需求或它试图解决的问题是什么?
此外它说它的目标是允许多个协议通过单个连接是什么意思?
还有这部分是什么意思
RLPx 是一种加密的对等网络和协议套件,它为应用程序通过 p2p 网络进行通信提供了通用传输和接口。
network-programming network-protocols tcp-ip blockchain ethereum
我需要通过网络将一些复杂的对象发送给对等体.我编写了代码来使用ostream序列化它们,并为需要序列化的对象中的每个类成员运算符<<.我编写的代码成功地用于序列化和网络发送(正确使用htonl(),htons()等 - 我通过以二进制格式写入ofstream(本地文件)检查了上述内容(std :: ios :: bin我的下一个任务是通过网络套接字写这个二进制数据,这是我遇到问题的地方.
我有Socket类,它将std :: string对象转换为C风格的字符串,然后通过套接字发送它们,如下所示:
int Socket::send (const std::string goodies) const
{
status = ::send (socket, goodies.c_str(), goodies.size(), 0);
return status;
}
Run Code Online (Sandbox Code Playgroud)
我在接收器中使用的相同Socket类使用recv()将传入消息放入std :: string,然后将其传递给反序列化应用程序:
int Socket::recv (std::string& goodies)
{
char buf [1024];
goodies = "";
memset (buf, 0, 1025);
int status = ::recv (socket, buf, 1024, 0);
if (status < 0)
{
return -1;
}
else if (status == 0)
{
return 0;
}
else
{
goodies = buf;
return status;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码进行发送: …
我遇到连接到SQL Server 2012的远程实例的服务的问题.
.NET 2.0服务在客户端计算机上运行,它使用TCP/IP连接到当前运行SQL Server 2012实例的远程Web服务器.该Web服务器曾经是Windows Server 2003和SQL Server 2005并已升级6几个月前没有任何问题.然后,该服务检查是否有任何需要下载的数据.
客户端机器
网络服务器
直到上周五它突然停止工作并且它给出以下错误日志消息,这运行正常5年以上
Event Type: Warning
Event Source:
Event Category: None
Event ID: 0
Date: 21/05/2013
Time: 16:45:11
User: N/A
Computer:
Description:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject …Run Code Online (Sandbox Code Playgroud) 您好我使用nfqueue和scapy我的目标是在我的NFQUEUE接收数据包,更改有效负载并重新发送它们.
我可以在没有任何问题的情况下更改像TTL这样的字段,但是当涉及到更改有效负载时,我正在解决问题.
当我更改有效负载时,我用wireshark嗅探数据包,显然我发送的数据包修改了有效负载,但服务器没有回答.
这是我的代码:
#!/usr/bin/env python
import nfqueue
from scapy.all import *
def callback(payload):
data = payload.get_data()
pkt = IP(data)
pkt[TCP].payload = str(pkt[TCP].payload).replace("ABC","GET")
pkt[IP].ttl = 40
print 'Data: '+ str(pkt[TCP].payload)
print 'TTL: ' + str(pkt[IP].ttl)
del pkt[IP].chksum
payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
def main():
q = nfqueue.queue()
q.open()
q.bind(socket.AF_INET)
q.set_callback(callback)
q.create_queue(0)
try:
q.try_run() # Main loop
except KeyboardInterrupt:
q.unbind(socket.AF_INET)
q.close()
main()
Run Code Online (Sandbox Code Playgroud)
我已将此规则设置为端口80的传出流量: iptables -I OUTPUT -s 192.168.1.10 -p tcp --dport 80 -j NFQUEUE
并且,为了测试它,例如我打开telnet到谷歌端口80,做一个GET / HTTP/1.1,这就是我所看到的:
TTL: 40
DATA: GET …Run Code Online (Sandbox Code Playgroud) 目标是在具有多个接口和实时ips的计算机上频繁更改默认传出源ip.
我根据其文档使用ip route replace default,让脚本在循环中运行一段时间.它改变了源IP一段时间,但随后所有对该机器的互联网访问都丢失了.必须从Web界面远程重新启动才能使任何工作正常
是否有任何可能阻止这种情况稳定运行的事情.我在多台服务器上试过这个?
以下是最低限度的示例
# extract all currently active source ips except loopback
IPs="$(ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 |
awk '{ print $1}')"
read -a ip_arr <<<$IPs
# extract all currently active mac / ethernet addresses
Int="$(ifconfig | grep 'eth'| grep -v 'lo' | awk '{print $1}')"
read -a eth_arr <<<$Int
ip_len=${#ip_arr[@]}
eth_len=${#eth_arr[@]}
i=0;
e=0;
while(true); do
#ip route replace 0.0.0.0 dev eth0:1 src 192.168.1.18
route_cmd="ip route replace 0.0.0.0 dev …Run Code Online (Sandbox Code Playgroud) 我有一个带有2个NIC的Linux虚拟服务器。
eth0 <IP1>
eth1 <IP2>
Run Code Online (Sandbox Code Playgroud)
arp_filter打开并rp_filter设置为2(宽松模式)。
策略路由配置如下:
table T1
default via <GW> dev eth0 src <IP1>
127.0.0.0/8 dev lo
<LAN> dev eth0 src <IP1>
table T2
default via <GW> dev eth1 src <IP2>
127.0.0.0/8 dev lo
<LAN> dev eth1 src <IP2>
ip rule add from <IP1> table T1
ip rule add from <IP2> table T2
Run Code Online (Sandbox Code Playgroud)
在那之后,我可以ping二者结合的floatingips <IP1>和<IP2>来自外部。但是没有用ping -I eth1 <some_domain>。tcpdump显示了当我从eth1外部ping时,Linux直接询问MAC外部地址,这是不正确的,因为它们不是相同的LAN。
这是tcpdump …
MQTT是机器对机器(M2M)/"物联网"连接协议.它被设计为一个非常轻量级的发布/订阅消息传输.
与其他基于TCP/IP或套接字的协议相比,是什么让MQTT"极轻量化"?
我目前是第一次使用 python 的套接字库,我对计算机网络不是很有经验。
我能够连接到服务器,并且 tcp 握手已经发生,如wireshark所见。与服务器建立连接后(我无法控制服务器),连接会保持打开状态一段时间,但一小段时间后,服务器发送“FIN,ACK”并终止连接。我试图了解如何在客户端能够访问服务器时保持此连接活动。
查看 tcp 连接,似乎可以每隔一段时间发送一个数据包。也许是一种保持活动状态的信息。我原以为socket.send('hello')在另一个线程中每 5 秒使用一次会保持与服务器的连接打开,但一段时间后我仍然收到“FIN,ACK”。
在文档中我发现了一个setsockopt()但是使用它没有明显的区别。我client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)在建立连接之前和之后都尝试过。我不完全理解这种方法应该如何工作,所以也许我用错了。没有太多提到这一点。我在某处读到它在窗户上被打破了。我不知道其中的真相。
我错过了什么?除非我可能遗漏了某些内容,否则套接字的文档似乎没有任何关于此的内容。
import socket
import time
import threading
SERVER_IP = 'THE SERVER'
SERVER_PORT = SERVER_PORT
SOURCE_IP = socket.gethostname()
SOURCE_PORT = 57004
KEEP_ALIVE_INTERVAL = 5
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def keep_alive(interval):
data = 'hello'
while True:
client.send(data)
time.sleep(interval)
client.connect((SERVER_IP, SERVER_PORT))
t = threading.Thread(target=keep_alive, args = (KEEP_ALIVE_INTERVAL,))
t.start()
while True:
data = client.recv(1024)
if not data:
break
print data
client.close()
Run Code Online (Sandbox Code Playgroud) 我已经阅读了以下资源,有较高的了解,但无法将通过TCP / IP的数据流映射到现实世界中通过Internet的数据流?
假设我输入www.google.com,然后按Enter,请求和响应将如何流经TCP / IP层
我的不足:
应用层:-浏览器会将请求编码为正确的格式,以使其在网络上兼容。同样,它将解码响应返回给浏览器,因此浏览器是此处的主要参与者。
传输层:-操作系统(OS)将附加本地端口/套接字,以便它可以将响应映射回去。它还将使用一些标头丰富数据,并根据基础协议(例如TCP或UDP)对其进行处理。同样,操作系统会将响应映射回正确的端口。可能还会进行DNS解析,并将IP附加到请求中。它还将与服务器建立连接,以便可以将更多数据发送到服务器。
诸如TCP(与UDP的对比)之类的协议还可以确保以正确的顺序发送数据包,并期望接收方发出确认。如果ack失败,请重试。如此可靠。因此,OS是这里的主要参与者。
网络层: -ISP将进一步将数据转发到Internet骨干(IB)。IB可能会决定最短路径是什么,以及其他一些东西。同样的反应。因此,ISP和IB是这里的两个主要参与者。
数据链路层:-该层将请求映射到正确的计算机,即MAC地址。因此,我认为它将驻留在Internet服务提供商的某个位置。其实我不确定这层角色,谁是主要演员?
物理层:-该层处理诸如电磁波之类的物理数据。像光纤//电缆在这里可以是主要角色。尽管这被描述为TCP / IP分层的最后一层,但我认为它的作用始于传输层。
我的理解正确吗?如果不能,那么有人可以纠正它吗?