c++ 谁可以发送到绑定到INADDR_LOOPBACK的套接字?

tvz2xvvm  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(146)

我对套接字编程有点陌生,对将套接字绑定到地址INADDR_LOOPBACK127.0.0.1的概念感到困惑。
如果我正在编写服务器代码来侦听特定端口上的消息,并且我将一个套接字绑定到一个地址,如下面的代码示例所示...

int sd = socket( PF_INET, SOCK_DGRAM, 0 );
sockaddr_in si;
si.sin_family = AF_INET;
si.sin_addr.s_addr = inet_addr( "127.0.0.1" );
si.sin_port = htons( 9090 );
bind( sd, (sockaddr*)&si, sizeof si )

......我的问题是:谁能发送到这个套接字?
我知道与服务器进程运行在同一台PC上的其他进程可以通过使用dest_addr参数指定127.0.0.1执行sendto()来访问上述套接字。
但是,如果客户端知道服务器的“实际”地址,同一网络中其他PC上的客户端是否也可以发送到该套接字?如果我在Linux PC上运行ifconfig,我会看到一个inet地址,例如10.138.19.27。这是否意味着如果客户端指定了10.138.19.27地址,则与服务器位于不同PC但位于同一网络上的客户端进程可以向服务器的套接字(绑定到127.0.0.1)发送消息?

tf7tbtn2

tf7tbtn21#

只有到环回适配器(127.0.0.1)的连接,并且这些连接只能源自与侦听器相同的机器,因为其他接口有意避免舍入到该机器。
如果不绑定或绑定到INADDR_ANY(0.0.0.0),则接受来自所有接口的连接。

Window 1                                    Window 2
------------------------------------------  ------------------------------------------
                                            $ nc -l 5678
$ echo test-ip | nc 69.163.162.155 5678     test-ip

$ echo $?
0
                                            $ nc -l 5678
$ echo test-localhost | nc localhost 5678   test-localhost

$ echo $?
0

当您绑定到IP地址时,您只接受定向到该IP地址的连接。

Window 1                                    Window 2
------------------------------------------  ------------------------------------------
                                            $ nc -l 69.163.162.155 5678
$ echo test-localhost | nc localhost 5678

$ echo $?
1

$ echo test-ip | nc 69.163.162.155 5678     test-ip

$ echo $?
0

127.x.x.x中的地址也是如此。

Window 1                                    Window 2
------------------------------------------  ------------------------------------------
                                            $ nc -l localhost 5678
$ echo test-ip | nc 69.163.162.155 5678

$ echo $?
1

$ echo test-localhost | nc localhost 5678   test-localhost

$ echo $?
0

127.x.x.x的特殊之处在于只有您自己的计算机可以访问127.x.x.x地址。

相关问题