是否可以使用TCP / IP套接字绑定和侦听一个IP地址? (Linux的/ C)

时间:2011-10-18 17:25:50

标签: c++ c linux sockets tcp

我一直用:

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命令会拒绝这个吗?

2 个答案:

答案 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中知道)将该工作卸载到堆栈中。