соккеты. общение с сервером.

pi

Guest
соккеты. общение с сервером.

Гсопода, сделал я небольшой серверок на базе примера из докуметации по сокетам. Телнетом я с ним работаю великолепно. Но никак немогу обратится к нему из скрипта.



Если выкинуть все что я там навернул для своих нужд... то вот сервер:

PHP:
#!/usr/bin/php -q

<?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 = ‘192.168.1.53’;
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo “socket_create() failed: reason: ” . socket_strerror($sock) . “\n”;
}

if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo “socket_bind() failed: reason: ” . socket_strerror($ret) . “\n”;
}

if (($ret = socket_listen($sock, 5)) < 0) {
echo “socket_listen() failed: reason: ” . socket_strerror($ret) . “\n”;
}

do {
if (($msgsock = socket_accept($sock)) < 0) {
echo “socket_accept() failed: reason: ” . socket_strerror($msgsock) . “\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($ret) . “\n”;
break 2;
}

echo “$buf”; // все что я передам ему по идее должно выйти в терминале в котором запущен скрипт

if (!$buf = trim($buf)) {
continue;
}
if ($buf == ‘quit’) {
break;
}
if ($buf == ‘shutdown’) {
socket_close($msgsock);
break 2;
}
if($buf == “test”) {

$msg = “test \n”;
socket_write($msgsock, $msg, strlen($msg));
}

} while (true);
socket_close($msgsock);
} while (true);

socket_close($sock);
?>
а вот как я к нему пытюсь обратится:
PHP:
if ($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) < 0) {
echo “socket_create() failed: reason: ” . socket_strerror($socket) . “\n”;
Ъ

echo “create ”.socket_strerror(socket_last_error()).“<br>\n”; // ловим баги

$service_port = 10000;
$address = “192.168.1.53”;

echo “Attempting to connect to ‘$address’ on port ‘$service_port’...”;

if ($result = socket_connect($socket, $address, $service_port) <0) {
echo “socket_connect() failed.\nReason: ($result) ” . socket_strerror($result) . “\n”;
}

echo “connect ”.socket_strerror(socket_last_error()).“<br>\n”; // ловим баги

$in = “test”; // должен вернуть тотже тест
socket_write($socket, $in, strlen($in));

echo “write ”.socket_strerror(socket_last_error()).“<br>\n”; // ловим баги

while ($out = socket_read($socket, 2048)) {
echo $out;
}
echo “read ”.socket_strerror(socket_last_error()).“<br>\n”; // ловим баги

socket_close($socket);
echo “close ”.socket_strerror(socket_last_error());“<br>\n”; // ловим баги
Там где пометочка “ловим баги” везде выдает Success. В остальном - нуль эмоций. Никаких ошибок, а такое впечатдение что я ссервером даже и не общаюсь. По ходу, когда я передаю серверу “test” он должен этот тест просто написать в терминале в котором запущен сервер (echo “$buf”) и отдать мне назад тот-же тест ($msg = “test \n”; socket_write($msgsock, $msg, strlen($msg)) но что-то глухо.

Есть какие-нибудь идеи?

Может у кого есть код для работы с ссокетами. Был бы рад посмотреть на кусочек который общается с сервром.

P.S Фраза “Ночной дозор! Всем багам выти из сумрака!..” - не помогает :)
 

Demiurg

Guest
ты думаешь мы за тебя будем отлаживать твой скрипт ?
 

IBSN

Новичок
: ) под сэйф моде это не поддерживается, я пользуюсь для отправки:

PHP:
$fp = fsockopen("udp://СЕРВЕР", 21567, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   fwrite($fp, "СООБЩЕНИЕ");
   fclose($fp);
}
 

Screjet

Новичок
while ($out = socket_read($socket, 2048)) {
echo $out;
}

Оригинальное решение.. Можешь объяснить что в этом коде происходит?
 

IBSN

Новичок
а вообще проверь открыты порты или нет во время общения

до запуска сервера netstat -u >out1
и после netstat -u >out2
 

pi

Guest
Автор оригинала: IBSN
: ) под сэйф моде это не поддерживается, я пользуюсь для отправки:

PHP:
$fp = fsockopen("udp://СЕРВЕР", 21567, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   fwrite($fp, "СООБЩЕНИЕ");
   fclose($fp);
}
Твоим методом вылетает сервер:
<br />
<b>Warning</b>: socket_read() unable to read from socket [104]: Connection reset by peer in <b>[...]/socket.php</b> on line <b>47</b><br />
socket_read() failed: reason: Operation not permitted

Это та линия где
PHP:
 if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
Один плюс - видно что коннект есть :)
Порт открыт - я же с ним по телнету общаюсь.
 

Screjet

Новичок
Если нужно написать свой сервер:
1) Изучи как используются описанные тобой функции по другим приложениям. Посмотри исходники апача, например. Обрати особое внимание на socket_select.

2) Определись с протоколом. Самый простой, по минимуму, пока не примет строку полностью, ниче делать не должен. Принятый пакет может быть фрагментирован. Изучи хотя бы один RCF протокол, например HTTP.

А вообще есть апач, который подходит почти на все случаи жисти.
 
Сверху