- 论坛徽章:
- 0
|
代码如下
- $address = "192.168.10.10";
- $port = 8082;
- do
- {
- if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)
- {
- echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\r\n";
- }
- //socket_set_option($sock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>10, "usec"=>0)); //set read data timeout
- if (socket_bind($sock, $address, $port) === false)
- {
- echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\r\n";
- socket_close($sock);
- sleep(10);
- continue;
- }
-
- if (socket_listen($sock, 1) === false)
- {
- echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\r\n";
- socket_close($sock);
- sleep(10);
- continue;
- }
- echo "Server started, accepting connections...\r\n";
- //$read = array($sock);
- //$write = NULL;
- //$except = NULL;
- //$num_changed_sockets = socket_select($read, $write, $except, 5);
-
- do
- {
- if (($msgsock = socket_accept($sock)) === false)
- {
- echo $str=date('Y-m-d H:i:s')."socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\r\n";
- write_log($str,$argv[1]);
- sleep(5);
- continue;
- }
- $read = array($msgsock);
- $write = NULL;
- $except = NULL;
- //socket_set_option($msgsock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0)); //set read data timeout
- if (socket_select($read, $write = NULL, $except = NULL,10,0) < 1)
- {
- echo "timeout!\r\n";
- socket_close($msgsock);
- continue;
- }
- @socket_getpeername($msgsock,$remote_host,$remote_port);
- echo $str=date('Y-m-d H:i:s ')."Hello $remote_host:$remote_port! had connected! \r\n";
- write_log($str,$argv[1]);
- /* Send instructions. */
- $msg = "\nWelcome to the PHP Test Server. \n" ."To quit, type 'quit'. To shut down the server type 'shutdown'.\r\n";
- socket_write($msgsock, $msg, strlen($msg));
-
- do
- {
- socket_set_option($msgsock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
- if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ)))
- {
- echo $str=date('Y-m-d H:i:s')."socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\r\n";
- write_log($str,$argv[1]);
- //socket_close($msgsock);
- break ;
- }
- if (!$buf = trim($buf))
- {
- continue;
- }
- if ($buf == 'quit')
- {
- break;
- }
- if ($buf == 'shutdown')
- {
- socket_close($msgsock);
- break 2;
- }
- $talkback = "PHP: You said '$buf'.\n";
- socket_write($msgsock, $talkback, strlen($talkback));
- echo "$buf\n";
- } while (true);
- socket_close($msgsock);
- } while (true);
-
- socket_close($sock);
- } while (true);
复制代码
当客户端没有数据发送时,如何做到下面这一句超时呢?
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ)))
试过用以下两个方法,都不理想:
if (socket_select($read, $write = NULL, $except = NULL,10,0) < 1)
socket_set_option($msgsock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
而当是以下这种方式时,就OK.
- $address = "192.168.10.10";
- $port = 8082;
- while (true)
- {
- /* Create a TCP/IP socket. */
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>300, "usec"=>0)); //set no data read timeout
-
- if ($socket === false)
- {
- echo $str=date('Y-m-d H:i:s')." socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\r\n";
- //write_log($str,$argv[1]);
- }
- else
- {
- echo $str=date('Y-m-d H:i:s')." socket successfully created.\r\n";
- //write_log($str,$argv[1]);
- }
-
- echo "Attempting to connect to '$address' on port '$port'...";
- $result = socket_connect($socket, $address, $port);
- if ($result === false)
- {
- echo $str=date('Y-m-d H:i:s')." socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\r\n";
- write_log($str,$argv[1]);
- sleep(10); //set reconnect time
- continue;
- }
- else
- {
- echo $str=date('Y-m-d H:i:s')." successfully connected to $address.\r\n";
- write_log($str,$argv[1]);
- }
-
- //*************************************************** read line write to mysql database **********************
- $i = 0;
- while (true == true)
- {
- $i++;
- // echo "Sending $i to server.\n";
- // socket_write($socket, $i, strlen($i));
- $input = socket_read($socket, 2048);
- if ($input===false)
- {
- break;
- }
- else
- {
- data_to_mysql($input,$argv[1]);
- }
- // write_bad($input,$argv[1]);
- echo "Response from server is: $input\n";
- // if ($i>10) exit();
- //sleep(5);
- }
- //sleep(5);
- }
- echo "Closing socket...";
- socket_close($socket);
复制代码
[ 本帖最后由 flyingnn 于 2008-12-26 15:48 编辑 ] |
|