我必须检测服务器是否打开或关闭,有些人告诉我尝试使用 ping 方式,如果它不起作用我应该在我和服务器之间使用 TCP 连接。有人可以解释一下它们之间有什么区别吗?为什么 ping 方式可能效果不好?谢谢。
我有一个设置为listen()的套接字
通常我会基于通过 select() 准备好的文件描述符来接受这些连接。我可以将其更改为具有相同文件描述符的recv() 而不是accept() 吗?
我正在使用 WinPcap 学习网络编程。这是片段:
int ip_hlen = (ih->ver_ihl & 0xf) * 4; /* get ip header length */
tcp_header *th = (tcp_header *) ((u_char*)ih + ip_len);
int tcp_hlen = (ntohs(th->th_len_resv_code) & 0xf000) >> 12)*4; /* get tcp header length */
Run Code Online (Sandbox Code Playgroud)
问题是为什么ntohs只有在获取 tcp_hlennot时才使用ip_hlen。
事实上,ntohs只接受u_short作为参数解释一点。http://msdn.microsoft.com/en-us/library/windows/desktop/ms740075%28v=vs.85%29.aspx
我仍然对何时使用 ntohs 何时不使用感到困惑。
以下是 IP 和 TCP 数据包定义的结构:
/* ipv4 header */
typedef struct ip_header {
u_char ver_ihl; /* version and ip header length */
u_char tos; /* …Run Code Online (Sandbox Code Playgroud) 在帮助我使用 UDP 协议向某人正确发送数据的第一个主题之后,我在接收这些数据时遇到了问题。这个问题很奇怪,只有在我第一次启动发送数据的功能时才会出现。第一次,服务器只接收第一帧。但之后,如果我重新使用该功能,一切都会好的。
这是通过UDP协议发送数据的代码(我的数据是一个结构体):
void MyUDP::sendUDP()
{
//Structure to send
typedef struct MyStructTag
{
int test1;
bool test2;
char test3;
} MyStruct;
MyStruct envoie;
envoie.test1 = 1;
envoie.test2 = true;
envoie.test3 = 97;
// Sends the datagram datagram
// to the host address and at port.
// qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
// const QHostAddress & host, quint16 port)
QByteArray buf;
QDataStream s(&buf, QIODevice::WriteOnly);
// The encoding is big endian by default, on all systems. You
// can change it …Run Code Online (Sandbox Code Playgroud) 我有一个线程来接受传入连接:
pthread_t thread;
pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);
Run Code Online (Sandbox Code Playgroud)
然后worker_func:
<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试GlobalFD在原始线程中关闭,accept 仍会阻塞(如果 GlobalFD 关闭,我希望它失败)。我在网上查看了其他问题,但似乎找不到我的特定问题的答案。
有任何想法吗?谢谢
我正在 Golang 中开发一个网络应用程序。我有一个 IP 地址片段。每次收到请求时,我都会用来net.LookupIP(host)查找返回net.IP. 比较这些的最佳方法是什么?
顺便说一句,在 Python 中我们有一个set数据结构,这使得上面的问题很容易解决,但是 Go 呢?
我使用dnspython查询 DNS 服务器以将域名解析为其 IP。
当我尝试解析“google.co.uk”时,我只得到一个 IP。然而,使用另一个解析器工具我得到另一个IP。两个IP都是正确的,我通过将IP放在浏览器中来测试它们,都打开“google.co.uk”。
显然,为我正在测试的域名分配了多个IP。有什么方法可以在 dnspython 中使用来检索给定域名的所有 IP 吗?
这是我的简单脚本:
import dns.resolver
def resolve(domain):
resolveList = []
resolver = dns.resolver.Resolver(); #create a new instance named Resolver
answer = resolver.query(domain,"A");
y=0
for rData in answer:
resolveList.append(rData)
++y
return resolveList
domainName = "google.co.uk"
queryResult = resolve(domainName);
for result in queryResult:
print queryResult[0]
Run Code Online (Sandbox Code Playgroud) 我正在使用 USB Internet 加密狗为我的计算机分配 IPv6 地址。当我使用 时ipconfig,我可以看到分配的 IPv6 地址,它是公共 IP。
当我使用 时GetAdaptersAddresses(),我得到了一个长链表,其中包含任播、多播和单播地址,但它们都不与系统的 IP 地址匹配。
还有其他地方可以获取系统的IP吗?我实际上想获取系统的 IP 地址,以便将其绑定到套接字。
我使用Windows 7。
// getadaptersinfo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<WinSock2.h>
#include<iphlpapi.h>
#include<ws2tcpip.h>
#include<iostream>
#pragma comment(lib,"IPHLPAPI.lib")
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main()
{
cout << "\nusing getadapteraddress";
PIP_ADAPTER_ADDRESSES p, tp;
ULONG u;
DWORD ret;
p = (IP_ADAPTER_ADDRESSES*)HeapAlloc(GetProcessHeap(), 0, sizeof(IP_ADAPTER_ADDRESSES));
u = sizeof(p);
GetAdaptersAddresses(0, GAA_FLAG_INCLUDE_PREFIX, NULL, p, &u);
p = (IP_ADAPTER_ADDRESSES*)HeapAlloc(GetProcessHeap(), 0, u); …Run Code Online (Sandbox Code Playgroud) 我正在使用 POSIX 套接字 API 用 C++ 编写服务器。
它作为 GUI 应用程序的一部分运行,该应用程序需要能够停止和启动服务器侦听数据并向客户端发送数据。
服务器的主要部分基本上看起来像这样(我排除了很多代码,因为其中一些代码与这个问题无关。)
if (listen(listener_fd, backlog) < 0) {
std::perror("listen");
exit(EXIT_FAILURE);
}
while (true) {
/* This part sets up the FD set */
FD_ZERO(&read_fds);
FD_SET(0, &read_fds); // stdin (for server commands)
FD_SET(listener_fd, &read_fds);
FD_SET(read_pipe, &read_fds);
for (auto it = client_socks.begin(); it != client_socks.end(); it++) {
FD_SET(*it, &read_fds); // listen on each of the open client-server sockets
}
max_fd = 0;
if (client_socks.size() > 0) {
max_fd = *std::max_element(client_socks.begin(), client_socks.end());
}
if …Run Code Online (Sandbox Code Playgroud) 我有一个 Android VPN 应用程序。当我触发启动 VPN 的意图(通过VPNService.prepare)时,如果设备上已配置始终在线的 VPN,它会立即失败。这看起来很合理,但我希望能够轻松检测到这种情况,这样我就可以向用户显示有用的消息。
我所说的“始终在线”是指特定的 VPN 始终在线 Android VPN 标志: https: //developer.android.com/guide/topics/connectivity/vpn#always-on
我似乎无法找到一种方法来访问该信息,即使它在 Android 内部使用(例如,这里,但getAlwaysOnVpnPackage似乎没有公开 AFAICT)。
我见过的最好的选择是检查 Android 中的 VPN 连接是否处于活动状态?,它会告诉您当前是否有任何 VPN 连接处于活动状态,但这还不够,因为:
有什么方法可以检查设备当前是否将 VPN 配置为“始终开启”?