Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Помогите разобраться с сокетами


Автор: Anton Vatchenko 8.11.2006, 11:34
Я сижу на платном хостинге, где точно есть 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 = '193.84.19.67';
$port = 9999;

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;
       }
       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);
?> 

Автор: Anton Vatchenko 8.11.2006, 11:58
МОжет запускаю неправильно? А то пишу в адресной строке браузера как обычный php-скрипт. Может его как-то из коммандной строки вызывать надо?

Автор: BobiKK 8.11.2006, 12:36
Попробуйте не на low-level интерфейсе. Вам надо разве посылать датаграммы или ещё что-то специфичное?
Вот, попробуйте отсюда:
http://de.php.net/manual/ru/function.fsockopen.php

Автор: Anton Vatchenko 8.11.2006, 12:38
Там же не прослушивание. Мне не нужно к какому-то серверу лезть. Мне нужно, чтобы мой сервер стал "слушать"...

Автор: Powerhead 8.11.2006, 23:01
Тебе придется использовать собственный сервер или колокейшн. Обычный хостинг не позволит тебе слушать порты. 
Что это у тебя за приложение такое?

Автор: Anton Vatchenko 9.11.2006, 11:24
Да, действительно не поддерживают сокеты. Я заключал договор, спросил у них про сокеты, они сказали "Да, да, конечно...", а вчера сказали - "Так только исходящие сокеты поддерживаются, слушать нельзя". А смысл мне в них? Так что думаю что кроме сокетов может помочь не рвать связь...

А проблема вот в чем: это мобильный проект. Если я буду общаться через HTTP, то я отправляю запрос 800 байт заголовков + 5 байт нужной информации, и получаю назад аналогичное. Тем более некоторые операторы после разрыва связи берут, и округляют цену за трафик до 10кб. Так что прием-передача полезных 10 байт = 10 кб. Вот такая математика! Пытался как-то решить проблему через FTP, но там нельзя получить уже исполненный скрипт...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)