關於socketbindphp的信息

本文目錄一覽:

php要讓伺服器使用socket要怎麼配置

socket伺服器的工作方式是這樣的,不間斷地運行以等待客戶端的連接。一旦客戶端連接上了,伺服器就會將它添加到客戶名單中,然後開始等待來自客戶端的消息。

下面是完整的源代碼:

// Set time limit to indefinite execution

set_time_limit (0);

// Set the ip and port we will listen on

$address = ‘localhost’;

$port = 10000;

$max_clients = 10;

// Array that will hold client information

$client = Array();

// Create a TCP Stream socket

$sock = socket_create(AF_INET, SOCK_STREAM, 0);

// Bind the socket to an address/port

socket_bind($sock, $address, $port) or die(‘Could not bind to address’);

// Start listening for connections

socket_listen($sock);

echo “Waiting for connections…\r\n”;

// Loop continuously

while (true) {

// Setup clients listen socket for reading

$read[0] = $sock;

for ($i = 0; $i $max_clients; $i++) {

if (isset($client[$i][‘sock’]))

$read[$i + 1] = $client[$i][‘sock’];

}

// Set up a blocking call to socket_select()

if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) 1)

continue;

/* if a new connection is being made add it to the client array */

if (in_array($sock, $read)) {

for ($i = 0; $i $max_clients; $i++) {

if (empty($client[$i][‘sock’])) {

$client[$i][‘sock’] = socket_accept($sock);

echo “New client connected $i\r\n”;

break;

}

elseif ($i == $max_clients – 1)

echo “Too many clients…\r\n”;

}

} // end if in_array

// If a client is trying to write – handle it now

for ($i = 0; $i $max_clients; $i++) { // for each client

if (isset($client[$i][‘sock’])) {

if (in_array($client[$i][‘sock’], $read)) {

$input = socket_read($client[$i][‘sock’], 1024);

if ($input == null) {

echo “Client disconnecting $i\r\n”;

// Zero length string meaning disconnected

unset($client[$i]);

} else {

echo “New input received $i\r\n”;

// send it to the other clients

for ($j = 0; $j $max_clients; $j++) {

if (isset($client[$j][‘sock’]) $j != $i) {

echo “Writing ‘$input’ to client $j\r\n”;

socket_write($client[$j][‘sock’], $input, strlen($input));

}

}

if ($input == ‘exit’) {

// requested disconnect

socket_close($client[$i][‘sock’]);

}

}

} else {

echo “Client disconnected $i\r\n”;

// Close the socket

socket_close($client[$i][‘sock’]);

unset($client[$i]);

}

}

}

} // end while

// Close the master sockets

socket_close($sock);

可以先將它分解為幾個較小的部分。

第一部分是創建伺服器。Lines:2至20。

這部分代碼設置了變數、地址、埠、最大客戶端和客戶端數組。接下來創建socket並將其綁定到我們指定的地址和埠上。

下面我們要做的事情就是執行一個死循環(實際上我們是故意的!)。Lines:22至32。

在這部分代碼中我們做的第一步是設置 $read 數組。此數 組包含所有客戶端的套接字和我們主伺服器的套接字。這個變數稍後會用於select語句:告訴PHP監聽來自這些客戶端的每一條消息。

socket_select()的最後一個參數告訴我們的伺服器在返回值之前最多等待5秒鐘。如果它的返回值小於1,那麼就表示沒有收到任何數據,所以只需要返回循環頂部,繼續等待。

腳本的下一個部分,是增加新的客戶端到數組中。Lines:33至44。

將新的客戶端放置在列表的末尾。檢查以確保客戶端的數量沒有超過我們想要伺服器處理的數量。

下面要介紹的代碼塊相當大,也是伺服器的主要部分。當客戶端將消息發送到伺服器時,就需要這塊代碼挺身而出來處理。消息可以是各種各樣的,斷開消息、實際斷開——只要是伺服器需要處理的消息。Lines:46至末尾。

代碼循環通過每個客戶端並檢查是否收到來自於它們的消息。如果是,獲取輸入的內容。根據輸入來檢查這是否是一個斷開消息,如果是那就從數組中刪除它們,反之,那它就是一個正常的消息,那我們的伺服器再次通過所有客戶端,並一個一個寫信息給他們,跳過發送者。

想問下php的socket的工作流程是什麼?

PHP 使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽準備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。

產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。

定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。

表一:協議

名字/常量 描述

AF_INET 這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址

AF_INET6 與上面類似,不過是來用在IPv6的地址

AF_UNIX 本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用

表二:Socket類型

名字/常量 描述

SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。

SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。

SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。

SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)

SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序

表三:公共協議

名字/常量 描述

ICMP 互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息

UDP 用戶數據報文協議,它是一個無連接,不可靠的傳輸協議

TCP 傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。

現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個 socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。

Resourece socket_create(int protocol, int socketType, int commonProtocol);

現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。

?php

$commonProtocol = getprotobyname(「tcp」);

$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

socket_bind($socket, 『localhost』, 1337);

socket_listen($socket);

// More socket functionality to come

?

上面這個例子產生一個你自己的伺服器端。例子第一行,

$commonProtocol = getprotobyname(「tcp」);

使用公共協議名字來獲取一個協議類型。在這裡使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname() 函數的參數改為「udp」或「icmp」。還有一個可選的辦法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在 socket_create()函數中。

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。

關於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_bind不能連接端介面

//綁定到socket 到具體的ip 和埠

if(($ret=socket_bind($sock,$address,$port))0)

{

echo “socket_bind() 失敗的原因是:”.socket_strerror($ret).”br”;

}

如果報不能連接埠的話 那你看看你有沒有創建成功~~

if(($sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP))0)

{

echo “socket_create() 失敗的原因是:”.socket_strerror($sock).”br”;

}

php socket_bind error 10049如何解決

查看錯誤信息

//綁定到socket埠

if(($ret=socket_bind($sock,$address,$port))0)

{

echo “socket_bind() failed: reason:”.socket_strerror($ret).”\n”;

}

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()

寫數據到分散/聚合數組

原創文章,作者:PQOU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/145862.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
PQOU的頭像PQOU
上一篇 2024-10-29 18:59
下一篇 2024-10-29 18:59

相關推薦

  • Java 監控介面返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控介面返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • 已裝備我軍的空中信息化作戰平台

    本文將會從多個方面詳細闡述已裝備我軍的空中信息化作戰平台。 一、平台概述 已裝備我軍的空中信息化作戰平台是一個全新的作戰系統,具備實時數據採集、處理、分析、共享的能力。它可以在不同…

    編程 2025-04-27
  • 通過提交信息搜索-使用git

    本篇文章重點講解如何使用git通過提交信息來搜索。我們將從多個方面介紹如何使用git來搜索提交信息,並提供相應的代碼示例以供參考。 一、搜索方式 Git提供了三種搜索方式,分別為:…

    編程 2025-04-27
  • Linux查看系統信息

    一、CPU信息 Linux系統下,查看CPU的信息最常用的命令是lscpu。該命令可以顯示CPU架構、核心數量、線程數、緩存大小、CPU頻率等信息。例如: lscpu 該命令會輸出…

    編程 2025-04-24
  • 軟考 信息安全工程師

    軟考 信息安全工程師是一項技能型國家級資格認證考試,主要測試考生在信息安全領域的理論知識和實踐技能,是證明個人信息安全能力的重要證書。本文將從多個方面對軟考 信息安全工程師做詳細的…

    編程 2025-04-23

發表回復

登錄後才能評論