在 Linux 中,我可以调用 getaddrinfo() 到本地套接字 getaddrinfo(NULL,port,&hints,&servinfo) 来创建这样的列表:
IPv4: 0.0.0.0
| socktype: 1 |protocol: 6 IPv4: 0.0.0.0
| socktype: 2 |protocol: 17 IPv4: 0.0.0.0
| socktype: 3 |protocol: 0 IPv6: ::
| socktype: 1 |protocol: 6 IPv6: ::
| socktype: 2 |protocol: 17 IPv6: ::
| socktype: 3 |protocol: 0
而在 Windows 中,任何与本地机器相关的调用 "NULL"、"localhost"、"127.0.0.1"(实际上, 任何不是 URL 的东西)似乎都失败了。
在 linux 和 windows 之间使用 getaddrinfo() 的预期区别是什么?
此外 - 我知道这种问题会使问题变得复杂 - 但第一个程序的输出究竟告诉我什么?这些是内核可以为该端口提供的唯一组合吗?
是的,这道题是从相当有名的《Beej's Guide to network programming》演化而来的。
导致这个的代码是这样的:
struct addrinfo hints,*ai,*p;
memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
int error;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
hints.ai_socktype = SOCK_STREAM;
if ((error = getaddrinfo("www.example.com", "http", &hints, &ai)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
exit(1);
} else cout <<"Success with a URL\n";
if (error=(getaddrinfo("208.117.45.202",&port,&hints,&ai))){
cout<<"Cannot resolve any usable ports! : "<<gai_strerror(error)<< " : "<<error;
if (ai == NULL) return -5;
}
谢谢!
最佳答案
这些神奇的东西叫做man pages .例如,man 3 getaddrinfo明确地说
If the AI_PASSIVE flag is specified in hints.ai_flags, and node is NULL, then the returned socket addresses will be suitable for
bind()ing a socket that willaccept()connections. The returned socket address will contain the "wildcard address" (INADDR_ANY for IPv4 addresses, IN6ADDR_ANY_INIT for IPv6 address). The wildcard address is used by applications (typically servers) that intend to accept connections on any of the hosts's network addresses. If node is not NULL, then the AI_PASSIVE flag is ignored.
getaddrinfo() 函数的目的很简单:它尽力将用户指定的字符串转换为应用程序可用于创建套接字的数字数据,无论是监听传入连接,或一个用于连接。
getaddrinfo() 在 POSIX.1-2001 中指定(和 RFC 2553 ),并且微软以从不遵循它可以扩展或变态的标准而闻名,所以当然它在 Windows 中是一个完全不同的功能。相关MSDN page说它“提供从 ANSI 主机名到地址的与协议(protocol)无关的转换。”
你的程序的输出,因为node(第一个参数)是NULL,而你在flags中有AI_PASSIVE,是您的程序可以(尝试)绑定(bind)的通配符地址列表,以监听到您指定的端口的传入连接。
关于c - getaddrinfo() - Linux 与 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17420427/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我编写了一个脚本,它将遍历我们数据库中的所有客户,验证他们的网站URL是否有效,并尝试在他们的主页上找到一个Twitter链接。我们有超过10,000个URL需要验证。在url验证一小部分后,我们开始收到每个URL的getaddrinfo错误。这是抓取单个URL的代码副本:defscrape_url(url)url_found=falsetwitter_name=nilbeginagent=Mechanize.newdo|a|a.follow_meta_refresh=trueendagent.get(normalize_url(url))do|page|url_found=truet
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解
Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好
文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分
如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack
我在LinuxMint17.2上。我最近使用apt-getpurgeruby删除了ruby。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,