Autor Zpráva
nemeja
Profil
Pěkný den,
díky vývoji jedné aplikace jsem se dostal až k socketům - nikdy jsem s nima nepracoval. Tak jsem se rozhodl, že se jim chvilku budu věnovat, abych si je "ošahal". Narazil jsem na problém při čtení zprávy. Zprávu odešlu z clienta na server a server mi hlásí:
Warning: socket_read() [function.socket-read]: unable to read from socket [0]: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. in C:\wamp\www\socket\server.php on line 29.

Což nechápu, jelikož se clientem připojuji a spojení je vytvořené. Zde kod serveru:
<?php
    set_time_limit(0);
    error_reporting(E_ALL);
    if($socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)){
        echo "Spojení vytvořeno...<br>\n";
    } else {
        echo "Spojení nebylo vytvořeno...<br>\n";
    }
    if(socket_bind($socket,"127.0.0.1",6666)){
        echo "Port nabindován...<br>\n";
    } else {
        echo "Nabindování portu se nezdařilo...<br>\n";
    }
    if(socket_listen($socket,5)){
        echo "Naslouchání spuštěno...<br>\n";
    } else {
        echo "Naslouchání se nezdařilo...<br>\n";
    }
    while(true){
        if(socket_accept($socket)){
            if($zprava = socket_read($socket,2048,PHP_NORMAL_READ)){
                echo "Socket přijat: $zprava <br>\n" ;
            } else {
                echo "Socket chyba:".socket_strerror(socket_last_error($socket));
            }
            exit;
        }
    }                
?>

Klient:
<?php

    error_reporting(E_ALL);
    if($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)){
        echo "Spojení vytvořeno...<br>\n";
        if($spojeni = socket_connect($socket,"localhost",6666)){
            $zprava = "Ahoj";
            if(socket_write($socket, $zprava, strlen($zprava))){
                echo "Zprava odeslana...<br>\n";
            } else {
                echo "Zprava nebyla odeslana...<br>\n";
            }                    
        } else {
            echo "Nepodařilo se spojit se serverem...<br>\n";
        }
    } else {
        echo "Spojení nebylo vytvořeno...<br>\n";
    }            
?>    
Děkuji předem za radu.
nemeja
Profil
Pořád se mi to nepodařilo opravit. Je možné, že to nepovoluje Apache? PHP spouštím na W7 a WAMPu.
juriad
Profil
podle toho co obecně o socketech vím, tak accept vrací nový socket pro každé spojení, kdežto samotný $socket je jen naslouchací socket
řádek 20:
if($accepted = socket_accept($socket)){
a dále používej $accepted místo $socket
nemeja
Profil
Taky nefunguje, vyhazuje unable to read from socket [0]: An existing connection was forcibly closed by the remote host.
juriad
Profil
určitě změna k lepšímu; problém může být v použití read (PHP_NORMAL_READ - reading stops at \n or \r. ), takto nikdy neskončí
zkus binární mód a nebo si pohrát s \n na konci zprávy

navíc v if(socket_write($socket, $zprava, strlen($zprava))){, zapíšeš string bez jakéhokoli terminálu
nemeja
Profil
Po přepnutí do binárního modu mi to krásně funguje, dík :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: