Bonsoir à tous,

J'ai un petit soucis avec l'exemple du manuel php concernant le serveur tcp/ip dont voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
error_reporting(E_ALL);
 
/* Autorise l'exécution infinie du script, en attente de connexion. */
set_time_limit(0);
 
/* Active le vidage implicite des buffers de sortie, pour que nous
 * puissions voir ce que nous lisons au fur et à mesure. */
ob_implicit_flush();
 
$address = 'localhost';
$port = 10000;
 
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() a échoué : raison : " . socket_strerror(socket_last_error()) . "\n";
}
 
if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
}
 
if (socket_listen($sock, 5) === false) {
    echo "socket_listen() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
}
 
do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() a échoué : raison : " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\Bienvenue sur le serveur de test PHP.\n" .
        "Pour quitter, tapez 'quit'. Pour éteindre le serveur, tapez 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));
 
    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() a échoué : raison : " . socket_strerror(socket_last_error($msgsock)) . "\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);
?>
Je rencontre un léger problème à l'utilisation (en local) :

Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée.
J'en déduis que mon port 10000 n'est pas ouvert pour mon localhost. Du coup j'ai deux questions :
- La première concerne ma démarche, j'exécute le fichier depuis mon navigateur, donc apache, donc le port 80, donc pas le 10000. Est-ce que l'erreur peut venir de là. Si oui, comment exécuter php en ligne de commande? J'ai tenté cette approche sans succés car visiblement les arguments --enable-sockets au lancement de php en ligne de commande ne sont pas pris en compte (malgrés un php.ini correctement modifié pour gérer les sockets). J'en déduis que j'ai rien compris.
- La seconde concerne la manière d'ouvrir un port.

Si vous pensez que je vais dans la mauvaise direction faites moi signe

Bonne soirée,

Smiff.