<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi,<div>I am new to FS, and trying to get the mod event socket installed and running. I have FS running, with SIP account, can dial in/out via gateway.</div><div>Now I want to dial in, FS will send some info to client browser, here is one question, does this work over the internet, or just local ? Info sent could be the uuid, so that client browser could decide to bridge the call, send to IVR or transfer ...</div><div>Please give me some guide line how to set this up.</div><div>I added to dialplan/default.xml</div><div>-----</div><div><span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium; "><pre> &lt;extension name="socketTest"&gt;
      &lt;condition field="destination_number" expression="^444$"&gt;
        &lt;action application="socket" data="127.0.0.1:9090 async full"/&gt;
      &lt;/condition&gt;
 &lt;/extension&gt;</pre><pre>-----</pre><pre><br></pre><pre>got the php sample file: </pre><pre><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal; "><pre style="word-wrap: break-word; white-space: pre-wrap; ">&lt;?php

/**
 * Based loosely on the NET_Server code in PEAR.
 * This is only an example - considerable additional work is needed
 * Specifically, the code in the handleConnection method should be 
 * handled in a subclass
 *
 * 
 */

class Message
{
  var $properties = array();
  var $content = null;
}

class EventSocketListener
{

  var $host;
  var $port;
  var $sock;
  var $is_parent = true;
  var $clientInfo;
  var $clientFD;

  var $connectionContext = array();


  function &amp;create($port, $host = "localhost")
      {
        $esl = new EventSocketListener;
        $esl-&gt;port = $port;
        $esl-&gt;host = $host;
        if (!function_exists('socket_create')) {
            return PEAR::raiseError('Sockets extension not available.');
        }
        return $esl;
      }

  function start()
  {
        if (($this-&gt;sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
          echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
        }

        if (!socket_set_option($this-&gt;sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
          echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
        }

        if (socket_bind($this-&gt;sock, $this-&gt;host, $this-&gt;port) === false) {
          echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($this-&gt;sock)) . "\n";
        }

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

        // Dear children, please do not become zombies
        pcntl_signal(SIGCHLD, SIG_IGN);
        
        // wait for incmoning connections
        while (true)
        {
            // new connection
            if(($fd = socket_accept($this-&gt;sock)))
            {
              $pid = pcntl_fork();
              if($pid == -1) {
                  return  PEAR::raiseError('Could not fork child process.');
                }
                // This is the child =&gt; handle the request
                elseif($pid == 0) {
                    // this is not the parent
                    $this-&gt;_isParent = false;
                    // store the new file descriptor
                    $this-&gt;clientFD = $fd;

                    $peer_host    =    "";
                    $peer_port    =    "";
                    socket_getpeername($this-&gt;clientFD, $peer_host, $peer_port);
                    $this-&gt;clientInfo    =    array(
                                                      "host"        =&gt;    $peer_host,
                                                      "port"        =&gt;    $peer_port,
                                                      "connectOn"   =&gt;    time()
                                                   );
                    $this-&gt;handleConnection();
                    socket_shutdown($this-&gt;clientFD, 2);
                    socket_close($this-&gt;clientFD);
                }
                else /* Parent does nothing */
                  {
                  }
            }
        }
  }

  function handleConnection()
  {
    $fd = $this-&gt;clientFD;
    //first, read headers &amp; setup a state for this connection
    $line = "";
    socket_write($fd, "CONNECT\n\n");
    do 
      {
        $line = socket_read($fd, 2048, PHP_NORMAL_READ);
        if (trim($line) == "")
          break;
        //we got a header, we need to add it to the 
        list($key, $value) = explode(":", $line);
        $key = trim($key);
        $value = trim(urldecode($value));
        $this-&gt;connectionContext[$key] = $value;
      }
    while ($line != "");
    
    //    print_r($this-&gt;connectionContext);
    $this-&gt;callConnected();

    exit();
    
  }

  function processMessages($returnOnReply = false)
  {
    $fd = $this-&gt;clientFD;
    $result = new Message();
    $props = array();
    while (true)
      {
        do 
          {
            $line = @socket_read($fd, 2048, PHP_NORMAL_READ);
            if (socket_last_error($fd) == 104)
              return null;
            if ($line == null || $line == FALSE || trim($line) == "")
              break;
            //we got a header, we need to add it to the message
            list($key, $value) = explode(":", $line);
            $key = trim($key);
            $value = trim(urldecode($value));
            $props[$key] = $value;
          }
        while ($line != "");
        $result-&gt;properties = $props;

        if (isset($props['Content-Length']))
          {
            $length = $props['Content-Length'];
            print("Reading content - $length\n");
            $data = socket_read($fd, $length);
            $result-&gt;content = $data;
          }
        if (isset($props['Content-Type']))
          {
            $type = $props['Content-Type'];
            if ($returnOnReply &amp;&amp; 
                ($type == "command/reply" || $type == "api/response"))
              {
                return $result;
              }
            else if ($type == "text/event-plain") //only plain events for now
              {
                $this-&gt;handleEvent($result);
              }
          }
        else
          {
            print("UNKNOWN MESSAGE: \n");
            print_r($result);
          }
      }    
  }
    


  function invokeCommand($command)
  {
    //Send the command
    print("Invoking: $command\n");
    $this-&gt;sendCommand($command);
    // Wait for the response
    $result = $this-&gt;processMessages(true);
    return $result;
  }

  function sendCommand($command)
  {
    $fd = $this-&gt;clientFD;
    socket_write($fd, trim($command) . "\n\n"); 
  }

/*-----------------------------------------------------*/
  /* Abstract Methods - should move to subclass*/

  function callConnected()
  {
    print_r($this-&gt;connectionContext);
    print("----------------\n");
    $result = $this-&gt;invokeCommand("log DEBUG");
    print_r($result);
    $result = $this-&gt;invokeCommand("event plain ALL");
    print_r($result);

    $this-&gt;processMessages(false);
    print("DONE PROCESSING MESSAGES");
    print_r($this-&gt;connectionContext);
  }

  function handleCommandResponse($response)
  {
    print("Recieved Unhandled Response:\n");
    print_r($response);
  }

  function handleEvent($event)
  {
    print("Recieved Unhandled Event:\n");
    print_r($event);
  }
}

  

  
// create a server that forks new processes
$server  = &amp;EventSocketListener::create(9090);

// start the server
$server-&gt;start();
?&gt;</pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">--------</pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">( this is the original file, not perfect sample) I tried to run this, and got error with auth.</pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">Also, I modify the even_socket_conf.xml  in autoload_configs/  </pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">change listen-ip to  0.0.0.0 , port = 9090 , disable password</pre><pre style="word-wrap: break-word; white-space: pre-wrap; "><br></pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">What did I miss? </pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">Thankyou for your help</pre><pre style="word-wrap: break-word; white-space: pre-wrap; ">Will</pre><pre style="word-wrap: break-word; white-space: pre-wrap; "><br></pre></span></pre></span></div></td></tr></table><br>