php socket_accept остановился - PullRequest
       3

php socket_accept остановился

2 голосов
/ 12 сентября 2011

Здравствуйте, я создал сервер сокетов php для получения данных от plc, plc настроен как клиент сокетов tcp. У меня серьезная проблема: если локальная сеть отключается, кажется, что функция socket_accept остановлена, plc не сможет отправить мне данные. Если я перезапущу свой сервер, PLC переподключится правильно.

Может кто-нибудь мне помочь? Код моего сервера:

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 = ipserver;
$port = 10001;    

if (($sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname("TCP"))) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit;
}

if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
    echo socket_strerror(socket_last_error($sock));
    exit;
} 

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
    exit;
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
    exit;
}

     while(true)
{
    //$remote_fd = socket_accept($sock);
    if (($remote_fd = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break ;
    }
    do {
        $recv = "";
        if (false === ($recv = socket_read($remote_fd, 128, PHP_BINARY_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($remote_fd)) . "\n";
            #break 2;
        }
        if($recv != "") {
            echo $recv."\n";
            inserisci_letture("t_letture",trim($recv));
            if($sent=socket_write($remote_fd,"1",1)===false)
            {
                echo "socket_write() failed: reason: " . socket_strerror(socket_last_error($remote_fd)) . "\n";
            }
        }
    } 
    while($recv != ""); 
}
socket_shutdown($sock);
socket_close($sock);


?>

1 Ответ

0 голосов
/ 12 сентября 2011

Слушайте 0.0.0.0 вместо определенного интерфейса, чтобы сокет не закрывался, если сеть (интерфейс) не работает. Это специальный адрес, который прослушивает все интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...