| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> php >> PHP的Socket函數參考
 

PHP的Socket函數參考

2008-12-19 08:07:32  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  這些Socket函數直接跟互聯網的協議進行發送信息。相對于fopensock的流來講,他們操作在一個比較底層的級別。通常,他們都是對C 函數進行封裝,並且名稱都類似。如果你有使用C進行socket編程的經驗,那麽使用這些函數將是非常熟練的。我們這裏不討論特別詳細的socket編程。

  使用這些函數能夠解決高層級別函數所不能解決的難題。使用這些函數能夠實現類似fopen的功能,你也許有很多方法來實現socket的功能,比如在PHP中使用CLI(Command-line Interface)來實現的Internet守護進程。

  resource socket_accept(resource socket)

  在你的腳本服務器端中,使用socket_accept接受一個進入的連接。你必須首先産生一個socket,綁定它到一個名字,並且設置它監聽一個端口。在塊模式中,socket_accept將産生一個唯一接受後的連接。在非塊模式中,它沒有建立連接則返回false。另外,當你有了一個新的socket資源後就能夠進行讀寫操作。

  下面我們將示範一個簡單的回顯服務器端。它運行在CLI(命令行)下面,它在12345端口等待客戶端的連接。

  socket_accept

  <?php

   set_time_limit(0);

   //create the socket

   if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) < 0){

   print("Couldn't create socket: " . socket_strerror(socket_last_error()) . "\n");

   }

   //bind it to the given address and port

   if(($error = socket_bind($socket, gethostbyname($_SERVER['HOSTNAME']), 12345)) < 0){

   print("Couldn't bind socket: " . socket_strerror(socket_last_error()) . "\n");

   }

   if(($error = socket_listen($socket, 5)) < 0){

   print("Couldn't list on socket: " .

   socket_strerror(socket_last_error()) . "\n");

   }

   while(TRUE){

   //wait for connection

   if(($accept = socket_accept($socket)) < 0){

   print("Error while reading: " . socket_strerror($message) . "\n");

   break;

   }

   //send welcome message

   socket_write($accept, "Connection accepted\n");

   print(date('Y-m-d H:i:s') . " STATUS: Connection accepted\n");

   ob_flush();

   while(TRUE){

   //read line from client

   if(FALSE === ($line = socket_read($accept, 1024))){

   print("Couldn't read from socket: " .

   socket_strerror(socket_last_error()) . "\n");

   break 2;

   }

   if(accept]!@socket_write($accept, "ECHO: $line")){

   print(date('Y-m-d H:i:s') . " STATUS: Connection interrupted\n");

   break;

   }

   print(date('Y-m-d H:i:s') . " READ: $line");

   ob_flush();

   }

   socket_close($accept);

   }

  ?>

  bool socket_bind(resource socket, string address, integer port)

  這個socket_bind()把一個socket資源綁定在一個地址上。這個socket必須由socket_create()函數返回的一個資源。這個地址必須是一個IP地址或者是一個保存Unix socket的路徑。如果是運行在Internet上的socket,你還必須提供一個端口。

  socket_clear_error(resource socket)

  這個函數能夠清除制定socket的錯誤,如果沒有指定參數,那麽將清除所有socket的錯誤。

  socket_close(resource socket)

  socket_close函數關閉一個socket並且清除該socket所占用的內存資源。

  boolean socket_connect(resource socket, string address, integer port)

  這個函數創建一個客戶端到一個端口或者socket的連接。你必須提供一個由socket_create産生的socket。這個address參數必須到一個socket的路徑或者是一個IP地址。如果是後者,還必須跟一個數字的端口號。

  下面例子演示了使用UDP協議的連接到遊戲服務器然後獲取信息的過程。

  socket_connect

  <?php

   //create UDP socket

   if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0){

   print("Couldn't create socket: " .

   socket_strerror(socket_last_error()) . "\n");

   }

   //timeout after 5 seconds

   socket_set_option($socket, SOL_SOCKET,

   SO_RCVTIMEO, array('sec'=>5,'usec'=>0));

   //connect to the RtCW master server

   if(!socket_connect($socket, 'wolfmaster.idsoftware.com', 27950)){

   print("Couldn't connect: " .

   socket_strerror(socket_last_error()) . "\n");

   }

   //send request for servers

   socket_write($socket, "\xFF\xFF\xFF\xFFgetservers\x00");

   //get servers

   $server = array();

   while(FALSE !== ($line = @socket_read($socket, 4096))){

   //parse data

   for($i=22; ($i+5) < strlen($line); $i += 7){

   $ip = ord(substr($line, $i+1, 1)) . '.' .

   ord(substr($line, $i+2, 1)) . '.' .

   ord(substr($line, $i+3, 1)) . '.' .

   ord(substr($line, $i+4, 1));

   $port = (ord(substr($line, $i+5, 1)) * 256) +

   ord(substr($line, $i+6, 1));

   $server[] = array('ip'=>$ip, 'port'=>$port);

   }

   }

   print("<h1>" . count($server) . " Servers</h1>\n");

   //loop over servers, getting status

   foreach($server as $s){

   print("<h1>{$s['ip']}:{$s['port']}</h1>\n");

   //connect to RtCW server

   if(!socket_connect($socket, $s['ip'], $s['port'])){

   print("<p>\n" .

   socket_strerror(socket_last_error()) .

   "\n</p>\n");

   continue;

   }

   //send request for status

   socket_write($socket, "\xFF\xFF\xFF\xFFgetstatus\x00");

   //get status from server

   if(FALSE === ($line = @socket_read($socket, 1024))){

   print("<p>\n" .

   socket_strerror(socket_last_error()) .

   "\n</p>\n");

   continue;

   }

   $part = explode("\n", $line);

   //settings are in second line separated by backslashes

   $setting = explode("\\", $part[1]);

   print("<h2>Configuration</h2>\n");

   print("<p>\n");

   for($s=1; $s < count($setting); $s += 2){

   print("\t\t{$setting[$s]} = {$setting[$s+1]}<br>\n");

   }

   print("</p>\n");

   print("<h2>Players</h2>\n");

   $lastPlayer = count($part) - 1;

   for($p=2; $p < $lastPlayer; $p++){

   $player = explode(" ", $part[$p]);

   print("{$player[2]} Score={$player[0]} " .

   "Ping={$player[1]}<br>\n");

   }

   print("</p>\n");

   ob_flush();

   }

   print("</table>\n");

   socket_close($socket);

  ?>

  resource socket_create(integer family, integer socket_type, integer protocol)

  socket_create初始化一個socket的結構。第一個參數是一個protocol family,或者域。你必須使用AF_INET來指定一個Internet連接,或者使用AF_UNIX來指定一個Unix socket連接。第二個參數是一個socket的類型,你可以從下面的表中選擇。一般情況下,使用SOCK_STREAM來使用TCP協議,UDP協議使用SOCK_DGRAM。第三個參數指定爲一個協議。使用SOL_TCP或SOL_UDP來分別對應TCP和UDP協議。還有一個選擇是你能夠使用 getprotobyname函數來處理。

  Socket 類型

  常量 描述

  SOCK_DGRAM 自動尋址數據包socket

  SOCK_RAW RAW協議接口

  SOCK_RDM 可靠交換消息

  SOCK_SEQPACKET 順序數據包socket

  SOCK_STREAM 流socket

  resource socket_create_listen(integer port, integer backlog)

  使用socket_create_listen是一種比socket_create更簡單的産生一個socket進行監聽。這個産生的socket將監聽指定的端口,後面可選的參數backlog是設置允許最大的連接數。

  boolean socket_create_pair(integer family, integer socket_type, integer protocol, array handles)

  socket_create_pair函數産生一對socket連接。首先前三個參數是對一個socket_create的描述,這個handles參數是一個包含兩個socket資源的數組。該函數是對C裏面socketpair函數的封裝。

  socket_create_pair

  <?php

   if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket)){

   print("Couldn't make sockets!\n");

   exit();

   }

   $child = pcntl_fork();

   if($child == -1){

   print("Couldn't fork!\n");

   exit();

   }

   elseif($child > 0){

   //parent

   socket_close($socket[0]);

   print("Parent: waiting for message\n");

   $message = socket_read($socket[1], 1024, PHP_NORMAL_READ);

   print("Parent: got message--$message\n");

   socket_write($socket[1], "Hello, Child Process!\n");

   pcntl_waitpid($child, $status);

   }else{

   //child

   socket_close($socket[1]);

   socket_write($socket[0], "Hello, Parent Process!\n");

   print("Child: waiting for message\n");

   $message = socket_read($socket[0], 1024, PHP_NORMAL_READ);

   print("Child: got message--$message\n");

   exit(0);

   }

  ?>

  value socket_get_option(resource socket, integer level, integer option)

  socket_get_option函數返回一個下表中所列的一個添加值,你必須提供一個由socket_create産生的socket資源和一個等級。這個獲取的socket級別,可以使用SOL_SOCKET來確定這個級別參數。另外,使用協議,比如象SOL_TCP來表示一個TCP協議。這些選項可能是由socket_set_option設置的。

  socket_get_options

  <?php

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

   print('SO_BROADCAST: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_BROADCAST) . "<br>\n");

   print('SO_DEBUG: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_DEBUG) . "<br>\n");

   print('SO_DONTROUTE: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_DONTROUTE) . "<br>\n");

   print('SO_ERROR: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_ERROR) . "<br>\n");

   print('SO_KEEPALIVE: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_KEEPALIVE) . "<br>\n");

   print('SO_LINGER: ' .

   print_r(socket_get_option($socket, SOL_SOCKET,

   SO_LINGER), TRUE) . "<br>\n");

   print('SO_OOBINLINE: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_OOBINLINE) . "<br>\n");

   print('SO_RCVBUF: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_RCVBUF) . "<br>\n");

   print('SO_RCVLOWAT: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_RCVLOWAT) . "<br>\n");

   print('SO_RCVTIMEO: ' .

   print_r(socket_get_option($socket, SOL_SOCKET,

   SO_RCVTIMEO), TRUE) . "<br>\n");

   print('SO_REUSEADDR: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_REUSEADDR) . "<br>\n");

   print('SO_SNDBUF: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_SNDBUF) . "<br>\n");

   print('SO_SNDLOWAT: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_SNDLOWAT) . "<br>\n");

   print('SO_SNDTIMEO: ' .

   print_r(socket_get_option($socket, SOL_SOCKET,

   SO_SNDTIMEO), TRUE) . "<br>\n");

   print('SO_TYPE: ' .

   socket_get_option($socket, SOL_SOCKET,

   SO_TYPE) . "<br>\n");

  ?>

  Socket選項表

  選項 描述

  SO_BROADCAST 允許自動尋址的socket發送和接受廣播包

  SO_DEBUG 打開socket調試功能,只有root才有權限打開該選項

  SO_DONTROUTE 不接受路由包通過網關

  SO_ERROR 獲取並且清除最後一次的socket錯誤,這個選項也許不用設置

  SO_KEEPALIVE 打開保持激活狀態的消息

  SO_LINGER Socket_colse和socket_shutdown的中止消息發送超時,該選項使用一個數組,包括l_onoff和l_linger兩個鍵。

  SO_OOBINLINE 把數據直接插入到接受緩沖

  SO_RCVBUF 限制接受緩沖的最大字節

  SO_RCVLOWAT 延遲通過接受一個最小的數據

  SO_RCVTIMEO 延遲報告一個接受超時報告,使用數組的兩個鍵:sec和usec

  SO_REUSEADDR 允許重新使用本地地址

  SO_SNDBUF 限制發送緩沖的最大字節

  SO_SNDLOWAT 延遲發送數據到這個協議當接受一個最小的字節

  SO_SNDTIMEO 延遲報告超時錯誤,當發送發送通過一個時間。該選項使用數組的鍵值:sec和usec

  SO_TYPE 獲取socket的類型,該選項可能不用設置

  boolean socket_getpeername(resource socket, string address, integer port)

  socket_getpeername從指定的一個連接中獲取地址和端口。如果連接爲Unix socket,那麽將返回文件系統的路徑。

  boolean socket_getsockname(resource socket, string address, integer port)

  socket_getsockname放置一個名字到socket中,並且加上address和port參數。失敗返回false。

  (下面的socket_iovec_* 函數不太了解,不敢亂翻譯,保留原文)

  boolean socket_iovec_add(resource iovector, integer length)

  The socket_iovec_add unction adds an I/O vector to the scatter/gather array.

  resource socket_iovec_alloc(integer count, …)

  The socket_iovec_alloc function returns a resource for handling a collection of I/O vectors. The first argument specifies the number of vectors. Following arguments specify the length of each vector.

  boolean socket_iovec_delete(resource iovector, integer position)

  The socket_iovec_delete function removes the I/O vector at the given position.

  string socket_iovec_fetch(resource iovector, integer position)

  The socket_iovec_fetch function returns the value of the specified vector in the I/O vector resource.

  boolean socket_iovec_free(resource iovector)

  The socket_iovec_free function frees the memory used for an I/O vector resource.

  boolean socket_iovec_set(resource iovector, integer position, string value)

  The socket_iovec_set sets the value of I/O vector at the given position.

  integer socket_last_error(resource socket)

  socket_last_error函數返回操作中的任何socket函數産生的最後錯誤。你也許在上面函數中設置了socket資源的 socket選項在指定的連接上。下面的表列出了返回的錯誤代碼,你同樣可以使用soclet_strerror函數來獲取詳細的錯誤。使用 socket_clear_error函數清除socket的錯誤。

  Socket錯誤代碼表

  常量 描述

  SOCKET_E2BIG 參數列表太長

  SOCKET_EACCES 沒有許可權限

  SOCKET_EADDRINUSE 地址已經被使用

  SOCKET_EADDRNOTAVAIL 不能解析請求的地址

  SOCKET_EADV 廣播(廣告)錯誤

  SOCKET_EAFNOSUPPORT Address family不支持的協議

  SOCKET_EAGAIN 資源暫時不能獲得

  SOCKET_EALREADY 操作已經在執行

  SOCKET_EBADE 無效的交換

  SOCKET_EBADF 錯誤的文件描述符

  SOCKET_EBADFD 文件描述符錯誤的狀態

  SOCKET_EBADMSG 錯誤的消息

  SOCKET_EBADR 無效的請求描述

  SOCKET_EBADRQC 無效的請求代碼

  SOCKET_EBADSLT 無效的操作位置

  SOCKET_EBUSY 驅動或資源繁忙

  SOCKET_ECHRNG 信道號碼超出範圍

  SOCKET_ECOMM 發送通訊錯誤

  SOCKET_ECONNABORTED 軟件原因導致通行中斷

  SOCKET_ECONNREFUSED 連接被拒絕

  SOCKET_ECONNRESET 連接被相同的socket重置

  SOCKET_EDESTADDRREQ 必須需要目標地址

  SOCKET_EDQUOT 超出磁盤配額

  SOCKET_EEXIST 文件已存在

  SOCKET_EFAULT 錯誤的地址

  SOCKET_EHOSTDOWN 主機已關閉

  SOCKET_EHOSTUNREACH 沒有路由到主機

  SOCKET_EIDRM 表示ID被刪除

  SOCKET_EINPROGRESS 操作正在執行

  SOCKET_EINTR 系統調用被阻止

  SOCKET_EINVAL 無效的參數

  SOCKET_EIO 輸入/ 輸出錯誤

  SOCKET_EISCONN 傳輸終端已經連接

  SOCKET_EISDIR 是一個目錄

  SOCKET_EISNAM 是一個指定的類型文件

  SOCKET_EL2HLT 級別2已中止

  SOCKET_EL2NSYNC 級別2不同步

  SOCKET_EL3HLT 級別3已中止

  SOCKET_EL3RST 級別3被重置

  SOCKET_ELNRNG 連接號超出範圍

  SOCKET_ELOOP 太多級別的符號連接

  SOCKET_EMEDIUMTYPE 錯誤的媒介類型(中間類型)

  SOCKET_EMFILE 太多打開的文件

  SOCKET_EMLINK 太多的連接

  SOCKET_EMSGSIZE 消息太長

  SOCKET_EMULTIHOP 嘗試次數太多

  SOCKET_ENAMETOOLONG 文件名太長

  SOCKET_ENETDOWN 網絡已關閉

  SOCKET_ENETRESET 網絡中斷,連接被重置

  SOCKET_ENETUNREACH網絡不可達

  SOCKET_ENFILE 系統中太多打開的文件

  SOCKET_ENOANO 沒有正極

  SOCKET_ENOBUFS 沒有可用的緩存空間

  SOCKET_ENOCSI 沒有可用的CSI結構

  SOCKET_ENODATA 沒有可用的數據

  SOCKET_ENODEV 沒有這樣的驅動

  SOCKET_ENOENT 沒有這樣的文件或目錄

  SOCKET_ENOLCK 沒有可用的記錄鎖

  SOCKET_ENOLINK 已經有的服務的連接

  SOCKET_ENOMEDIUM 沒有媒介被找到

  SOCKET_ENOMEM 不能分配內存

  SOCKET_ENOMSG 沒有指定的消息類型

  SOCKET_ENONET 設備不在網絡上

  SOCKET_ENOPROTOOPT 協議不可用

  SOCKET_ENOSPC 沒有空間在驅動器

  SOCKET_ENOSR 超出的流資源

  SOCKET_ENOSTR 驅動不是一個流

  SOCKET_ENOSYS 函數沒有執行

  SOCKET_ENOTBLK 塊驅動是必須的

  SOCKET_ENOTCONN 傳輸終端沒有連接

  SOCKET_ENOTDIR 沒有一個目錄

  SOCKET_ENOTEMPTY 目錄爲空

  SOCKET_ENOTSOCK Socket操作在一個非socket上

  SOCKET_ENOTTY 不相符的IO控制器

  SOCKET_ENOTUNIQ 在網絡上名字不是唯一的

  SOCKET_ENXIO 沒有這樣的驅動或地址

  SOCKET_EOPNOTSUPP 操作不支持

  SOCKET_EPERM 操作不允許

  SOCKET_EPFNOSUPPORT Protocol family不支持

  SOCKET_EPIPE 失敗的管道

  SOCKET_EPROTO 協議錯誤

  SOCKET_EPROTONOSUPPORT 協議不支持

  SOCKET_EPROTOTYPE Socket上協議錯誤的類型

  SOCKET_EREMCHG 遠程地址已改變

  SOCKET_EREMOTE 對象是遠程的

  SOCKET_EREMOTEIO 遠程I/O錯誤

  SOCKET_ERESTART 中斷的系統調用將要重新開始

  SOCKET_EROFS 文件系統爲只讀

  SOCKET_ESHUTDOWN. 傳輸端點中斷不能發送

  SOCKET_ESOCKTNOSUPPORT Socket類型不支持

  SOCKET_ESPIPE 不合法的檢索

  SOCKET_ESTRPIPE 流管道錯誤

  SOCKET_ETIME 定時器到時

  SOCKET_ETIMEDOUT 連接超時

  SOCKET_ETOOMANYREFS 太多連接無法結合

  SOCKET_EUNATCH 無法附加協議驅動

  SOCKET_EUSERS 太多用戶

  SOCKET_EWOULDBLOCK 資源暫時無法獲得

  SOCKET_EXDEV 無效的交叉驅動連接

  SOCKET_EXFULL 交換已滿

  boolean socket_listen(resource socket, integer backlog)

  這個socket_listen函數等待從客戶端過來的連接,backlog參數設置允許最多等待連接的隊列數。

  string socket_read(resource socket, integer length, integer type)

  socket_read函數從特定的socket中讀取指定的字節,如果錯誤返回false。缺省下,是采用二進制安全的讀取模式。你可以外在的設置type參數爲PHP_BINARY_READ來改變讀取模式。你也可以把type設置爲PHP_NORMAL_READ。

  boolean socket_readv(resource socket, resource iovector)

  socket_readv函數把讀取的數據插入到iovector資源中。

  integer socket_recv(resource socket, string buffer, integer length, integer flags)

  socket_recv函數讀取數據插入到緩沖中。Length參數設置最多讀取的字節數,flag參數可以使用MSG_OOB或MSG_PEEK。函數返回讀取的字節數。

  integer socket_recvfrom(resource socket, string buffer, integer length, string host, integer port)

  socket_frcvfrom函數讀取數據插入到緩存中。Length參數設置獲取最多允許接受的字節數。設置flags參數可以爲MSG_OOB 或 MSG_PEEK。PHP設置主機和端口參數適當的值能夠獲取從主機發出的數據。

  boolean socket_recvmsg(resource socket, resource iovector, array control, integer length, integer flags, string host, integer port)

  socket_recvmsg函數從socket中讀取數據並且插入到一個I/O向量資源中。PHP設置control參數是一個具有三個元素的聯合數組:cmsg_level, cmsg_type, 和 cmsg_data。Length參數是一個附加在數據中的關于獲取數據的長度參數。Flags參數是設置允許值和返回值。在寫的時間,PHP無法執行所有的輸出常量。PHP設置host和port參數適當的值是爲了獲取從遠程主機中發送的數據。

  (Socket_slect函數沒有翻譯,因爲怕詞不達意)

  integer socket_select(array read, array write, array exception, integer timeout_seconds, integer timeout_microseconds)

  The socket_select function waits for changes to sockets. PHP watches the sockets given in the read array for new data coming in. PHP watches the streams given in the write array for being ready to accept more data. PHP watches the streams given in the exception argument for errors. If the number of seconds specified in the timeout_seconds argument passes, the function returns. Use the optional timeout_microseconds argument to specify a timeout less than 1 second.

  The socket_select function returns the number of sockets that changed or FALSE if an error occurred. If the call timed out, this function returns zero. It also modifies the given arrays so that they include only those sockets that changed.

  If you have no sockets of a particular type to watch, you may pass an empty array or a variable set to NULL.

  integer socket_send(resource socket, string buffer, integer length, integer flags)

  socket_send函數把寫數據到緩沖中,然後插入到連接中。你必須指定一個緩沖最大可寫字節數。你同樣可以設置flags參數爲空,或者爲下面聯合常量中的一個:MSG_DONTROUTE和 MSG_OOB。函數結束返回已經寫的字節數,失敗返回false。

  boolean socket_sendmsg(resource socket, resource iovector, integer flags, string address, integer port)

  socket_sendmsg嘗試發送數據到一個socket。它適合無連接的socket。Iovector參數是一個通過 socket_iovec_alloc函數産生的資源。你必須指定flags參數爲:NULL, MSG_DONTROUTE, MSG_OOB,或者是兩個聯合常量。你應當指定一個地址和一個Internet請求的端口。

  Socket_sendmsg函數發送數據返回true,但是不能保證數據一定到達。

  integer socket_sendto(resource socket, string buffer, integer length, integer flags, string address, integer port)

  socket_sendto函數嘗試寫數據到buffer緩沖中,並且發送給一個socket。它適合大部分無連接的socket。你必須指定 flags爲:NULL,MSG_DONTROUTE,MSG_OOB或者是一個兩個聯合常量。你還應但指定地址和一個請求的端口。

  Socket_sendto函數數據發送出去返回true,但是不能保證數據一定到達。

  boolean socket_set_block(resource socket)

  socket_set_block函數設置socket插入到一個塊模式中,這是缺省模式。在塊模式中,I/O操作正對于一個完成的請求。

  boolean socket_set_nonblock(resource socket)

  socket_set_nonblock函數設置socket插入到意個非塊模式中。在非塊模式中,I/O操作馬上返回,即使沒有數據。

  boolean socket_set_option(resource socket, integer level, integer option, integer value)

  socket_set_option函數給socket設置一個選項。Level參數設置一個標志級別的常量。有效的值包括:SOL_SOCKET, SOL_TCP和SOL_UDP。Option參數必須匹配文章上面的Socket選項表中的常量。

  boolean socket_shutdown(resource socket, integer how)

  socket_shutdown函數關閉一個關于I/O的socket。設置how爲0則中止接受數據,設置爲1則停止發送數據,設置爲2則中止二者操作。

  string socket_strerror(integer error)

  socket_strerror函數返回一個錯誤號的詳細錯誤信息。

  integer socket_write(resource socket, string buffer, integer length)

  socket_write函數寫數據到buffer緩沖中然後輸出到socket中。你可以指定length參數來指定緩沖的最大字節數。這個函數通常情況下比socket_send更方便。

  boolean socket_writev(resource socket, resource iovector)

  socket_writev函數通過I/O向量寫數據到一個socket中。
 
 
 
上一篇《PHP和C通過Socket通信--UDP篇》
下一篇《PHP字符串函數庫》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
這些Socket函數直接跟互聯網的協議進行發送信息。相對于fopensock的流來講,他們操作在一個比較底層的級別。通常,他們都是對C 函數進行封裝,並且名稱都類似。如果你有使用C進行socket編程的經驗,那麽使用這些函數將是非常熟練的。我們這裏不討論特別詳細的socket編程。 使用這些函數能夠解決高層級別函數所不能解決的難題。使用這些函數能夠實現類似fopen的功能,你也許有很多方法來實現socket的功能,比如在PHP中使用CLI(Command-line Interface)來實現的Internet守護進程。 resource socket_accept(resource socket) 在你的腳本服務器端中,使用socket_accept接受一個進入的連接。你必須首先産生一個socket,綁定它到一個名字,並且設置它監聽一個端口。在塊模式中,socket_accept將産生一個唯一接受後的連接。在非塊模式中,它沒有建立連接則返回false。另外,當你有了一個新的socket資源後就能夠進行讀寫操作。 下面我們將示範一個簡單的回顯服務器端。它運行在CLI(命令行)下面,它在12345端口等待客戶端的連接。 socket_accept <?php set_time_limit(0); //create the socket if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) < 0){ print("Couldn't create socket: " . socket_strerror(socket_last_error()) . "\n"); } //bind it to the given address and port if(($error = socket_bind($socket, gethostbyname($_SERVER['HOSTNAME']), 12345)) < 0){ print("Couldn't bind socket: " . socket_strerror(socket_last_error()) . "\n"); } if(($error = socket_listen($socket, 5)) < 0){ print("Couldn't list on socket: " . socket_strerror(socket_last_error()) . "\n"); } while(TRUE){ //wait for connection if(($accept = socket_accept($socket)) < 0){ print("Error while reading: " . socket_strerror($message) . "\n"); break; } //send welcome message socket_write($accept, "Connection accepted\n"); print(date('Y-m-d H:i:s') . " STATUS: Connection accepted\n"); ob_flush(); while(TRUE){ //read line from client if(FALSE === ($line = socket_read($accept, 1024))){ print("Couldn't read from socket: " . socket_strerror(socket_last_error()) . "\n"); break 2; } if([url=mailto:!@socket_write($accept]!@socket_write($accept[/url], "ECHO: $line")){ print(date('Y-m-d H:i:s') . " STATUS: Connection interrupted\n"); break; } print(date('Y-m-d H:i:s') . " READ: $line"); ob_flush(); } socket_close($accept); } ?> bool socket_bind(resource socket, string address, integer port) 這個socket_bind()把一個socket資源綁定在一個地址上。這個socket必須由socket_create()函數返回的一個資源。這個地址必須是一個IP地址或者是一個保存Unix socket的路徑。如果是運行在Internet上的socket,你還必須提供一個端口。 socket_clear_error(resource socket) 這個函數能夠清除制定socket的錯誤,如果沒有指定參數,那麽將清除所有socket的錯誤。 socket_close(resource socket) socket_close函數關閉一個socket並且清除該socket所占用的內存資源。 boolean socket_connect(resource socket, string address, integer port) 這個函數創建一個客戶端到一個端口或者socket的連接。你必須提供一個由socket_create産生的socket。這個address參數必須到一個socket的路徑或者是一個IP地址。如果是後者,還必須跟一個數字的端口號。 下面例子演示了使用UDP協議的連接到遊戲服務器然後獲取信息的過程。 socket_connect <?php //create UDP socket if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0){ print("Couldn't create socket: " . socket_strerror(socket_last_error()) . "\n"); } //timeout after 5 seconds socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>5,'usec'=>0)); //connect to the RtCW master server if(!socket_connect($socket, 'wolfmaster.idsoftware.com', 27950)){ print("Couldn't connect: " . socket_strerror(socket_last_error()) . "\n"); } //send request for servers socket_write($socket, "\xFF\xFF\xFF\xFFgetservers\x00"); //get servers $server = array(); while(FALSE !== ($line = @socket_read($socket, 4096))){ //parse data for($i=22; ($i+5) < strlen($line); $i += 7){ $ip = ord(substr($line, $i+1, 1)) . '.' . ord(substr($line, $i+2, 1)) . '.' . ord(substr($line, $i+3, 1)) . '.' . ord(substr($line, $i+4, 1)); $port = (ord(substr($line, $i+5, 1)) * 256) + ord(substr($line, $i+6, 1)); $server[] = array('ip'=>$ip, 'port'=>$port); } } print("<h1>" . count($server) . " Servers</h1>\n"); //loop over servers, getting status foreach($server as $s){ print("<h1>{$s['ip']}:{$s['port']}</h1>\n"); //connect to RtCW server if(!socket_connect($socket, $s['ip'], $s['port'])){ print("<p>\n" . socket_strerror(socket_last_error()) . "\n</p>\n"); continue; } //send request for status socket_write($socket, "\xFF\xFF\xFF\xFFgetstatus\x00"); //get status from server if(FALSE === ($line = @socket_read($socket, 1024))){ print("<p>\n" . socket_strerror(socket_last_error()) . "\n</p>\n"); continue; } $part = explode("\n", $line); //settings are in second line separated by backslashes $setting = explode("\\", $part[1]); print("<h2>Configuration</h2>\n"); print("<p>\n"); for($s=1; $s < count($setting); $s += 2){ print("\t\t{$setting[$s]} = {$setting[$s+1]}<br>\n"); } print("</p>\n"); print("<h2>Players</h2>\n"); $lastPlayer = count($part) - 1; for($p=2; $p < $lastPlayer; $p++){ $player = explode(" ", $part[$p]); print("{$player[2]} Score={$player[0]} " . "Ping={$player[1]}<br>\n"); } print("</p>\n"); ob_flush(); } print("</table>\n"); socket_close($socket); ?> resource socket_create(integer family, integer socket_type, integer protocol) socket_create初始化一個socket的結構。第一個參數是一個protocol family,或者域。你必須使用AF_INET來指定一個Internet連接,或者使用AF_UNIX來指定一個Unix socket連接。第二個參數是一個socket的類型,你可以從下面的表中選擇。一般情況下,使用SOCK_STREAM來使用TCP協議,UDP協議使用SOCK_DGRAM。第三個參數指定爲一個協議。使用SOL_TCP或SOL_UDP來分別對應TCP和UDP協議。還有一個選擇是你能夠使用 getprotobyname函數來處理。 Socket 類型 常量 描述 SOCK_DGRAM 自動尋址數據包socket SOCK_RAW RAW協議接口 SOCK_RDM 可靠交換消息 SOCK_SEQPACKET 順序數據包socket SOCK_STREAM 流socket resource socket_create_listen(integer port, integer backlog) 使用socket_create_listen是一種比socket_create更簡單的産生一個socket進行監聽。這個産生的socket將監聽指定的端口,後面可選的參數backlog是設置允許最大的連接數。 boolean socket_create_pair(integer family, integer socket_type, integer protocol, array handles) socket_create_pair函數産生一對socket連接。首先前三個參數是對一個socket_create的描述,這個handles參數是一個包含兩個socket資源的數組。該函數是對C裏面socketpair函數的封裝。 socket_create_pair <?php if(!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $socket)){ print("Couldn't make sockets!\n"); exit(); } $child = pcntl_fork(); if($child == -1){ print("Couldn't fork!\n"); exit(); } elseif($child > 0){ //parent socket_close($socket[0]); print("Parent: waiting for message\n"); $message = socket_read($socket[1], 1024, PHP_NORMAL_READ); print("Parent: got message--$message\n"); socket_write($socket[1], "Hello, Child Process!\n"); pcntl_waitpid($child, $status); }else{ //child socket_close($socket[1]); socket_write($socket[0], "Hello, Parent Process!\n"); print("Child: waiting for message\n"); $message = socket_read($socket[0], 1024, PHP_NORMAL_READ); print("Child: got message--$message\n"); exit(0); } ?> value socket_get_option(resource socket, integer level, integer option) socket_get_option函數返回一個下表中所列的一個添加值,你必須提供一個由socket_create産生的socket資源和一個等級。這個獲取的socket級別,可以使用SOL_SOCKET來確定這個級別參數。另外,使用協議,比如象SOL_TCP來表示一個TCP協議。這些選項可能是由socket_set_option設置的。 socket_get_options <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); print('SO_BROADCAST: ' . socket_get_option($socket, SOL_SOCKET, SO_BROADCAST) . "<br>\n"); print('SO_DEBUG: ' . socket_get_option($socket, SOL_SOCKET, SO_DEBUG) . "<br>\n"); print('SO_DONTROUTE: ' . socket_get_option($socket, SOL_SOCKET, SO_DONTROUTE) . "<br>\n"); print('SO_ERROR: ' . socket_get_option($socket, SOL_SOCKET, SO_ERROR) . "<br>\n"); print('SO_KEEPALIVE: ' . socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE) . "<br>\n"); print('SO_LINGER: ' . print_r(socket_get_option($socket, SOL_SOCKET, SO_LINGER), TRUE) . "<br>\n"); print('SO_OOBINLINE: ' . socket_get_option($socket, SOL_SOCKET, SO_OOBINLINE) . "<br>\n"); print('SO_RCVBUF: ' . socket_get_option($socket, SOL_SOCKET, SO_RCVBUF) . "<br>\n"); print('SO_RCVLOWAT: ' . socket_get_option($socket, SOL_SOCKET, SO_RCVLOWAT) . "<br>\n"); print('SO_RCVTIMEO: ' . print_r(socket_get_option($socket, SOL_SOCKET, SO_RCVTIMEO), TRUE) . "<br>\n"); print('SO_REUSEADDR: ' . socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR) . "<br>\n"); print('SO_SNDBUF: ' . socket_get_option($socket, SOL_SOCKET, SO_SNDBUF) . "<br>\n"); print('SO_SNDLOWAT: ' . socket_get_option($socket, SOL_SOCKET, SO_SNDLOWAT) . "<br>\n"); print('SO_SNDTIMEO: ' . print_r(socket_get_option($socket, SOL_SOCKET, SO_SNDTIMEO), TRUE) . "<br>\n"); print('SO_TYPE: ' . socket_get_option($socket, SOL_SOCKET, SO_TYPE) . "<br>\n"); ?> Socket選項表 選項 描述 SO_BROADCAST 允許自動尋址的socket發送和接受廣播包 SO_DEBUG 打開socket調試功能,只有root才有權限打開該選項 SO_DONTROUTE 不接受路由包通過網關 SO_ERROR 獲取並且清除最後一次的socket錯誤,這個選項也許不用設置 SO_KEEPALIVE 打開保持激活狀態的消息 SO_LINGER Socket_colse和socket_shutdown的中止消息發送超時,該選項使用一個數組,包括l_onoff和l_linger兩個鍵。 SO_OOBINLINE 把數據直接插入到接受緩沖 SO_RCVBUF 限制接受緩沖的最大字節 SO_RCVLOWAT 延遲通過接受一個最小的數據 SO_RCVTIMEO 延遲報告一個接受超時報告,使用數組的兩個鍵:sec和usec SO_REUSEADDR 允許重新使用本地地址 SO_SNDBUF 限制發送緩沖的最大字節 SO_SNDLOWAT 延遲發送數據到這個協議當接受一個最小的字節 SO_SNDTIMEO 延遲報告超時錯誤,當發送發送通過一個時間。該選項使用數組的鍵值:sec和usec SO_TYPE 獲取socket的類型,該選項可能不用設置 boolean socket_getpeername(resource socket, string address, integer port) socket_getpeername從指定的一個連接中獲取地址和端口。如果連接爲Unix socket,那麽將返回文件系統的路徑。 boolean socket_getsockname(resource socket, string address, integer port) socket_getsockname放置一個名字到socket中,並且加上address和port參數。失敗返回false。 (下面的socket_iovec_* 函數不太了解,不敢亂翻譯,保留原文) boolean socket_iovec_add(resource iovector, integer length) The socket_iovec_add unction adds an I/O vector to the scatter/gather array. resource socket_iovec_alloc(integer count, …) The socket_iovec_alloc function returns a resource for handling a collection of I/O vectors. The first argument specifies the number of vectors. Following arguments specify the length of each vector. boolean socket_iovec_delete(resource iovector, integer position) The socket_iovec_delete function removes the I/O vector at the given position. string socket_iovec_fetch(resource iovector, integer position) The socket_iovec_fetch function returns the value of the specified vector in the I/O vector resource. boolean socket_iovec_free(resource iovector) The socket_iovec_free function frees the memory used for an I/O vector resource. boolean socket_iovec_set(resource iovector, integer position, string value) The socket_iovec_set sets the value of I/O vector at the given position. integer socket_last_error(resource socket) socket_last_error函數返回操作中的任何socket函數産生的最後錯誤。你也許在上面函數中設置了socket資源的 socket選項在指定的連接上。下面的表列出了返回的錯誤代碼,你同樣可以使用soclet_strerror函數來獲取詳細的錯誤。使用 socket_clear_error函數清除socket的錯誤。 Socket錯誤代碼表 常量 描述 SOCKET_E2BIG 參數列表太長 SOCKET_EACCES 沒有許可權限 SOCKET_EADDRINUSE 地址已經被使用 SOCKET_EADDRNOTAVAIL 不能解析請求的地址 SOCKET_EADV 廣播(廣告)錯誤 SOCKET_EAFNOSUPPORT Address family不支持的協議 SOCKET_EAGAIN 資源暫時不能獲得 SOCKET_EALREADY 操作已經在執行 SOCKET_EBADE 無效的交換 SOCKET_EBADF 錯誤的文件描述符 SOCKET_EBADFD 文件描述符錯誤的狀態 SOCKET_EBADMSG 錯誤的消息 SOCKET_EBADR 無效的請求描述 SOCKET_EBADRQC 無效的請求代碼 SOCKET_EBADSLT 無效的操作位置 SOCKET_EBUSY 驅動或資源繁忙 SOCKET_ECHRNG 信道號碼超出範圍 SOCKET_ECOMM 發送通訊錯誤 SOCKET_ECONNABORTED 軟件原因導致通行中斷 SOCKET_ECONNREFUSED 連接被拒絕 SOCKET_ECONNRESET 連接被相同的socket重置 SOCKET_EDESTADDRREQ 必須需要目標地址 SOCKET_EDQUOT 超出磁盤配額 SOCKET_EEXIST 文件已存在 SOCKET_EFAULT 錯誤的地址 SOCKET_EHOSTDOWN 主機已關閉 SOCKET_EHOSTUNREACH 沒有路由到主機 SOCKET_EIDRM 表示ID被刪除 SOCKET_EINPROGRESS 操作正在執行 SOCKET_EINTR 系統調用被阻止 SOCKET_EINVAL 無效的參數 SOCKET_EIO 輸入/ 輸出錯誤 SOCKET_EISCONN 傳輸終端已經連接 SOCKET_EISDIR 是一個目錄 SOCKET_EISNAM 是一個指定的類型文件 SOCKET_EL2HLT 級別2已中止 SOCKET_EL2NSYNC 級別2不同步 SOCKET_EL3HLT 級別3已中止 SOCKET_EL3RST 級別3被重置 SOCKET_ELNRNG 連接號超出範圍 SOCKET_ELOOP 太多級別的符號連接 SOCKET_EMEDIUMTYPE 錯誤的媒介類型(中間類型) SOCKET_EMFILE 太多打開的文件 SOCKET_EMLINK 太多的連接 SOCKET_EMSGSIZE 消息太長 SOCKET_EMULTIHOP 嘗試次數太多 SOCKET_ENAMETOOLONG 文件名太長 SOCKET_ENETDOWN 網絡已關閉 SOCKET_ENETRESET 網絡中斷,連接被重置 SOCKET_ENETUNREACH網絡不可達 SOCKET_ENFILE 系統中太多打開的文件 SOCKET_ENOANO 沒有正極 SOCKET_ENOBUFS 沒有可用的緩存空間 SOCKET_ENOCSI 沒有可用的CSI結構 SOCKET_ENODATA 沒有可用的數據 SOCKET_ENODEV 沒有這樣的驅動 SOCKET_ENOENT 沒有這樣的文件或目錄 SOCKET_ENOLCK 沒有可用的記錄鎖 SOCKET_ENOLINK 已經有的服務的連接 SOCKET_ENOMEDIUM 沒有媒介被找到 SOCKET_ENOMEM 不能分配內存 SOCKET_ENOMSG 沒有指定的消息類型 SOCKET_ENONET 設備不在網絡上 SOCKET_ENOPROTOOPT 協議不可用 SOCKET_ENOSPC 沒有空間在驅動器 SOCKET_ENOSR 超出的流資源 SOCKET_ENOSTR 驅動不是一個流 SOCKET_ENOSYS 函數沒有執行 SOCKET_ENOTBLK 塊驅動是必須的 SOCKET_ENOTCONN 傳輸終端沒有連接 SOCKET_ENOTDIR 沒有一個目錄 SOCKET_ENOTEMPTY 目錄爲空 SOCKET_ENOTSOCK Socket操作在一個非socket上 SOCKET_ENOTTY 不相符的IO控制器 SOCKET_ENOTUNIQ 在網絡上名字不是唯一的 SOCKET_ENXIO 沒有這樣的驅動或地址 SOCKET_EOPNOTSUPP 操作不支持 SOCKET_EPERM 操作不允許 SOCKET_EPFNOSUPPORT Protocol family不支持 SOCKET_EPIPE 失敗的管道 SOCKET_EPROTO 協議錯誤 SOCKET_EPROTONOSUPPORT 協議不支持 SOCKET_EPROTOTYPE Socket上協議錯誤的類型 SOCKET_EREMCHG 遠程地址已改變 SOCKET_EREMOTE 對象是遠程的 SOCKET_EREMOTEIO 遠程I/O錯誤 SOCKET_ERESTART 中斷的系統調用將要重新開始 SOCKET_EROFS 文件系統爲只讀 SOCKET_ESHUTDOWN. 傳輸端點中斷不能發送 SOCKET_ESOCKTNOSUPPORT Socket類型不支持 SOCKET_ESPIPE 不合法的檢索 SOCKET_ESTRPIPE 流管道錯誤 SOCKET_ETIME 定時器到時 SOCKET_ETIMEDOUT 連接超時 SOCKET_ETOOMANYREFS 太多連接無法結合 SOCKET_EUNATCH 無法附加協議驅動 SOCKET_EUSERS 太多用戶 SOCKET_EWOULDBLOCK 資源暫時無法獲得 SOCKET_EXDEV 無效的交叉驅動連接 SOCKET_EXFULL 交換已滿 boolean socket_listen(resource socket, integer backlog) 這個socket_listen函數等待從客戶端過來的連接,backlog參數設置允許最多等待連接的隊列數。 string socket_read(resource socket, integer length, integer type) socket_read函數從特定的socket中讀取指定的字節,如果錯誤返回false。缺省下,是采用二進制安全的讀取模式。你可以外在的設置type參數爲PHP_BINARY_READ來改變讀取模式。你也可以把type設置爲PHP_NORMAL_READ。 boolean socket_readv(resource socket, resource iovector) socket_readv函數把讀取的數據插入到iovector資源中。 integer socket_recv(resource socket, string buffer, integer length, integer flags) socket_recv函數讀取數據插入到緩沖中。Length參數設置最多讀取的字節數,flag參數可以使用MSG_OOB或MSG_PEEK。函數返回讀取的字節數。 integer socket_recvfrom(resource socket, string buffer, integer length, string host, integer port) socket_frcvfrom函數讀取數據插入到緩存中。Length參數設置獲取最多允許接受的字節數。設置flags參數可以爲MSG_OOB 或 MSG_PEEK。PHP設置主機和端口參數適當的值能夠獲取從主機發出的數據。 boolean socket_recvmsg(resource socket, resource iovector, array control, integer length, integer flags, string host, integer port) socket_recvmsg函數從socket中讀取數據並且插入到一個I/O向量資源中。PHP設置control參數是一個具有三個元素的聯合數組:cmsg_level, cmsg_type, 和 cmsg_data。Length參數是一個附加在數據中的關于獲取數據的長度參數。Flags參數是設置允許值和返回值。在寫的時間,PHP無法執行所有的輸出常量。PHP設置host和port參數適當的值是爲了獲取從遠程主機中發送的數據。 (Socket_slect函數沒有翻譯,因爲怕詞不達意) integer socket_select(array read, array write, array exception, integer timeout_seconds, integer timeout_microseconds) The socket_select function waits for changes to sockets. PHP watches the sockets given in the read array for new data coming in. PHP watches the streams given in the write array for being ready to accept more data. PHP watches the streams given in the exception argument for errors. If the number of seconds specified in the timeout_seconds argument passes, the function returns. Use the optional timeout_microseconds argument to specify a timeout less than 1 second. The socket_select function returns the number of sockets that changed or FALSE if an error occurred. If the call timed out, this function returns zero. It also modifies the given arrays so that they include only those sockets that changed. If you have no sockets of a particular type to watch, you may pass an empty array or a variable set to NULL. integer socket_send(resource socket, string buffer, integer length, integer flags) socket_send函數把寫數據到緩沖中,然後插入到連接中。你必須指定一個緩沖最大可寫字節數。你同樣可以設置flags參數爲空,或者爲下面聯合常量中的一個:MSG_DONTROUTE和 MSG_OOB。函數結束返回已經寫的字節數,失敗返回false。 boolean socket_sendmsg(resource socket, resource iovector, integer flags, string address, integer port) socket_sendmsg嘗試發送數據到一個socket。它適合無連接的socket。Iovector參數是一個通過 socket_iovec_alloc函數産生的資源。你必須指定flags參數爲:NULL, MSG_DONTROUTE, MSG_OOB,或者是兩個聯合常量。你應當指定一個地址和一個Internet請求的端口。 Socket_sendmsg函數發送數據返回true,但是不能保證數據一定到達。 integer socket_sendto(resource socket, string buffer, integer length, integer flags, string address, integer port) socket_sendto函數嘗試寫數據到buffer緩沖中,並且發送給一個socket。它適合大部分無連接的socket。你必須指定 flags爲:NULL,MSG_DONTROUTE,MSG_OOB或者是一個兩個聯合常量。你還應但指定地址和一個請求的端口。 Socket_sendto函數數據發送出去返回true,但是不能保證數據一定到達。 boolean socket_set_block(resource socket) socket_set_block函數設置socket插入到一個塊模式中,這是缺省模式。在塊模式中,I/O操作正對于一個完成的請求。 boolean socket_set_nonblock(resource socket) socket_set_nonblock函數設置socket插入到意個非塊模式中。在非塊模式中,I/O操作馬上返回,即使沒有數據。 boolean socket_set_option(resource socket, integer level, integer option, integer value) socket_set_option函數給socket設置一個選項。Level參數設置一個標志級別的常量。有效的值包括:SOL_SOCKET, SOL_TCP和SOL_UDP。Option參數必須匹配文章上面的Socket選項表中的常量。 boolean socket_shutdown(resource socket, integer how) socket_shutdown函數關閉一個關于I/O的socket。設置how爲0則中止接受數據,設置爲1則停止發送數據,設置爲2則中止二者操作。 string socket_strerror(integer error) socket_strerror函數返回一個錯誤號的詳細錯誤信息。 integer socket_write(resource socket, string buffer, integer length) socket_write函數寫數據到buffer緩沖中然後輸出到socket中。你可以指定length參數來指定緩沖的最大字節數。這個函數通常情況下比socket_send更方便。 boolean socket_writev(resource socket, resource iovector) socket_writev函數通過I/O向量寫數據到一個socket中。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
小龍女彤彤之情溢皇都
龔潔
智能手機形象美女
崔潔彤
回家的路上----
中國一站(哈爾濱)
清明植物園的花。
桃花堤印象之豎版
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有