請問一下先進:
我在練習 PHP tcp client program 與同一台機上的tcp server 互動.但是遇到一個現象,就是 PHP client program 與 server都只能是特定ip才連的上,但這ip不是實體網卡所設的 IP,我覺得很奇怪, 所以想請問大家是怎麼回事?
首先本機是 window 10. 安裝有一張網卡,本機上有數個 IP address 包括網卡本身的 IP address (192.168.1.217), locolhost (127.0.0.1), 及vmware 產生的 (192.168.150.1). 詳細資訊請參考下面 ipconfig/all .
PHP client program 是run 在MAMP上,使用 apache server, port 9000.由網頁javascript帶起來執行
tcp server program 是使用 TCP/UDP Net assistant這個軟體, 平常這軟體可以正常使用,所以應該是沒有問題.
當 tcp server open時, 若選擇 local host addr 192.168.150.1, port 5010 (我任意設的) 則 PHP程式 可以連得上 tcp server.資料收及送都沒問題.
若 tcp server 選擇 192.168.1.217或是 127.0.0.1, PHP client program 就連不上
顯示錯誤訊息如下:
socketconnect() failed: 192.168.1.217 5010
Reason: () 無法連線,因為目標電腦拒絕連線。
我是使用window 10 本身的防火牆,不論開啟或是關掉,結果都是相同的.所以並非防火牆造成的 (在防火牆我有設允許上述的server 存取網路,且若使用ip 192.168.150.1就沒問題)
請問是否有人能告訴我怎麼回事,如何做可以使server 與 client 使用 192.168.1.217或127.0.0.1正常通訊?
其中 PHP client 程式如下:
<?php
$cmd_query = "test";
error_reporting(E_ALL);
//$service_address = "127.0.0.1"; // not work
$service_address = "192.168.1.217"; // not work
//$service_address = "192.168.150.1"; // work
$service_port = 5010;
echo "'tcp connection: ' $service_address $service_port \n";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: "
. socket_strerror(socket_last_error()) . "\n";
} else {
echo "socket create OK.\n";
}
echo "Attempting to connect to ' $service_address ' on port '
$service_port '...' ";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() failed: $service_address $service_port\nReason: ($result) "
. socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}
$sec = 0;
$usec = 10000;
$snd_timeo = array('sec' => $sec, 'usec' => $usec);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $snd_timeo);
echo "Sending command request...";
socket_write($socket, $cmd_query, strlen($cmd_query));
//echo "send cmd OK.\n";
echo "Reading response:\n\n";
$result = "";
$sec = 5;
$usec = 0;
$rcv_timeo = array('sec' => $sec, 'usec' => $usec);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $rcv_timeo);
while ($out = socket_read($socket, 2000)) {
$result = $result . $out;
}
echo "Closing socket...";
socket_close($socket);
echo "$result";
ipconfig/all 的資料如下:
***C:\Users\C>ipconfig/all
Windows IP Configuration
Host Name . . . . . . . . . . . . : PC-4F
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
Ethernet adapter 乙太網路:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Intel(R) Ethernet Connection I217-V
Physical Address. . . . . . . . . : FC-AA-14-96-42-8D
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::5df4:9199:7fa5:12d8%14(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.1.217(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Lease Obtained. . . . . . . . . . : 2020年12月29日 下午 10:37:16
Lease Expires . . . . . . . . . . : 2020年12月31日 下午 01:32:57
Default Gateway . . . . . . . . . : 192.168.1.1
DHCP Server . . . . . . . . . . . : 192.168.1.1
DHCPv6 IAID . . . . . . . . . . . : 100444692
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-26-7A-21-EF-FC-AA-14-96-42-8D
DNS Servers . . . . . . . . . . . : 168.95.1.1
8.8.8.8
8.8.4.4
NetBIOS over Tcpip. . . . . . . . : Enabled
Ethernet adapter VMware Network Adapter VMnet1:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
Physical Address. . . . . . . . . : 00-50-56-C0-00-01
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::c0c7:63a2:df04:8031%15(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.1.1(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 402673750
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-26-7A-21-EF-FC-AA-14-96-42-8D
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
NetBIOS over Tcpip. . . . . . . . : Enabled
Ethernet adapter VMware Network Adapter VMnet8:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
Physical Address. . . . . . . . . : 00-50-56-C0-00-08
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::11b6:6ac5:8f79:c4ef%4(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.150.1(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Lease Obtained. . . . . . . . . . : 2020年12月30日 下午 05:32:56
Lease Expires . . . . . . . . . . : 2020年12月30日 下午 09:32:55
Default Gateway . . . . . . . . . :
DHCP Server . . . . . . . . . . . : 192.168.150.254
DHCPv6 IAID . . . . . . . . . . . : 419450966
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-26-7A-21-EF-FC-AA-14-96-42-8D
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
Primary WINS Server . . . . . . . : 192.168.150.2
NetBIOS over Tcpip. . . . . . . . : Enabled
C:\Users\C>
本機PHP tcp client 想連上本機的 tcp server
關鍵在於本機
這兩個字
你的本機是肉眼看到的本機
而在 TCP/IP 的世界裡,本機的定義只看「IP」,不看「實體/機器」
以下是本機
Server:192.168.1.217 Client:192.168.1.217
Server:192.168.150.1 Client:192.168.150.1
以下不是本機
Server:192.168.150.1 Client:192.168.1.217
Server:192.168.1.217 Client:192.168.150.1
先確定上面的觀念你能接受
再看 127.0.0.1 這個特殊 IP
127.0.0.1 是「每部機器都有的 IP,指的是自己的 IP(loopback)」
在 192.168.1.217 連線到 127.0.0.1 等同於連線到 192.168.1.217
在 192.168.150.1 連線到 127.0.0.1 等同於連線到 192.168.105.1
順便附贈一個生活小常識(類似市話的 127.0.0.1)
用家裡的市話機打給自己家裡的同一個市話號碼
我比較不能理解的部分是當我的電腦上VMnet1, VMnet8都打開時, TCP server 選擇 127.0.0.1及 192.168.1.217時, PHP client 是連不上的 (PHP client program 的 socket_connect(address, port, ..)選任一個 address都連不上) ,但若TCP server選擇 192.168.150.1, PHP client(PHP client program 的 socket_connect()選192.168.150.1)就可以連得上,以我不專業的話來說,好像 127.0.0.1, 192.168.1.217被藏在某個 address後面了,所以無法連上.
從你的回應可以得到一個結論
我打的那些字
全
部
白
打
了
請問是否有人能告訴我怎麼回事,如何做可以使server 與 client 使用 192.168.1.217或127.0.0.1正常通訊?
換個方式說
有一個方法可以使 server 與 client 使用 192.168.1.217或127.0.0.1正常通訊,連 192.168.150.1 都可以
就是server 和 client 都在「同一個 IP」上執行
只要server 和 client 都在「同一個 IP」上執行
保證 client 可以連上 server 的 IP,127.0.0.1 也可以
謝謝海綿寶寶對127.0.0.1的解釋,讓我更清楚它的意思,這對我的網路知識幫助很大(我也有看您提供的link).謝謝您.
我只是比較迷惑:當VMnet開啟時,TCP server 使用 192.168.1.217及127.0.0.1時,都無法用我寫的PHP client程式連線,只剩TCP server 使用 VMnet提供的IP, PHP client 可正常連線,好像VMnet改變了我的PC本身的網路拓樸將192.168.1.217及127.0.0.1藏起來了(我知道這是不正確的說法,但這現象說明比較像我遇到的感受),當我關掉VMnet,此時TCP server 就可以使用192.168.1.217或是127.0.0.1,使得 PHP client 透過192.168.1.217或是127.0.0.1
正常連線.所以想請問高手是怎麼回事.
在使用VMWare之前
請看看這篇
以了解VMWare Guest 的 IP 和 Host 的 IP 之間的關係