青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2015年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 220944
  • 排名 - 117

最新評論

閱讀排行榜

stream_socket_server

http://php.net/manual/zh/function.stream-socket-server.php

(PHP 5, PHP 7)

stream_socket_server — Create an Internet or Unix domain server socket

說明

resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )

Creates a stream or datagram socket on the specified local_socket.

This function only creates a socket, to begin accepting connections use stream_socket_accept().

參數

local_socket

The type of socket created is determined by the transport specified using standard URL formatting: transport://target.

For Internet Domain sockets (AF_INET) such as TCP and UDP, the target portion of the remote_socket parameter should consist of a hostname or IP address followed by a colon and a port number. For Unix domain sockets, the target portion should point to the socket file on the filesystem.

Depending on the environment, Unix domain sockets may not be available. A list of available transports can be retrieved usingstream_get_transports(). See 所支持的套接字傳輸器(Socket Transports)列表 for a list of bulitin transports.

errno

If the optional errno and errstr arguments are present they will be set to indicate the actual system level error that occurred in the system-level socket()bind(), and listen() calls. If the value returned in errno is 0 and the function returned FALSE, it is an indication that the error occurred before the bind() call. This is most likely due to a problem initializing the socket. Note that the errno anderrstr arguments will always be passed by reference.

errstr

See errno description.

flags

A bitmask field which may be set to any combination of socket creation flags.

Note:

For UDP sockets, you must use STREAM_SERVER_BIND as the flags parameter.

context

返回值

Returns the created stream, or FALSE on error.

范例

Example #1 Using TCP server sockets

<?php
$socket 
stream_socket_server("tcp://0.0.0.0:8000"$errno$errstr);
if (!
$socket) {
  echo 
"$errstr ($errno)<br />\n";
} else {
  while (
$conn stream_socket_accept($socket)) {
    
fwrite($conn'The local time is ' date('n/j/Y g:i a') . "\n");
    
fclose($conn);
  }
  
fclose($socket);
}
?>

The example below shows how to act as a time server which can respond to time queries as shown in an example on stream_socket_client().

Note: Most systems require root access to create a server socket on a port below 1024.

Example #2 Using UDP server sockets

<?php
$socket 
stream_socket_server("udp://127.0.0.1:1113"$errno$errstrSTREAM_SERVER_BIND);
if (!
$socket) {
    die(
"$errstr ($errno)");
}

do {
    
$pkt stream_socket_recvfrom($socket10$peer);
    echo 
"$peer\n";
    
stream_socket_sendto($socketdate("D M j H:i:s Y\r\n"), 0$peer);
} while (
$pkt !== false);

?>

注釋

Note: 當指定數值型的 IPv6 地址(例如 fe80::1)時必須用方括號將 IP 圍起來——例如, tcp://[fe80::1]:80

參見

add a note add a note

User Contributed Notes 8 notes

davidm at marketo dot com ¶
6 years ago
In some specialized scenarios, you may want to create an AF_INET socket (UDP or TCP) but let the system select an unused port for you.  This is a standard feature of internet sockets but it doesn't seem to be documented how to do this for the stream_socket_server function.  It appears you can get this behavior by selecting zero for the port number, for example, my test below printed "127.0.0.1:4960". 

<?php 
  $sock 
stream_socket_server("udp://127.0.0.1:0"); 
  
$name stream_socket_get_name($sock); 
  echo 
$name
?>
blackmac01 at gmail dot com ¶
8 months ago
I'm writing an HTTP server and I need SSL support, but getting this to work correctly with PHP streams took a bit of trial and error. For anyone who is trying to get an HTTP SSL server working with stream_socket_server:

1) Your SSL context will need to contain 'local_cert'. If  you did not include your private key with your local_cert, you'll also need to specify 'local_pk' which is your RSA key.  Your keys and certs should be PEM encoded, which means base-64. If your certificate has intermediary certs, you will need to specify those in the correct order: Your signed cert, intermediary cert 1, intermediary cert 2, etc. Each cert in the list needs to validate the one above it, but you do not need to include the CA Root that your SSL signer provided; that should already be included with the client's software (i.e. trust root certs).

You can append your private key in the file with your certs, however I keep mine in its own file. If you see the word "encrypted" when you view your key with a text viewer, you need to enter the correct passphrase and specify the context "passphrase", otherwise you can leave that one out.

As a server, verify_peer is irrelevant and should be set to false (should always be true if you are acting as an SSL client). Both cafile and capath contexts are not needed for functioning as a SSL/TLS server, but they are needed if you are making SSL connections with PHP as the client.

Lastly, the 'ciphers' context should be set to a list of secure ciphers. Search for "mozilla recommended ciphers" and choose the string of ciphers that works for you, because not all openssl supported ciphers are secure. I went with the "intermediate" list, which provides high security and compatibility.

2) When you create the binding for stream_socket_server(), make sure that you choose the tcp:// wrapper. DO NOT USE ssl:// or tls://. Anything other than tcp:// will not work correctly AS A SERVER, those transports are what you use when making connections with PHP as a client. 

Remember that the encryption does not start until after an SSL handshake completes, so the server has to listen in non-encrypted mode for new connections, and encryption doesn't start until certs are exchanged and a cipher is selected. When a new connection arrives you accept it with stream_socket_accept() and then use stream_socket_enable_crypto() to start the SSL session.

3) Keep in mind that the SSL handshake takes time, and that the stream_socket wrappers are high level and not as responsive as the socket extension due to the additional overhead they incur. For this reason you will need to enable blocking for accepting new connections.

<enable blocking on ServerListenStream>
newConnStream = stream_socket_accept(ServerListenStream);
<disable blocking on ServerListenStream>

<enable blocking on newConnStream >
stream_socket_enable_crypto(newConnStream, true, STREAM_CRYPTO_METHOD_SSLv23_SERVER);
<disable blocking on newConnStream >

Note that this is mainly for HTTP. If you are trying to do something like SMTP then your script will have to react to the "starttls" command, but it would be similar to the above except that you would wait for the "starttls" command before invoking the  stream_socket_enable_crypto() function on the client's stream.

TLS 1.0 is generally the way to go, SSLv3 is insecure and SSLv2 is buggy. If you use the mozilla recommend cipher list in your context, you'll be fine. Hope this helps someone out!
andrey at php dot net ¶
12 years ago
Just a small example how to use this function and also stream_select() to make a server that accepts more than one connections (can have many clients connected):
In master we hold all opened connections. Just before calling stream select we copy the array to $read and then pass it ot stream_select(). In case that we may read from at least one socket, $read will contain socket descriptors. $master is needed not to lose references to the opened connections we have.
stream_server.php : 
<?php

$master 
= array();
$socket stream_socket_server("tcp://0.0.0.0:8000"$errno$errstr);
if (!
$socket) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
$master[] = $socket;
    
$read $master;
    while (
1) {
        
$read $master;
        
$mod_fd stream_select($read$_w NULL$_e NULL5);
        if (
$mod_fd === FALSE) {
            break;
        }
        for (
$i 0$i $mod_fd; ++$i) {
            if (
$read[$i] === $socket) {
                
$conn stream_socket_accept($socket);
                
fwrite($conn"Hello! The time is ".date("n/j/Y g:i a")."\n");
                
$master[] = $conn;
            } else {
                
$sock_data fread($read[$i], 1024);
                
var_dump($sock_data);
                if (
strlen($sock_data) === 0) { // connection closed
                    
$key_to_del array_search($read[$i], $masterTRUE);
                    
fclose($read[$i]);
                    unset(
$master[$key_to_del]);
                } else if (
$sock_data === FALSE) {
                    echo 
"Something bad happened";
                    
$key_to_del array_search($read[$i], $masterTRUE);
                    unset(
$master[$key_to_del]);
                } else {
                    echo 
"The client has sent :"var_dump($sock_data);
                    
fwrite($read[$i], "You have sent :[".$sock_data."]\n");
                    
fclose($read[$i]);
                     unset(
$master[array_search($read[$i], $master)]);
                }
            }
        }
    }
}
?>
stream_client.php:
<?php
$fp 
stream_socket_client("tcp://127.0.0.1:8000"$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
fwrite($fp"Aloha");
    while (!
feof($fp)) {
        
var_dump(fgets($fp1024));
    }
    
fclose($fp);
}
?>

Thanks
frxstrem ¶
6 years ago
Using the OpenSSL extension, PHP can automatically generate self-signed SSL certificates, which can be used for basic authentication and encryption (although I would recommend to use a signed certificate instead) for SSL servers.

I have extended the script by 'e at osterman dot com' to automatically create self-signed certificates:

<?php
// Hello World! SSL HTTP Server.
// Tested on PHP 5.1.2-1+b1 (cli) (built: Mar 20 2006 04:17:24)

// Certificate data:
$dn = array(
    
"countryName" => "UK",
    
"stateOrProvinceName" => "Somerset",
    
"localityName" => "Glastonbury",
    
"organizationName" => "The Brain Room Limited",
    
"organizationalUnitName" => "PHP Documentation Team",
    
"commonName" => "Wez Furlong",
    
"emailAddress" => "wez@example.com"
);

// Generate certificate
$privkey openssl_pkey_new();
$cert    openssl_csr_new($dn$privkey);
$cert    openssl_csr_sign($certnull$privkey365);

// Generate PEM file
# Optionally change the passphrase from 'comet' to whatever you want, or leave it empty for no passphrase
$pem_passphrase 'comet';
$pem = array();
openssl_x509_export($cert$pem[0]);
openssl_pkey_export($privkey$pem[1], $pem_passphrase);
$pem implode($pem);

// Save PEM file
$pemfile './server.pem';
file_put_contents($pemfile$pem);

$context stream_context_create();

// local_cert must be in PEM format
stream_context_set_option($context'ssl''local_cert'$pemfile);
// Pass Phrase (password) of private key
stream_context_set_option($context'ssl''passphrase'$pem_passphrase);

stream_context_set_option($context'ssl''allow_self_signed'true);
stream_context_set_option($context'ssl''verify_peer'false);

// Create the server socket
$server stream_socket_server('ssl://0.0.0.0:9001'$errno$errstrSTREAM_SERVER_BIND|STREAM_SERVER_LISTEN$context);

while(
true)
{
    
$buffer '';
    print 
"waiting...";
    
$client stream_socket_accept($server);
    print 
"accepted " stream_socket_get_name$clienttrue) . "\n";
    if( 
$client )
    {
        
// Read until double CRLF
        
while( !preg_match('/\r?\n\r?\n/'$buffer) )
            
$buffer .= fread($client2046); 
        
// Respond to client
        
fwrite($client,  "200 OK HTTP/1.1\r\n"
                         
"Connection: close\r\n"
                         
"Content-Type: text/html\r\n"
                         
"\r\n"
                         
"Hello World! " microtime(true)
                         . 
"<pre>{$buffer}</pre>");
        
fclose($client);
    } else {
        print 
"error.\n";
    }
}

?>
Aurelien Marchand ¶
5 years ago
In the case of AF_UNIX sockets, note the named sockets that will be created respects your umask(). So if you wanted your named socket to be writeable to all, do umask(0) prior to calling stream_socket_server().

AM
peterjb at me dot com ¶
6 years ago
I had a horrible time trying to shove a TLS socket into an existing TCP program.  It appears to me that functions like stream_socket_recvfrom and stream_socket_sendto don't work with TLS/SSL (which may be obvious to PHP gurus...sorry if it is, I'm in a bit over my head here).

In the end I ended up doing all my IO with fread() and fwrite(), which solved all my problems.
Neil Munro ¶
10 years ago
If you want a high speed socket server, use the low-level sockets instead (socket_create/bind/listen). The stream_socket_server version appears to have internal fixed 8k buffers that will overflow if you don't keep up by reading.

This is a serious problem if you an application that reads the socket for messages and then, say, saves the result in a database. The delay while it is busy processing means you can't read the data in time unless you get involved in muti-threading.

With the the low-level functions, the OS quietly buffers TCP/IP packets so there is no problem (tested on Windows XP Professional).
Julien Picalausa ¶
7 years ago
You may have noticed that, unlike socket_listen, stream_socket_server doesn't have a backlog parameter. From the source code of php 5.2.9, it looks like the backlog parameter to the actual listen call is hardcoded to be 5. If this value doesn't suit your needs, you'll have to use the lower-level socket functions.
posted on 2016-08-29 16:28 思月行云 閱讀(645) 評論(0)  編輯 收藏 引用 所屬分類: PHP
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老巨人导航500精品| 久久久久.com| 亚洲乱码国产乱码精品精天堂 | 久久精品国产精品亚洲综合| 亚洲国产精品久久久| 亚洲图片自拍偷拍| 亚洲尤物精选| 性久久久久久久久久久久| 一区二区三区日韩欧美精品| 亚洲片国产一区一级在线观看| 国产精品羞羞答答| 国产一区二区欧美| 国产一区二区三区高清在线观看| 国产欧美日本| 精品盗摄一区二区三区| 亚洲精华国产欧美| 亚洲视频综合| 美国成人直播| 9i看片成人免费高清| 国内精品免费午夜毛片| 精久久久久久| 亚洲一区二区三区精品动漫| 欧美一区二区三区日韩| 亚洲精选中文字幕| 久久亚洲一区| 精品不卡视频| 久久精品国产精品亚洲精品| 亚洲精品久久视频| 久久久久高清| 国产一区二区三区视频在线观看| 99热免费精品在线观看| 久久久www免费人成黑人精品| 欧美黄色影院| 久久精品国产一区二区三区免费看 | 精品成人在线视频| 亚洲欧美在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 久久一区二区三区国产精品 | 夜夜嗨av一区二区三区中文字幕| 亚洲欧美视频一区| 国产精品久久久久9999高清| 欧美综合二区| 影院欧美亚洲| 欧美激情片在线观看| 欧美福利视频在线观看| 亚洲黄一区二区三区| 欧美激情第8页| 欧美日韩高清一区| 亚洲女ⅴideoshd黑人| 亚洲婷婷国产精品电影人久久| 欧美a级片网站| 亚洲少妇在线| 久久大综合网| 99国产精品私拍| 欧美中日韩免费视频| 最新成人在线| 性久久久久久久| 亚洲卡通欧美制服中文| 野花国产精品入口| 亚洲电影视频在线| 亚洲免费在线播放| 亚洲人成亚洲人成在线观看| 99亚洲视频| 亚洲精品欧美精品| 久久xxxx| 欧美一区二区观看视频| 欧美成人一区二区三区在线观看| 亚洲网站在线看| 欧美激情综合色综合啪啪| 午夜一区二区三区不卡视频| 亚洲欧美在线aaa| 午夜精品福利在线| 欧美巨乳在线| 亚洲高清自拍| 国产一区日韩一区| 这里只有精品视频| av不卡在线| 老司机精品福利视频| 欧美无乱码久久久免费午夜一区| 欧美一级在线视频| 欧美大秀在线观看| 久久这里只有精品视频首页| 欧美午夜片在线观看| 日韩亚洲欧美在线观看| 在线精品视频免费观看 | 一本一本久久a久久精品综合妖精| 久久成人精品电影| 欧美成人自拍| 亚洲伊人一本大道中文字幕| 国产视频在线观看一区| 久久人人97超碰精品888| 亚洲黄色有码视频| 亚洲一区二区网站| 亚洲国产精品一区二区www在线| 欧美激情一区二区三区在线视频观看| 亚洲精品亚洲人成人网| 中日韩美女免费视频网站在线观看| 欧美人与禽猛交乱配视频| 日韩一级不卡| 欧美xxxx在线观看| 欧美专区中文字幕| 一区二区三区欧美在线| 狠狠久久综合婷婷不卡| 欧美天堂亚洲电影院在线播放| 亚洲免费视频观看| 亚洲国产女人aaa毛片在线| 久久久999精品免费| 亚洲天堂网在线观看| 亚洲人体1000| 亚洲精品一区二区三区不| 精品白丝av| 亚洲风情在线资源站| 国产精品一页| 国产欧美一区二区精品仙草咪 | 欧美大片免费| 欧美在线视频一区| 久久精品女人的天堂av| 亚洲午夜电影网| 亚洲欧美日韩国产精品 | 久久天天综合| 欧美一区二区在线看| 香港久久久电影| 性久久久久久久| 久久精品国产99精品国产亚洲性色| 亚洲欧美经典视频| 久久久欧美一区二区| 久热爱精品视频线路一| 亚洲国产精品久久精品怡红院| 欧美暴力喷水在线| 亚洲精品极品| 午夜精品在线观看| 免费在线一区二区| 国产精品网站在线观看| 一区二区视频免费在线观看 | 蜜臀av国产精品久久久久| 欧美阿v一级看视频| 欧美日韩一级视频| 国内精品**久久毛片app| 日韩视频第一页| 免费av成人在线| 午夜精品福利电影| 欧美日韩精品一二三区| 国产最新精品精品你懂的| 99热精品在线| 欧美成人免费在线视频| 夜夜嗨av一区二区三区网页 | 午夜在线精品偷拍| 欧美伦理视频网站| 最新高清无码专区| 久久久久在线观看| 欧美一级免费视频| 亚洲电影免费在线| 这里是久久伊人| 欧美日韩亚洲综合一区| 亚洲美女视频在线观看| 女女同性精品视频| 久久米奇亚洲| 91久久精品久久国产性色也91| 久久av二区| 久久久久亚洲综合| 亚洲国产天堂久久综合网| 欧美成人dvd在线视频| 久久精品一区二区三区中文字幕| 国产精品视频免费一区| 午夜精品在线观看| 亚洲欧美日韩中文视频| 影音先锋成人资源站| 免费欧美高清视频| 欧美国产日韩一区二区| 一本色道久久综合狠狠躁篇的优点 | 久久成人精品无人区| 亚洲午夜av电影| 亚洲国产综合91精品麻豆| 欧美激情一区二区三区成人| 欧美激情精品久久久六区热门 | 开元免费观看欧美电视剧网站| 亚洲电影免费观看高清| 亚洲精选成人| 在线日韩日本国产亚洲| 亚洲国产午夜| 国产精品免费一区二区三区在线观看| 欧美在线免费| 猫咪成人在线观看| 久久久噜噜噜久噜久久| 欧美日韩国产系列| 国产精品xxxxx| 久久久久久久网| 欧美日韩高清在线| 日韩一区二区精品| 亚洲最快最全在线视频| 久久精品国产亚洲一区二区三区| 亚洲一区二区三区三| 欧美大片免费观看| 亚洲国产精品悠悠久久琪琪| 国产一区二区三区在线观看免费| 在线视频一区观看| 亚洲综合首页| 国产日韩一区| 久久久精品国产99久久精品芒果| 久久精品在线观看|