php模拟socket 多次发送数据的实现方法
表四: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 //post.php function Post($host, $port) { //$host="127.0.0.1"; //建立连接 $conn = fsockopen($host, $port); if (!$conn) { die("Con error"); } //循环发送5次数据 // for ($i = 0; $i < 5; $i++) { $data = "user_name=admin" . $i; WriteData($conn, $host, $data); echo $i . "<br />"; } fclose($conn); } function WriteData($conn, $host, $data) { $header = "POST /test.php HTTP/1.1rn"; $header.= "Host : {$host}rn"; $header.= "Content-type: application/x-www-form-urlencodedrn"; $header.= "Content-Length:" . strlen($data) . "rn"; //Keep-Alive是关键 $header.= "Connection: Keep-Alivernrn"; $header.= "{$data}rnrn"; fwrite($conn, $header); //取结果 //$result = ''; //while(!feof($conn)) //{ // $result .= fgets($conn,128); //} //return $result; } Post('127.0.0.1', 80); ?>
<?php //test.php $fp = fopen('result.txt', 'a'); $data = $_POST['user_name'] . " -- " . date('Y-m-d H:i:s') . "rn"; fwrite($fp, $data); fclose($fp); ?>
再模仿post实现用户登录
socket.php
<?php /** * @author macopad@qq.com * 模拟socket发送post方式发送数据 * 发送文件为socket.php * 接收数据为get_socket.php * @var unknown_type */ $flag = 0; //要post的数据 $argv = array( ‘username'=>'macopad@qq . com', ‘password' => 'macopad' ); //构造要 post的字符串 $params = ""; foreach ($argv as $key => $value) { if ($flag != 0) { $params.= "&"; $flag = 1; } $params.= $key . "="; $params.= urlencode($value); $flag = 1; } $length = strlen($params); //post的长度 //创建socket连接 $post = fsockopen($HTTP_SERVER_VARS["SERVER_ADDR"], 80, $errno, $errstr, 10) or exit($errstr . "—>" . $errno); //构造post请求的头 $header = "POST /guojinyong/test/get_socket.php HTTP/1.1rn"; //制定为 POST的方法提交数据 及要提交到的页面和协议类型 $header.= "Host:" . $HTTP_SERVER_VARS["SERVER_ADDR"] . "rn"; //定义主机 $header.= "Referer:http://" . $HTTP_SERVER_VARS["SERVER_ADDR"] . "/guojinyong/test/socket.phprn"; //Referer信息, $header.= "Content-Type: application/x-www-form-urlencodedrn"; //说明这个请求为POST $header.= "Content-Length: " . $length . "rn"; //提交的数据长度 $header.= "Connection: Closernrn"; //关闭连接 $header.= $params . "rn"; //添加post的字符串 //发送post的数据 fputs($post, $header); //接收get_socket.php返回的数据并打印出来 while (!feof($post)) { echo fgets($post, 1024); //从1024个字节之后开始获取 } fclose($post); //关闭socket连接 ?>
get_socket.php
<?php echo "Set-Cookie:name=Macopad; expires=Fri 12-Nov-99 3:59:59 GMT"; $userName = ""; $password = ""; $userName = $_POST['username']; $password = $_POST['password']; echo "<br>通过socket模拟程序发送数据!<br>"; echo "当前服务器是:" . $HTTP_SERVER_VARS["SERVER_ADDR"] . "<br>"; echo "接受到的用户名是:" . $userName . "<br>接收到的密码是:" . $password; ?>
显示结果
HTTP/1.1 200 OK Date: Wed, 14 Apr 2010 06:49:07 GMT Server: Apache X-Powered-By: PHP/5.2.5 Cache-Control: max-age=0 Expires: Wed, 14 Apr 2010 06:49:07 GMT Vary: Accept-Encoding Content-Length: 189 Connection: close Content-Type: text/html Set-Cookie:name=Macopad; expires=Fri 12-Nov-99 3:59:59 GMT
通过socket模拟程序发送数据!
当前服务器是:http://www.zhutiai.com
接受到的用户名是:macopad@qq.com
接收到的密码是:macopad
文章网址:http://www.phprm.com/frame/php1005218.html
随意转载^^但请附上教程地址。