gpt4 book ai didi

php - 握手后无法读取客户端发送的数据(sockets php)

转载 作者:行者123 更新时间:2023-12-03 11:59:15 27 4
gpt4 key购买 nike

<?php
if (!function_exists('http_parse_headers')) {
function http_parse_headers($raw_headers) {
$headers = array();
$key = '';

foreach(explode("\n", $raw_headers) as $i => $h) {
$h = explode(':', $h, 2);

if (isset($h[1])) {
if (!isset($headers[$h[0]]))
$headers[$h[0]] = trim($h[1]);
elseif (is_array($headers[$h[0]])) {
$headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1])));
}
else {
$headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1])));
}

$key = $h[0];
}
else {
if (substr($h[0], 0, 1) == "\t")
$headers[$key] .= "\r\n\t".trim($h[0]);
elseif (!$key)
$headers[0] = trim($h[0]);
}
}

return $headers;
}
}
function go(){
$starttime = round(microtime(true),2);
echo "GO() ... <br />\r\n";

echo "socket_create ...";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if($socket < 0){
echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
exit();
} else {
echo "OK <br />\r\n";
}


echo "socket_bind ...";
$bind = socket_bind($socket, 'artshellorok.tk', 889);//привязываем его к указанным ip и порту
if($bind < 0){
echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
exit();
}else{
echo "OK <br />\r\n";
}

socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений

echo "Listening socket... ";
$listen = socket_listen($socket, 5);//слушаем сокет

if($listen < 0){
echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
exit();
}else{
echo "OK <br />\r\n";
}

while(true){ //Бесконечный цикл ожидания подключений
echo "Waiting... ";
$accept = @socket_accept($socket); //Зависаем пока не получим ответа
if($accept === false){
echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
usleep(100);
} else {
echo "OK <br />\r\n";
echo "Client \"".$accept."\" has connected<br />\r\n";
$info = http_parse_headers(socket_read($accept, 100000000));
if(isset($info['Sec-WebSocket-Key'])){
$key = base64_encode(pack('H*', sha1($info['Sec-WebSocket-Key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept:$key\r\n\r\n";
socket_write($accept,$upgrade);
while(socket_read($accept,100000000) != false && socket_read($accept,100000000) != ""){
echo socket_read($accept, 100000000);
}
}
}
if( ( round(microtime(true),2) - $starttime) > 100) {
echo "time = ".(round(microtime(true),2) - $starttime);
echo "return <br />\r\n";
return $socket;
}


}


}

error_reporting(E_ALL); //Выводим все ошибки и предупреждения
set_time_limit(0); //Время выполнения скрипта не ограничено
ob_implicit_flush(); //Включаем вывод без буферизации

$socket = go(); //Функция с бесконечным циклом, возвращает $socket по запросу выполненному по прошествии 100 секнуд.

echo "go() ended<br />\r\n";

if (isset($socket)){
echo "Closing connection... ";
@socket_shutdown($socket);
socket_close($socket);
echo "OK <br />\r\n";

当客户端连接到套接字(使用 http://websocket.org/echo.html和我自己的客户端测试)时,握手可以正常进行,但是当我尝试发送数据时。发送的数据显示不正确或什至不显示(在服务器端)。 889/tcp端口已打开。有什么解决方案吗?服务器端代码是通过ssh(putty)运行的。

最佳答案

您正在从套接字读取3次,并且在前两次读取时将读取的数据丢弃。

您应该将其读入变量一次,然后对变量进行比较,而不是对函数的直接输出进行比较。

$socket_data = socket_read($accept, 100000000);
while($socket_data != false && $socket_data != ""){
echo $socket_data;
$socket_data = socket_read($accept, 100000000);
}

关于php - 握手后无法读取客户端发送的数据(sockets php),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48657968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com