我最近遇到了一篇博客文章,该文章描述了使用libev的TCP服务器客户端。服务器用来INADDR_ANY
绑定到我熟悉的接口。但是,我也很惊讶地INADDR_ANY
在客户端代码中看到。客户端代码上的相关代码如下:
// Create client socket
if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket error");
return -1;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NO);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// Connect to server socket
if(connect(sd, (struct sockaddr *)&addr, sizeof addr) < 0)
{
perror("Connect error");
return -1;
}
具体来说,我对这一行很感兴趣:
addr.sin_addr.s_addr = htonl(INADDR_ANY);
在服务器端,我知道这INADDR_ANY
会将端口绑定到所有可用接口,但是我不确定在客户端这有何意义。最后,客户端将需要在特定接口上进行连接。以前,我总是指定IP地址或使用INADDR_LOOPBACK
。
Linux IP手册页没有讨论INADDR_ANY
在客户端使用。我确实在这里找到了另一个Stack
Overflow帖子,
其中说OP应该INADDR_ANY
在客户端使用,但是没有给出任何理由或解释。
那么这到底在做什么呢?是否尝试所有html" target="_blank">接口,直到找到一个可用于连接的端口?这是以什么顺序发生的?
感谢您的回答!
这是nos在评论中提供的答案。如果nos回来并将其发布为答案,我将nos标记为答案并删除该帖子。
INADDR_ANY通常定义为0。即IP地址0.0.0.0。RFC 1122表示这意味着“此网络上的主机”。linux
IP堆栈似乎只是将其路由到回送接口。(例如,尝试ping 0.0.0.0甚至只是ping
0)。我想说作者打错了字,应该使用INADDR_LOOPBACK。
问题内容: 我正在构建一个小型聊天应用程序,其中客户端A希望通过服务器B将某些东西发送到客户端C。首先,这是解决问题的正确方法吗?我能够向服务器发送数据或从服务器接收数据,但仅限于客户端。例如,如果客户端A向服务器B发送数据而客户端C向服务器B发送数据,则我可以将数据发送回服务器A和C就像回显服务器一样。但是我想要的是将来自客户端A的数据通过服务器B转发到客户端C。 以下是服务器代码: 客户端代码
我对套接字协议非常陌生,我肯定问题来自于我对此几乎一无所知。但是基本上我在服务器端口5000上有一个套接字,我需要一个angularjs代码来监听这个套接字。服务器上的套接字可以读取我从另一台计算机(客户端)发送的任何内容。但是由于某种原因,angular代码不能监听/连接到插座。以下是我现在所拥有的: index.html 下面是angularjs代码: 在Firefox中: Firefox无法
问题内容: 我有一个客户端-服务器分层的体系结构,客户端向服务器发出类似RPC的请求。我正在使用Tomcat托管servlet,并使用Apache HttpClient对其进行请求。 我的代码是这样的: 它在负载较轻的环境中效果很好,但是当我每秒发出数百个请求时,我开始看到这种情况- 有关如何解决此问题的任何想法?我猜想这与客户端尝试重用临时客户端端口有关,但是为什么会这样/我该如何解决?谢谢!
问题内容: 我已经阅读了很多有关该主题的内容,telnet是一种协议,而不是简单的套接字连接,正在等待换行符,使用外部库等等。 最重要的是,我需要启动并运行一个快速且肮脏的Java telnet应用程序,它不一定可扩展且不一定漂亮,因此我试图避免使用库,系统函数调用等。我一直在尝试和测试,到目前为止,当尝试登录路由器(当然是通过telnet)时,我什么都没有。 这是到目前为止我一直在使用的代码的一
我希望能够连接到需要智能卡的个人证书进行身份验证的https站点。我想我已经很接近让它工作了,但不知道如何克服这个例外: 由于合同关系,我不能共享我的代码,但这里有一个总结: 我创建了一个密钥库,其中包含从浏览器导出的所有证书。我使用此密钥存储作为SSLContext的信任存储。我非常肯定这个密钥库包含正确的CA证书来验证远程站点的证书,因为它修复了“无法找到请求目标的有效证书路径”的异常。 我可
我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput