我正在为聊天应用程序的客户端服务器套接字程序工作,但它给出以下错误消息
警告:socket_bind():无法绑定地址[98]:地址已在使用....无法绑定到第15行的地址
我看过各种教程,但我想让服务器不断地听取客户端的请求。我看到了端口号,它也打开了,但仍然是相同的消息。我在这一点上被困了好几天都没有得到适当的解决方案。请帮忙解决,谢谢.....
Server.php:
<?php
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();
$address = 'XXX.XX.XX.XXX';
$port = 15213;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "'n";
}
if (socket_bind($sock, $address, $port) === false) {
echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "'n";
}
if (socket_listen($sock, 5) === false) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "'n";
}
do {
if (($msgsock = socket_accept($sock)) === false) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "'n";
break;
}
/* Send instructions. */
$msg = "'nWelcome to the PHP Test Server. 'n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.'n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "'n";
break 2;
}
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);
?>
Client.php
<?php
error_reporting(E_ALL);
echo "<h2>TCP/IP Connection</h2>'n";
/* Get the port for the WWW service. */
$service_port = getservbyname('www', 'tcp');
/* Get the IP address for the target host. */
$address = gethostbyname('www.example.com');
/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "'n";
} else {
echo "OK.'n";
}
echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() failed.'nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "'n";
} else {
echo "OK.'n";
}
$in = "HEAD / HTTP/1.1'r'n";
$in .= "Host: www.example.com'r'n";
$in .= "Connection: Close'r'n'r'n";
$out = '';
echo "Sending HTTP HEAD request...";
socket_write($socket, $in, strlen($in));
echo "OK.'n";
echo "Reading response:'n'n";
while ($out = socket_read($socket, 2048)) {
echo $out;
}
echo "Closing socket...";
socket_close($socket);
echo "OK.'n'n";
?>
在两个php文件中,您在同一端口上创建一个套接字。这就是问题所在。
服务器必须创建套接字,而客户端必须使用套接字(也不创建它)
两个应用程序不能创建相同的套接字并监听相同的端口。
编辑:我已经在localhost上用xampp测试了您的脚本。所以IP是127.0.0.1。服务器在端口15213上正常侦听,客户端在该端口上正常连接。我在xampp控制面板上看到端口是打开的。
如果你使用你在这里发布的脚本,那么你必须替换在Server.php
$address = 'XXX.XX.XX.XXX';
$address = '127.0.0.1';
和Client.php
$address = gethostbyname('www.example.com');
$address = gethostbyname('localhost');
or
$address = '127.0.0.1';