我一直用:
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
这意味着我将接受来自任何接口的连接。如果我用“192.168.0.1”替换INADDR_ANY。这是否意味着我只接受来自IP地址192.168.0.1的连接,或者它是否意味着我将接受来自192.168.0.1接口的连接?
我现在有一种情况,我有多个客户端(每个客户端都有一个唯一的IP地址,但端口号相同),尝试连接到一台服务器。我可以拥有多个侦听功能(单独的线程)来侦听唯一的IP地址和端口吗?或者我必须接受任何连接并在连接后获取网络信息?
编辑提供更多说明。
如果我说serv_addr.sin_addr.s_addr = inet_addr(“192.168.0.1”)并且IP地址为192.168.0.2的客户端尝试连接,那么listen命令会拒绝这个吗?
答案 0 :(得分:7)
绑定地址是要侦听的本地地址;您可以指定本地接口的地址。
如果您想控制谁可以连接,您可以检查select / accept循环中的对等地址,或使用iptables限制入站连接。
<强>更新强>
如果我说serv_addr.sin_addr.s_addr = inet_addr(&#34; 192.168.0.1&#34;)和a IP地址为192.168.0.2的客户端尝试连接,将侦听 命令拒绝这个?我想能够拥有多个线程,每个 为唯一的IP地址提供服务。
不,地址是本地计算机上的地址。鉴于您正在进行多线程设计,我建议您在一个线程中运行listen / accept代码,检查客户端地址,确定哪个工作线程是合适的,然后生成它。 / p>
冒着显示我的年龄的风险,我仍然更喜欢使用listen / accept / select作为大多数套接字代码 - 它是个人品味的东西,是的,在阻塞/非阻塞方面确实会影响设计IO,缓冲等
答案 1 :(得分:0)
如果我用“192.168.0.1”替换INADDR_ANY。这是否意味着我会 只接受来自IP地址192.168.0.1的连接,或者这样做 意味着我将接受来自192.168.0.1接口的连接 居住在哪?
是
我现在有一种情况,我有多个客户端(每个客户端都有一个 尝试连接到一个唯一的IP地址但相同的端口号 服务器。我可以有多个侦听功能(单独的线程) 听独特的IP地址和端口?或者我必须接受任何 我连接后连接并获取网络信息?
是。您可以为要处理的每个连接“分叉”(即创建一个新线程),但是您必须自己进行过滤。没有办法(我在API中知道)将该工作卸载到堆栈中。