PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

socket_create_listen> <socket_close
Last updated: Fri, 03 Oct 2008

view this page in

socket_connect

(PHP 4 >= 4.0.7, PHP 5)

socket_connectCrée une connexion sur une socket

Description

bool socket_connect ( resource $socket , string $address [, int $port ] )

Crée une nouvelle connexion en utilisant la ressource socket socket , qui doit être une ressource de socket valide, créée par la fonction socket_create().

Liste de paramètres

socket

address

Le paramètre address est soit une adresse valide IPv4 (e.g. 127.0.0.1) si socket vaut AF_INET, soit une adresse valide IPv6 (e.g. ::1) si le support IPv6 est actif et que le paramètre socket vaut AF_INET6, soit un chemin vers un socket de domaine Unix, si la famille de sockets vaut AF_UNIX.

port

Le paramètre port n'est utilisé et mandaté que lors d'une connexion à un socket AF_INET ou AF_INET6, et désigne le port de l'hôte distant sur lequel la connexion doit être effectuée.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec. Le code d'erreur généré peut être obtenu en appelant la fonction socket_last_error(). Ce code d'erreur peut être passé à la fonction socket_strerror() pour obtenir un message d'erreur humainement lisible.

Note: Si le socket est non-bloquant, alors cette fonction retourne FALSE avec l'erreur suivant : Operation now in progress.



socket_create_listen> <socket_close
Last updated: Fri, 03 Oct 2008
 
add a note add a note User Contributed Notes
socket_connect
maganap
18-Sep-2008 09:15
Hi there!

For the TCP connections: socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
In case you're having problems in socket_connect() with socket_strerror() = "Permission denied", you may be having a SELinux config issue.

Check if SELinux is enabled:
# /usr/sbin/sestatus -v
In case it is, you can just type the command:
# setsebool httpd_can_network_connect=1

That's it... I read you had to reboot, but I didn't and it worked fine anyway. More info, you may check:
http://arkiv.netbsd.se/?ml=squirrelmail-users&a=2005-11&t=1523021
rbarnes at fake dot com
15-Jul-2008 07:04
Here is an example of a non-blocking connect which should perform quite a bit faster than the one posted by Seymour below:

<?php
function msConnectSocket($remote, $port, $timeout = 30) {
       
# this works whether $remote is a hostname or IP
       
$ip = "";
        if( !
preg_match('/^\d+\.\d+\.\d+\.\d+$/', $remote) ) {
           
$ip = gethostbyname($remote);
            if (
$ip == $remote) {
               
$this->errstr = "Error Connecting Socket: Unknown host";
                return
NULL;
            }
        } else
$ip = $remote;

        if (!(
$this->_SOCK = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
           
$this->errstr = "Error Creating Socket: ".socket_strerror(socket_last_error());
            return
NULL;
        }

       
socket_set_nonblock($this->_SOCK);

       
$error = NULL;
       
$attempts = 0;
       
$timeout *= 1000// adjust because we sleeping in 1 millisecond increments
       
$connected;
        while (!(
$connected = @socket_connect($this->_SOCK, $remote, $port+0)) && $attempts++ < $timeout) {
           
$error = socket_last_error();
            if (
$error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
               
$this->errstr = "Error Connecting Socket: ".socket_strerror($error);
               
socket_close($this->_SOCK);
                return
NULL;
            }
           
usleep(1000);
        }

        if (!
$connected) {
           
$this->errstr = "Error Connecting Socket: Connect Timed Out After $timeout seconds. ".socket_strerror(socket_last_error());
           
socket_close($this->_SOCK);
            return
NULL;
        }
       
       
socket_set_block($this->_SOCK);

        return
1;     
}
?>
mike at fserve dot us
22-Feb-2008 11:14
This probably sounds like common sense, but it is something nobody i asked thought of... you can't bind the socket to localhost, you must bind it to either the IP your router assigns you, or your public IP address. If you bind to localhost, it will give an invalid resource error.
ScriptBlue at nyc dot rr dot com
17-Sep-2005 06:13
If you do want to have a socket_connect operation timeout you can use the following code.
<?php
$sock
= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sock);
socket_connect($sock,"127.0.0.1", 80);
socket_set_block($sock);
switch(
socket_select($r = array($sock), $w = array($sock), $f = array($sock), 5))
{
        case
2:
                echo
"[-] Connection Refused\n";
                break;
        case
1:
                echo
"[+] Connected\n";
                break;
        case
0:
                echo
"[-] Timeout\n";
                break;
}
?>
This basically makes socket_connect return immediately then you can use socket_select to see how the socket reacted.
11-Jul-2005 04:26
well this solution (above) is not right because you cant ping port...
telefoontoestel at home
23-Nov-2003 09:05
In reply to the function socket_raw_connect posted by "net_del at freemail dot ru". In the function you give a return value and afterwords you try to close the connection. That won't ever work. I think you want to alter your code ;-)
seymour@itsyourdomain
01-Oct-2003 09:43
here's how you can implement timeouts with the socket functions.

this example works for blocking sockets but will work for both blocking and nonblocking with minor modifications. first call to connect in nonblocking mode returns 115 EINPROGRESS, additional calls return 114 EALREADY if the connection has not already failed or succeeded. once the connection succeeds, the socket resource will be returned.

<?
    $host
= "127.0.0.1";
   
$port = "80";
   
$timeout = 15//timeout in seconds

   
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
      or die(
"Unable to create socket\n");

   
socket_set_nonblock($socket)
      or die(
"Unable to set nonblock on socket\n");

   
$time = time();
    while (!@
socket_connect($socket, $host, $port))
    {
     
$err = socket_last_error($socket);
      if (
$err == 115 || $err == 114)
      {
        if ((
time() - $time) >= $timeout)
        {
         
socket_close($socket);
          die(
"Connection timed out.\n");
        }
       
sleep(1);
        continue;
      }
      die(
socket_strerror($err) . "\n");
    }

   
socket_set_block($this->socket)
      or die(
"Unable to set block on socket\n");
?>
net_del at freemail dot ru
26-Aug-2003 10:54
function socket_raw_connect ($server, $port, $timeout,$request)
{
 if (!is_numeric($port) or !is_numeric($timeout)) {return false;}
 $socket = fsockopen($server, $port, $errno, $errstr, $timeout);
 fputs($socket, $request);
 $ret = '';
 while (!feof($socket))
 {
  $ret .= fgets($socket, 4096);
 }
 return $ret;
 fclose($socket);
}

this code for easy raw connect.

Comment by net_del[nkg] (www.nkg.ru)
I am from russia. PHP is good language!
w at ff dot st
28-Jun-2003 11:20
man page for connect :
 EINPROGRESS
The socket is non-blocking and the connection cannot be completed immediately.  It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select indicates  writability,  use  getsockopt(2)  to read the SO_ERROR option at level SOL_SOCKET to determine whether connect completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).

use socket_getoption($socket,SOL_SOCKET,SO_ERROR) . If you get value 115, it is connecting. If you get value different than 115 and 0, that means that an error has occured (see what error with socket_strerror()).

However, I don't know how does that works under Windows, maybe it wont work at all. It is supposed to work under Linux (man pages said that).
greg at mtechsolutions dot ca
30-Apr-2003 11:12
If you're using non-blocking, be sure not to turn it on until after you connect, otherwise you will get the mesasge:

PHP Warning:  socket_connect() unable to connect [115]: Operation now in progress in file.php on line 123

and socket_connect() will return false (even though it will connect).
logan at voerthegame dot com
24-Jul-2002 08:24
I had the same problem with the timeout, and i applied this solution.

It works only on linux PHP, i make a ping to the ip before connect the socket.....

$address = gethostbyname ($ip);
        $command = "ping -c 1 " . $address; 
        $r = exec($command); 
          if ($r[0]=="r")
          {       
            $socket = socket_create (AF_INET, SOCK_STREAM, 0);
            if ($socket < 0) {
                echo "socket_create() failed: reason: " . socket_strerror ($socket) . "\n";
            } else {
                echo "OK.\n";
            }

socket_create_listen> <socket_close
Last updated: Fri, 03 Oct 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites