Проблема с привязкой к сокету из скрипта PHP - PullRequest
1 голос
/ 22 апреля 2011

Я очень новичок в PHP, так что это может быть что-то простое. В любом случае, я пытаюсь создать двустороннюю связь между скриптом PHP (активированным веб-клиентом) и локальным процессом (написанным на C ++). Сценарий PHP должен отправить некоторую информацию процессу C ++, а затем дождаться ответа. Моя проблема в том, что единственный способ установить такой тип связи - использовать socket_bind, но когда я это сделаю, произойдет сбой с ошибкой «адрес уже используется». Рассматриваемый файл сокета / tmp / sock уже создан процессом C ++, который работает непрерывно (он не может быть запущен сценарием PHP). Если я использую socket_connect и просто что-то записываю в процесс C ++, это прекрасно работает; но мне нужно связать, прежде чем я смогу прослушать этот сокет из сценария 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();

//Adapted from http://www.php.net/manual/en/sockets.examples.php

if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) 
{
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit();
}
if (socket_bind($sock, '/tmp/sock') === false)  //Fails here
{
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}  
....

Спасибо -

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Ваши коды C ++ и PHP должны пометить сокет как общий (SO_REUSE_ADDR).

0 голосов
/ 23 апреля 2011

Оказывается, нужно просто socket_read ().Я не понимал, что вы можете выполнять обе операции на одном сокете (когда он просто подключен, а не связан).У пользователя hamishcool3 на PHP socket_read есть отличная служебная функция для чтения из сокета, пока не будет достигнут определенный символ (хотя он, вероятно, медленнее, чем стандартное чтение с ограничением байтов).

...