首页 > php框架 > php模拟socket 多次发送数据的实现方法

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

随意转载^^但请附上教程地址。

标签:none