php用socket獲得客戶端的ip和埠

時間 2021-10-14 21:28:53

1樓:匿名使用者

1、測試環境:

伺服器ip:192.168.150.1

客戶端ip:192.168.150.2

2、測試過程:

客戶端伺服器將在本機(192.168.150.

2)通過socket傳送資料到服務端(192.168.150.

2)的socket伺服器上,服務端接收到客戶端傳送的資料後返回一些資訊給客戶端。

3、服務端檔案內容:

#server.php

<?php

//獲取tcp協議號碼。

$tcp = getprotobyname("tcp");

// 建立server端socket ,建立並返回一個套接字,也稱作一個通訊節點。一個典型的網路連線由 2 個套接字構成,一個執行在客戶端,另一個執行在伺服器端。

$socket = socket_create(af_inet, sock_stream, $tcp);

//繫結要監聽的ip和埠,這裡繫結的ip一定要寫區域網ip,寫成127.0.0.1客戶端將無法與服務端建議連線。

socket_bind($socket, '192.168.150.1', 10008);

//監聽埠

socket_listen($socket);

//初始化一個資料,和客戶端通訊

$buffer = "connect";

while (true) else else

// 從客戶端獲取得的資料

while ($data = @socket_read($connection, 1024, php_normal_read))

} //關閉 socket

socket_close($connection);

printf("closed the socket\n");

} ?>

4、客戶端檔案內容:

client.php

<?php

// 建立客戶端的socet連線

$socket = socket_create(af_inet, sock_stream, sol_tcp);

//連線伺服器端socket

$connection = socket_connect($socket, '192.168.150.1', 10008);

//要傳送到服務端的資訊。

$send_data = "this data will send to server!";

//客戶端去連線服務端並接受服務端返回的資料,如果返回的資料保護not connect就提示不能連線。

while ($buffer = @socket_read($socket, 1024, php_normal_read)) else

//伺服器端收到資訊後,客戶端接收服務端傳給客戶端的迴應資訊。

while ($buffer = socket_read($socket, 1024, php_normal_read))

} }?>

5、在服務端socket服務啟動程序。

interactive mode enabled

6、服務端啟動後檢視啟動的程序及埠。

#netstat -tnlp |grep 10008

tcp 0 0 192.168.150.

13:10008 0.0.

0.0:* listen 28892/php

7、在客戶端(192.168.1.2)上執行傳輸

interactive mode enabled

buffer data: connect

writing to socket

sent to server:this data will send to server!

response from server was:thank you client, you data information received

8、回到服務端上檢視接收到的資訊。

interactive mode enabled

socket connected

send data to client

wrote to socket

buffer: this data will send to server!

9、參考資料

socket_create()函式需要三個引數:一個協議、一個socket型別、一個公共協議。socket_create()函式執行成功返回一個包含socket的資源型別,如果沒有成功則返回false。

2樓:在晴天的雨傘

socket_getpeername() 獲取遠端類似主機的ip地址

socket_getsockname() 獲取本地socket的ip地址

怎麼感覺你用的實際上是對的,難道用nginx一類的負載均衡伺服器了

想用php做socket伺服器,不知道如何實現同時和多個不同客戶端資料互動?

3樓:空雪夢見

因為只有呼叫了accept客戶端才能連上,你如果accept下面接一個迴圈,那麼第二個使用者不是說能不能進這個迴圈,而是連不進……此時只有第一個使用者break出了迴圈,然後程式回頭再呼叫accept,第二個使用者才能連上。

用多程序來處理如何?因為accept一個客戶端以後,應該是馬上準備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。

socket_accept以後,直接呼叫 pcntl_fork(),此時程序會**為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續呼叫socket_accept即可,是0的那個處理客戶端請求。

pnctl_fork不知道在windows下能不能用。

不過返回不是0的那個程序並不是這樣就完事了,還要呼叫pcntl_wait防止子程序卡在那邊沒有完全結束。你可以在主程序裡時不時就呼叫這個,配上wnohang作為option引數防止沒有子程序需要wait的時候卡在那邊。

這都是linux下常用的處理手段。說實話本來我想讓你用多執行緒的,不過看了一圈不知道php裡怎麼用執行緒,倒是找到了用程序的方式,所以就

4樓:

你知道有session這個東西嗎

如何獲得socket連線客戶端的ip地址

馬三小夥兒 如果伺服器端要獲取客戶端ip的話 假設socket bind listen 函式已經完成addrlen sizeof client 那麼client.sin port 就是客戶端的埠client.sin addr.s addr 就是客戶端的ip。這兩個都是以網路位元組序來儲存的,如果要p...

linux下socket網路程式設計 客戶端向伺服器端傳送檔案

不知道是樓下還是樓上,他用的事windows的套接字貌似,不過過程是一樣的,在linux下面使用的函式名字不同罷了,客戶端向伺服器端傳送檔案,過程其實很簡單 1.客戶端向伺服器端傳送傳輸檔案的請求 可攜帶一些所傳檔案的大小之類的基本資訊 2.伺服器端接收請求 根據檔案資訊看是否能夠接受請求 3.客戶...

php怎麼響應客戶端傳送http請求

獲取請求 如下 測試 獲取域名或主機地址 獲取網頁地址 echo server php self blog testurl.php 獲取 引數 echo server query string id 5 獲取使用者 獲取完整的url 包含埠號的完整url 只取路徑 echo 匹配已找到 else e...