- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
The constant INADDR_ANY is the so-called IPv4 wildcard address. The wildcard IP address is useful for applications that bind Internet domain sockets on multihomed hosts. If an application on a multihomed host binds a socket to just one of its host’s IP addresses, then that socket can receive only UDP datagrams or TCP connection requests sent to that IP address. However, we normally want an application on a multihomed host to be able to receive datagrams or connection requests that specify any of the host’s IP addresses, and binding the socket to the wildcard IP address makes this possible.
struct sockaddr_in server_address;
int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_address, 0, sizeof(struct sockaddr_in));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY); // here is my quesion
server_address.sin_port = htons(9734);
bind(server_sockfd, (struct sockaddr*)&server_address, sizeof(server_address));
问题>
如果我们将套接字绑定(bind)到特定的 IP 地址,则套接字只能接收发送到该 IP 地址的 UPD/TCP 请求。
如我在上面的代码中所示,现在套接字 server_sockfd 已与 INADDR_ANY 绑定(bind)。如果套接字可以接收互联网上的任何请求,我只是在这里 b/c 感到困惑,它如何仍然可以正常工作。互联网上有大量的 UDP/TCP 请求,如果套接字响应每个人,,怎么还能用呢?
//更新客户端代码//
int
main(int argc, char *argv[])
{
struct sockaddr_in6 svaddr;
int sfd, j;
size_t msgLen;
ssize_t numBytes;
char resp[BUF_SIZE];
if (argc < 3 || strcmp(argv[1], "--help") == 0)
usageErr("%s host-address msg...\n", argv[0]);
/* Create a datagram socket; send to an address in the IPv6 somain */
sfd = socket(AF_INET6, SOCK_DGRAM, 0); /* Create client socket */
if (sfd == -1)
errExit("socket");
memset(&svaddr, 0, sizeof(struct sockaddr_in6));
svaddr.sin6_family = AF_INET6;
svaddr.sin6_port = htons(PORT_NUM);
if (inet_pton(AF_INET6, argv[1], &svaddr.sin6_addr) <= 0)
fatal("inet_pton failed for address '%s'", argv[1]);
/* Send messages to server; echo responses on stdout */
for (j = 2; j < argc; j++) {
msgLen = strlen(argv[j]);
if (sendto(sfd, argv[j], msgLen, 0, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_in6)) != msgLen)
fatal("sendto");
numBytes = recvfrom(sfd, resp, BUF_SIZE, 0, NULL, NULL);
if (numBytes == -1)
errExit("recvfrom");
printf("Response %d: %.*s\n", j - 1, (int) numBytes, resp);
}
exit(EXIT_SUCCESS);
}
//为服务器端代码更新
int
main(int argc, char *argv[])
{
struct sockaddr_in6 svaddr, claddr;
int sfd, j;
ssize_t numBytes;
socklen_t len;
char buf[BUF_SIZE];
char claddrStr[INET6_ADDRSTRLEN];
/* Create a datagram socket bound to an address in the IPv6 somain */
sfd = socket(AF_INET6, SOCK_DGRAM, 0);
if (sfd == -1)
errExit("socket");
memset(&svaddr, 0, sizeof(struct sockaddr_in6));
svaddr.sin6_family = AF_INET6;
svaddr.sin6_addr = in6addr_any; /* Wildcard address */
svaddr.sin6_port = htons(PORT_NUM);
if (bind(sfd, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_in6)) == -1)
errExit("bind");
/* Receive messages, convert to uppercase, and return to client */
for (;;) {
len = sizeof(struct sockaddr_in6);
numBytes = recvfrom(sfd, buf, BUF_SIZE, 0,
(struct sockaddr *) &claddr, &len);
if (numBytes == -1)
errExit("recvfrom");
/* Display address of client that sent the message */
if (inet_ntop(AF_INET6, &claddr.sin6_addr, claddrStr,
INET6_ADDRSTRLEN) == NULL)
printf("Couldn't convert client address to string\n");
else
printf("Server received %ld bytes from (%s, %u)\n",
(long) numBytes, claddrStr, ntohs(claddr.sin6_port));
for (j = 0; j < numBytes; j++)
buf[j] = toupper((unsigned char) buf[j]);
if (sendto(sfd, buf, numBytes, 0, (struct sockaddr *) &claddr, len) !=
numBytes)
fatal("sendto");
}
}
//更新了如何运行此服务器/客户端程序。
$ ./server_program &
[1] 31047
$ ./client_program ::1 ciao // Send to server on local host
Server received 4 bytes from (::1, 32770)
Response 1: CIAO
最佳答案
它不会获取对互联网上每个 IP 地址的请求(a),它会获取对其服务的每个 IP 地址的请求。例如,它可能有多个 NIC,每个 NIC 都有一个单独的 IP 地址,或者它可能有一个 NIC 能够管理多个 IP 地址(它甚至可能有多个 NIC,每个 NIC 都能够处理多个 IP 地址。
要查看的关键片段是:
... we normally want an application on a multi-homed host to be able to receive datagrams or connection requests that specify any of the host’s IP addresses (my italics).
换句话说,您可能有一个多宿主设置,其中您的机器服务于 10.0.0.15
和 10.0.0.16
。使用 INADDR_ANY
将允许您获取这两个地址的流量,而不获取 10.0.0.17
的请求,它可能是长凳的另一端(或地球的另一边)。
下表,顶行是请求目的地,左列是您正在收听的地址,显示您是否会收到请求 (Y
) 或 (N
):
Request to> 10.0.0.15 10.0.0.16 10.0.0.17
Bind to: *-------------------------------
10.0.0.15 | Y N N
10.0.0.16 | N Y N
INADDR_ANY | Y Y N
(a) 它甚至看不到网络上的绝大多数请求。绝大多数甚至没有到达离您最近的路由器(甚至可能是您的 ISP)。即使那些确实到达了离您最近的路由器,您的特定机器也可能看不到它们是否发往本地网段上的另一台机器(尽管是混杂模式)。
关于linux - 关于 INADDR_ANY 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6894092/
我正在尝试对一些套接字进行编程,因此在服务器端,我使用 htonl(INADDR_ANY)。就我的理解而言,在我看来,这个函数生成了一个随机 IP(我说得对吗?)。事实上,我想将我的套接字与我的 lo
找了几个小时,还是一头雾水。根据我的发现,INADDR_ANY 旨在指定套接字将接受与分配给服务器的任何地址的连接。然而,以下导致客户端只能从同一台机器连接到 localhost:7777。 addr
我最近遇到了 this blog post它描述了一个使用 libev 的 TCP 服务器客户端。服务器使用 INADDR_ANY 绑定(bind)到我熟悉的接口(interface)。但是,我很惊讶
The constant INADDR_ANY is the so-called IPv4 wildcard address. The wildcard IP address is useful fo
如果我将套接字绑定(bind)到 INADDR_ANY,我知道它将接受服务器上配置的任何 IP 上的传入连接。假设我在进行 bind() 调用时配置了 1 个 IP,然后配置了一个新 IP。 bind
在一个场景中,我通过 INADDR_ANY 监听 TCP 端口。 ,并获得客户端连接,现在想要接受来自该连接的 UDP 数据包,我如何确定路由到该客户端的接口(interface)的实际 IP 地址以
这个问题在这里已经有了答案: Sockets - Using INADDR_ANY on client side (4 个答案) 关闭 5 年前。 在socket编程中是做什么的 servaddr.
我正在使用 Pelican建立一个博客。启动开发服务器后,我收到警告: Do you want the application “Python.app” to accept incoming netw
当我使用 INADDR_ANY 指定要绑定(bind)到套接字的 IP 地址时,套接字稍后会监听端口,如下所示: sockaddr_in sockAddr; sockAddr.sin_family =
我正在 Linux 中进行套接字编程。有一个问题。我们怎么可能允许特定的 IP 地址连接到我们的服务器。 例如: 允许 10.0.0.1 拒绝 10.0.0.1 我特别谈论的是我们将 INADDR_A
我遇到了两个线程: Socket with recv-timeout: What is wrong with this code? Reading / Writing to a socket usin
我遇到了两个线程: Socket with recv-timeout: What is wrong with this code? Reading / Writing to a socket usin
我有一个用 C 编写的网络服务器应用程序,监听器使用 INADDR_ANY 绑定(bind),因此它可以接受通过安装它的主机的任何 IP 地址的连接。 我需要确定客户端在建立连接时使用了哪个服务器的
Python 中的一个简单实验(在 Windows 上)表明我能够同时绑定(bind)到通配符地址和特定地址上的同一端口: import socket import select MY_PORT =
我的代码当前正在使用 INADDR_ANY,我正在测试是否能够通过 Ubuntu 路由器[使用 IPTables] 将数据包从 VM 客户端发送到我的主机。 我能够从 Linux 路由器后面的客户端和
我写了一个加入源特定多播组并接收 udp 多播数据包的程序: #include #include #include #include #include #include #include
我在 Windows 7 上,在 connect 与 SO_REUSEADDR 之前使用 bind,并将本地地址结构设置为 IP 地址 INADDR _ANY 和端口 0(零),以便让操作系统选择客户
我对绑定(bind)套接字时 INADDR_ANY 的使用和后果感到困惑。当然 INADDR_ANY 会监听所有本地接口(interface)。我的问题是这会产生什么后果。 我记得读过,绑定(bind
我的 Winsock Delphi 应用程序应该在所有网络接口(interface)上监听多播 UDP/IP 流。它可以正常收听,直到我在另一台具有不同网络适配器优先级顺序的 PC 上尝试它。 然后我
我正在尝试编写多播服务器。我有两个问题: 如何在以太网/WiFi 接口(interface)等多个接口(interface)上发送多播公告。我需要为每个接口(interface)创建多个套接字并绑定(
我是一名优秀的程序员,十分优秀!