请问有没有人知道socket多线程或者可以同时(一定要同时)接受多个请求

dengxu03281 2009-07-28 10:43:57
如题, 418887542 如有高手者,忘赐教,不甚感激。

c++做客服端,php做socket服务端。因为需要多个c++同时访问php服务端。我设计的是单线程。不能满足要求。

//header('content-type: text/html; charset=utf8');
/*************可以修改()***************8*********/
// 设置一些基本的变量
$host = "192.168.1.103";
$port = 1124;
/*************************************************/

error_reporting(0);
ob_implicit_flush();

// 设置超时时间
set_time_limit(0);
$is = true;
ignore_user_abort($is);

//设置appid
$appid =99;
if(!extension_loaded('php_socket'))
{
dl('php_sockets.dll');
}


//mysq连接
$link = mysql_connect('localhost','root','root');

//选择数据库
mysql_select_db('databank',$link);

//设置字符编码为utf8
mysql_query("SET NAMES 'utf-8'");


/**
* *****************************************************************************************
* s o a p 开始
* *********************************************** *******************************************
*/


// 创建一个Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
//$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1);
//socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>300, "usec"=>0));
if($socket)
{
fputs(fopen('ok.php','a+'),"\r\nstart **r\n".date("y-m-d,H:i:s",time())."socket_create成功 \r\n");
}
else
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_create失败 \r\n");
}
//绑定Socket到端口
$bind = socket_bind($socket, $host, $port);
if($bind)
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_bind成功 \r\n");
}
else
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_bind失败 \r\n");
}

// 开始监听链接
$result = socket_listen($socket, 3);

//非阻塞模式(不可用???)
//socket_set_nonblock($socket);

if($result)
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_listen成功 \r\n");
}
else
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_listen失败 \r\n");
}

$time1 = time();
//循环接受请求 并处理
do{

// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept($socket);
if($spawn)
{
fputs(fopen('ok.php','a+'),socket_getpeername($socket).date("y-m-d,H:i:s",time())."socket_acceptyyyyyyy成功 \r\n");
}
else
{
fputs(fopen('ok.php','a+'),socket_getpeername($socket).date("y-m-d,H:i:s",time())."socket_accept失败 \r\n");
continue;
}

// 获得客户端的输入
$input = socket_read($spawn, 2048);
while (!strpos($input,'</soap:Envelope>'))
{
$c = socket_read($spawn,2048) or die("错误:不能接受到返回数据3\n");
fputs(fopen('ok.php','a+'),"\r\n*******(没有结束)第三次接受的数据开始*** \r\n".$re."\r\n*******(没有结束)第三次接受的数据结束*** \r\n");
$input .= $c;
}

//将输入结果写入ok.php
if($input)
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_read,数据为:".$input."\r\n");
}
else
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_read失败 \r\n");
}

$output = @get_response($input);
//处理客户端输入并返回结果
/* $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><ClientLoginAPPResponse xmlns=\"http://tempuri.org/\"><GetClientLoginAPPResult><UserInfo><m_Uid>1</m_Uid><m_AppID>99</m_AppID></UserInfo><m_ResultCode>0</m_ResultCode></GetClientLoginAPPResult></ClientLoginAPPResponse></soap:Body></soap:Envelope>";*/

$length = strlen($output);
$header = "HTTP 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: ".$length;

$postdata = $header."\r\n\r\n".$output;
$write = socket_write($spawn,$postdata, strlen($postdata)) or die("Could not write output\n");

if($write)
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_write成功,数据为: \r\n".$header.$output."\r\n");

}
else
{
fputs(fopen('ok.php','a+'),date("y-m-d,H:i:s",time())."socket_write失败 \r\n");
}

// 关闭sockets

socket_close($spawn);
$time2= time();
if($time1+30<$time2)
{
echo "<script>window.location.href = 'se.php'</script>";
}
}while(true);
socket_close($socket);



/**
* *****************************************************************************************
* s o a p 结束
* *********************************************** *******************************************
*/
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxq4100798 2009-07-28
  • 打赏
  • 举报
回复
多核理论上可以同时,单核就不用想了,不可能同时的
tian428 2009-07-28
  • 打赏
  • 举报
回复
楼上,php脚本可以丢后台运行了
楼主,不知道你具体需求如何;我以前做的一个是用socket_select多路复用IO来 监控多个套接字的读写
tfxg 2009-07-28
  • 打赏
  • 举报
回复
php似乎沒有線程吧,用socket做監聽就是一頁面一直沒有打開完的頁面

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧