『壹』 php中關於socket的系列函數總結
本文列舉了所有關於PHP語言中使用socket相關服務的一些函數。注意使用如下函數之前,你需要確保你的socket已打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋(分號):
代碼如下:
extension=php_sockets.dll
如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:
代碼如下:
if(!extension_loaded('sockets')){
if(strtoupper(substr(PHP_OS,3))=="WIN"){
dl('php_sockets.dll');
}else{
dl('sockets.so');
}
}
如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。
php
socket
相關函數如下:
代碼如下:
socket_accept()
接受一個Socket連接
socket_bind()
把socket綁定在一個IP地址和埠上
socket_clear_error()
清除socket的錯誤或者最後的錯誤代碼
socket_close()
關閉一個socket資源
socket_connect()
開始一個socket連接
socket_create_listen()
在指定埠打開一個socket監聽
socket_create_pair()
產生一對沒有區別的socket到一個數組里
socket_create()
產生一個socket,相當於產生一個socket的數據結構
socket_get_option()
獲取socket選項
socket_getpeername()
獲取遠程類似主機的ip地址
socket_getsockname()
獲取本地socket的ip地址
socket_iovec_add()
添加一個新的向量到一個分散/聚合的數組
socket_iovec_alloc()
這個函數創建一個能夠發送接收讀寫的iovec數據結構
socket_iovec_delete()
刪除一個已經分配的iovec
socket_iovec_fetch()
返回指定的iovec資源的數據
socket_iovec_free()
釋放一個iovec資源
socket_iovec_set()
設置iovec的數據新值
socket_last_error()
獲取當前socket的最後錯誤代碼
socket_listen()
監聽由指定socket的所有連接
socket_read()
讀取指定長度的數據
socket_readv()
讀取從分散/聚合數組過來的數據
socket_recv()
從socket里結束數據到緩存
socket_recvfrom()
接受數據從指定的socket,如果沒有指定則默認當前socket
socket_recvmsg()
從iovec里接受消息
socket_select()
多路選擇
socket_send()
這個函數發送數據到已連接的socket
socket_sendmsg()
發送消息到socket
socket_sendto()
發送消息到指定地址的socket
socket_set_block()
在socket里設置為塊模式
socket_set_nonblock()
socket里設置為非塊模式
socket_set_option()
設置socket選項
socket_shutdown()
這個函數允許你關閉讀、寫、或者指定的socket
socket_strerror()
返回指定錯誤號的詳細錯誤
socket_write()
寫數據到socket緩存
socket_writev()
寫數據到分散/聚合數組
『貳』 關於php中socket的問題:
這是socket的服務端的代碼,監聽的ip地址是192.168.168.121,埠號為8528
請檢查以下幾點
這個ip是不是代碼所在伺服器的ip,一般監測內網ip,如127.0.0.1
埠號是否被使用,可以使用cmd命令 netstat -ano|findstr 8528 查找埠號為8528的埠使用情況
如果要給在公網上使用,請使用公網ip,這樣可以外網使用
如果代碼不報錯可以試下telnet下你的埠號,看是否可以使用
如 telnet 127.0.0.1 8528
解決方案
查看你電腦的ip地址,把上面代碼里「$address = '192.168.168.121';」這個ip地址換成「$address = '127.0.0.1';」或者你電腦的ip地址,再試試。
(ip地址改成127.0.0.1後,這段代碼在我電腦上可以使用)
『叄』 php 怎麼關閉非正常退出時的socket埠
首先:
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議。
用圖表示:
如果進程結束,關聯的埠也會一同取消綁定,如果你重新打開無法綁定埠,說明你原來的進程並沒有結束,請檢查進程中還有沒有原來的腳本。另外,你在腳本中加入關閉腳本時關閉埠的代碼不就完全解決這個問題了嗎
『肆』 關於socket通信運行機制的問題(PHP):
php socket 是以php cli 模式運行的 也就是在伺服器上用命令行執行php xxx.php
而你要保持這個文件的長連接 。就是持久監控。
保持長連接也就是死循環
while(true){
這里寫socket的一些方法
}
這樣他就是會一直執行。設置超時時間為0
這就socket的基本而原理 也是消息隊列的基本原理
『伍』 PHP SOCKET 技術研究
今天試著寫一個
PHP
與
C
語言通過socket通訊的程序,看過PHP手冊,發現有好幾種方式可以建立socket
客戶端.
1、通過
fsockopen()
建立socket連接,然後用
用fputs()
發送消息,用
fgets()
接收消息。
2、通過
socket_create()
建立
socket
連接,然後用
socket_send()
or
socket_write()
發送消息,用
socket_recv()
or
socket_read()
發送消息。
很奇怪,我在手冊上看到了這樣一段話"本擴展模塊是實驗性的。該模塊的行為,包括其函數的名稱以及其它任何關於此模塊的文檔可能會在沒有通知的情況下隨
PHP
以後的發布而改變。我們提醒您在使用本擴展模塊的同時自擔風險。"
看來
php4.0
socket通訊還不是完全穩定。
今天我寫的客戶端要與服務端做兩次通訊,我用上面這個方法都寫了一個客戶端程序,發現當僅僅就一次通訊的時候,也就是PHP客戶端發送一次消息,然後接收返回消息,就關閉連接。這兩種方法都能正確快速的實現功能,但當做兩次通訊時,卻有明顯的差別,第一種方法第一次通訊特別快就結束了,這個我可以通過服務端的輸出看出來,但是第二次通訊要等上好幾分鍾才能結束,我試了好幾次都這樣,我不太清楚我的程序哪裡出錯了,還是這個方式連接就是有問題,但是第二種方法做這兩次通訊卻很快,正確!完成的非常的。
最後我根據
第二種情況寫了一個
class
//////////////////////////////
File
Description
//////////////////////////////////////////
//
Class
Name
:
socket
//
Version
:
V1.0
//
Functional
Outline
:
create
socket,and
send
message
to
server
//
Revision
history
:
2004/12/15
First
version
created
//
Current
:
2004/12/15
Liu
Yongsheng
//////////////////////////////////////////////////////////////////////////////////////////
class
socket{
var
$socket;
//socket
句柄
var
$sendflag
=
">>>";
var
$recvflag
=
"<<<";
var
$response;
var
$debug
=
1;
function
socket($hostname,$port){
$address
=
gethostbyname($hostname);
$this->socket
=
socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$result
=
socket_connect($this->socket,$address,$port);
if($this->debug
==
1){
if
($result
<
0)
{
echo
"socket_connect()
failed.\nReason:
($result)
"
.
socket_strerror($result)
.
"<br>";
}
else{
echo
"connect
OK.<br>";
}
}
}
function
sendmsg($msg){
socket_write($this->socket,$msg,strlen($msg));
$result
=
socket_read($this->socket,100);
$this->response
=
$result;
if($this->debug
==
1){
printf("<font
color=#CCCCCC>%s
$msg</fon><br>",$this->sendflag);
printf("<font
color=blue>%s
$result</font><br>",$this->recvflag);
}
return
$result;
}
function
close(){
socket_close($this->socket);
}
}
『陸』 php 的 socket如何判斷連接已經斷開
當連接斷開時,讀寫socket的函數會失敗。如socket_read()在讀取失敗時布爾值false。這時可以調用socket_last_error()和socket_strerror()函數得到錯誤代碼和錯誤信息。可以根據這個判斷失敗原因是否為連接斷開。
望採納~~
『柒』 客戶端發給socket一個請求,伺服器端使用php處理完成後,怎樣在php里斷開這個socket連接
你好,我在知道看到你的另外一個提問
你說你用fopen()打開的socket,應該指的是客戶端那邊用fopen()建立與伺服器的連接的吧
socket的機制是,有一個服務端,然後客戶端連接服務端的時候,服務端可以通過accept來獲取一個客戶端socket對象,PHP手冊的socket_close()的說明是這樣的
void socket_close ( resource socket )
socket_close() closes the socket resource given by socket. 注: socket_close() can't be used on PHP file
resources created with fopen(), popen(), fsockopen(), or pfsockopen(); it is meant for sockets created with socket_create() or
socket_accept().
See also socket_bind(), socket_listen(), socket_create() and socket_strerror().
大概意思是socket_close(resource socket )中的socket不能是由fopen(), popen(), fsockopen(), or pfsockopen()這些方法產生的,只能是socket_create() or socket_accept()方法,前面那些方法應該是在客戶端用的啊,你服務端用的應該是socket_accept(),為什麼不能用socket_close來關閉呢
『捌』 PHP socket 問題
你去把報錯的內容也貼出來啊
『玖』 php socket的問題!
$host="192.168.1.111";
$port=1254;
這可能有問題:(1)你看看你的ip地址是不是192.168.1.111(2)如果是的話,看看埠是不是被佔領
『拾』 關於php socket問題
使用socket_read函數,在socket_write($socket,$file);這句話以後使用,
如
$buf = socket_read($socket,8192);
echo "Received msg: $buf \n";
注意這里使用的套接字必須與上面socket_write使用的保持一致,如果你認為有延遲的話,那你可以加上一個for 或while語句進行封裝