iT邦幫忙

0

本機PHP tcp client 想連上本機的 tcp server,但不是每一個ip都能成功,請問何解?

請問一下先進:

我在練習 PHP tcp client program 與同一台機上的tcp server 互動.但是遇到一個現象,就是 PHP client program 與 server都只能是特定ip才連的上,但這ip不是實體網卡所設的 IP,我覺得很奇怪, 所以想請問大家是怎麼回事?

  1. 首先本機是 window 10. 安裝有一張網卡,本機上有數個 IP address 包括網卡本身的 IP address (192.168.1.217), locolhost (127.0.0.1), 及vmware 產生的 (192.168.150.1). 詳細資訊請參考下面 ipconfig/all .

  2. PHP client program 是run 在MAMP上,使用 apache server, port 9000.由網頁javascript帶起來執行

  3. tcp server program 是使用 TCP/UDP Net assistant這個軟體, 平常這軟體可以正常使用,所以應該是沒有問題.

  4. 當 tcp server open時, 若選擇 local host addr 192.168.150.1, port 5010 (我任意設的) 則 PHP程式 可以連得上 tcp server.資料收及送都沒問題.

  5. 若 tcp server 選擇 192.168.1.217或是 127.0.0.1, PHP client program 就連不上

顯示錯誤訊息如下:
socketconnect() failed: 192.168.1.217 5010
Reason: () 無法連線,因為目標電腦拒絕連線。

  1. 我是使用window 10 本身的防火牆,不論開啟或是關掉,結果都是相同的.所以並非防火牆造成的 (在防火牆我有設允許上述的server 存取網路,且若使用ip 192.168.150.1就沒問題)

  2. 請問是否有人能告訴我怎麼回事,如何做可以使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>


把vm關掉看看還能不能連到網頁。
我想你會說一定不能的

所以....
我剛試了試關掉VMnet1, VMnet8以後, 192.168.1.217及 127.0.0.1就都可以連線了,謝謝您,但是可否解釋這兩種情境(vmnet 開及關)的影響是什麼嗎?
海綿有解釋了。你可以看看了解一下。
一般127.0.0.1的定義是非常特殊的。

真要單純說明的話。你vm內的127.0.0.1跟你當前機器的127.0.0.1。
一定是指向不同的地方。

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-12-31 08:01:53

本機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後面了,所以無法連上.

從你的回應可以得到一個結論
我打的那些字





/images/emoticon/emoticon10.gif

請問是否有人能告訴我怎麼回事,如何做可以使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 之間的關係

我要發表回答

立即登入回答