求助:PHP+SOCKET 由于套接字没有连接并且没有提供地址,发送或接收数据的请求没有被接受。

subendong 2011-06-03 04:38:41
由于之前连续发布了两篇帖子,无一有回,所以先向版主申请删除之前两篇类似的帖子,不然留着无用。就像垃圾一样。
然后希望大神,能根据我提供的代码,稍作修改,使得代码能够正确运行,谢谢!

具体如下:
Warning: socket_read(): unable to read from socket [0]: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
我建了两个文件xx.php是在服务器端执行的文件。x.php是在客户端执行的文件。
xx.php
<?php 
// 设置一些基本的变量
global $lat,$lnt;
$host = "192.168.1.110";
$port = 8080;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

//绑定Socket到端口
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$ret = socket_listen($socket, 5);
if($ret)
{
while (true)
{
$spawn = socket_accept($socket);
if(!$spawn) break;
$output = "congratulations,you have connected server:" . $host . "!";
socket_write($spawn, $output, strlen ($output)) or die("error\n");
$input = socket_read($socket, 100000);
socket_write($spawn, $input, strlen ($input)) or die("error\n");
socket_close($spawn);
}
}
socket_close();
?>




x.php
<?php 
// 设置一些基本的变量
$host = "192.168.1.110";
$port = 8080;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
if(!$socket) echo "can't creat socket";
//绑定Socket到端口

$result = socket_connect($socket,$host,$port);
if($result)
{
$output="abc";
socket_write($socket, $output, strlen ($output));
$input = socket_read($socket, 1024);
}
echo $input;
?>



在服务器先打开xx.php,然后再在客户端打开x.php,结果服务器端提示以上错误信息,就是socket_read的错误。
哪位大神帮我看下,找了好多资料都没解决。
...全文
938 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongyilin 2013-01-31
  • 打赏
  • 举报
回复
学习了不错,不过还是没有搞出来 也没报错。
subendong 2011-06-08
  • 打赏
  • 举报
回复
baoxiaohua
1、端口可以随便改,前提是:端口必须存在、端口没被占用。
2、你的错误可能是因为你运行了2次客户端的程序。客户端和服务端都关了,再试下。
subendong 2011-06-08
  • 打赏
  • 举报
回复
谢谢一楼的,用了,没报错。呵呵。
baoxiaohua 2011-06-04
  • 打赏
  • 举报
回复
最近也要做这个了,所以借LZ的题目问一个问题,

xuzuning大哥,想知道那个端口是属于自己随便绑定的吗?

$port = 1000; // 端口号

我改成$port = 6000;是不是也可以,如果改端口号只改这个参数就可以了吗?需要做些其他设置吗?
baoxiaohua 2011-06-04
  • 打赏
  • 举报
回复
还有一个就是,我用了xuzuning大哥的可用的测试,运行的时候发现提示

socket_create() successed!
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 in C:\wamp\www\socket\server.php on line 18
socket_bind() failed:操作成功完成。
Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: 提供了一个无效的参数。 in C:\wamp\www\socket\server.php on line 24
socket_listen() failed:操作成功完成。
Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [0]: 提供了一个无效的参数。 in C:\wamp\www\socket\server.php on line 32
socket_accept() failed:操作成功完成。

什么原因

xuzuning 2011-06-03
  • 打赏
  • 举报
回复
我给你个可用的测试例
// Client 
// 设置错误处理
error_reporting (E_ALL);
// 设置处理时间
set_time_limit (0);

$ip = ""; // IP 地址
$port = 1000; // 端口号

$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
echo "socket_create() 成功!<br>\n";
else
echo "socket_create() 失败:".socket_strerror ($socket)."<br>\n";

$conn = socket_connect ($socket, $ip, $port); // 建立SOCKET的连接
if ($conn)
echo "成功连接到[".$ip.":".$port."]<br>\n";
else
echo "socket_connect() 失败:".socket_strerror ($conn)."<br>\n";

echo socket_read ($socket, 1024)."<br>";

$stdin = fopen ('php://stdin', 'r');

$ar = array("HELLO","HELP","test","QUIT");
$i = 0;

while (true)
{
// $command = trim (fgets ($stdin, 1024));
// socket_write ($socket, $command, strlen ($command));
echo "发送 $ar[$i]<br>";
socket_write ($socket, $ar[$i], strlen($ar[$i]));
$i++;
$msg = trim (socket_read ($socket, 1024));
echo "收到:$msg<br>\n";
if ($msg == "Bye-Bye")
break;
}
fclose ($stdin);
socket_close ($socket);

// Server
// 设置错误处理
error_reporting (E_ALL);
// 设置运行时间
set_time_limit (0);
// 起用缓冲
ob_implicit_flush ();
$ip = ""; // IP地址
$port = 1000; // 端口号

$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET
if ($socket)
echo "socket_create() successed!\n";
else
echo "socket_create() failed:".socket_strerror ($socket)."\n";

$bind = socket_bind ($socket, $ip, $port); // 绑定一个SOCKET
if ($bind)
echo "socket_bind() successed!\n";
else
echo "socket_bind() failed:".socket_strerror ($bind)."\n";

$listen = socket_listen ($socket); // 间听SOCKET
if ($listen)
echo "socket_listen() successed!\n";
else
echo "socket_listen() failed:".socket_strerror ($listen)."\n";

while (true)
{
$msg = socket_accept ($socket); // 接受一个SOCKET
if (!$msg)
{
echo "socket_accept() failed:".socket_strerror ($msg)."\n";
break;
}
$welcome = "服务端收到:Welcome to PHP Server!\n";
socket_write ($msg, $welcome, strlen ($welcome));
while (true)
{
$command = strtoupper (trim (socket_read ($msg, 1024)));
if (!$command)
break;
switch ($command)
{
case "HELLO":
$writer = "Hello Everybody!";
break;
case "QUIT":
$writer = "Bye-Bye";
break;
case "HELP":
$writer = "HELLO\tQUIT\tHELP";
break;
default:
$writer = "Error Command!";
}
socket_write ($msg, $writer, strlen ($writer));
if ($command == "QUIT")
break;
}
socket_close ($msg);
if ($command == "QUIT")
break;
}

socket_close ($socket); // 关闭SOCKET

21,886

社区成员

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

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