只接受来自特定子网的连接
Accept connections only from specific subnet
使用winsock,我希望我的服务器应用程序只接受来自某个(假设是192.168.0.0/24
)子网的连接。
我在考虑两个选择:
-
每次
accept
连接时检查客户端地址while (true) { SOCKET clientSocket = accept(serverSocket, (SOCKADDR *)&clientAddress, &addressLenght); if (clientSocket == INVALID_SOCKET || clientAddress.sin_addr.S_un.S_un_b.s_b1 != 192 || clientAddress.sin_addr.S_un.S_un_b.s_b2 != 168 || clientAddress.sin_addr.S_un.S_un_b.s_b3 != 0) { closesocket(clientSocket); continue; } ... }
-
找出相应网络的本地地址,作为
bind
中的name
参数SOCKADDR_IN serverAddress; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(13666); serverAddress.sin_addr.S_un.S_addr = inet_addr("192.168.0.1"); result = bind(serverSocket, (SOCKADDR *)&serverAddress, sizeof(serverAddress));
我还有其他选择吗?
注:有人告诉我有一个更好的解决办法。但是我不明白。
如果您只想要服务器所在的同一子网的连接(如果是这种情况,则从您的问题中不清楚),您可以使用setsockopt()
将TTL设置为1。该套接字的数据包(包括连接握手)不应该穿过路由器。
如果您只想监听一个子网上的客户端,正确的解决方案是bind()
单个监听套接字到与该子网对应的适配器的本地IP。让操作系统为你做过滤。
如果你需要监听多个子网的客户端,你可以根据需要bind()
一个单独的监听套接字到每个子网的本地IP,或者你可以bind()
一个单一的套接字到INADDR_ANY
(0.0.0.0),然后手动过滤客户端。
如果你手动过滤,你应该使用WSAAccept()
而不是accept()
,这样你就可以利用它的CONDITIONPROC
回调。不同之处在于,当使用accept()
时,客户端被操作系统无条件地接受到队列中,并在代码访问它们之前由accept()
完全连接。当使用WSAAccept()
时,您可以更早地访问客户端远程ip,并且可以在将单个客户端放入要连接的队列之前选择是否接受或拒绝它们。
相关文章:
- 从网链套接字请求连接设备的列表
- 如何使自定义小部件中的子小部件的信号可连接?
- 以编程方式连接子图
- 如何从 getifaddr 读取子网掩码
- 子类化模板类并连接到信号
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- 如何在非网关接口 Linux 上检测互联网连接
- 在 opencv 中从 Mat 图像创建多个子图像?尝试为每个连接的组件创建子图像
- 连接到子进程stdout的管道中的消息不完整
- 查找子网中的所有IP
- 子图和图连接在提升
- 正在计算组成给定IP范围的子网列表
- 在子类中覆盖基类信号时连接到基类的信号
- Icmp子网地址请求
- 获取"子"向量和"连接"向量
- 与子网列表匹配
- 正在验证IPv6子网掩码前缀
- 使用boost::asio查找子网中所有可访问的ip
- 如何知道从子网掩码中搜索哪些IP地址
- 查找和跨子网通信