2012-01-23 15 views
6

Próbuję wysyłać i odbierać dane przez gniazdo PHP.Użyj gniazda PHP do wysyłania i odbierania danych

Evrything jest OK, ale kiedy próbuję wysłać dane PHP nic nie wysyła (Wireshark powiedział mi, że wysłana długość danych wynosiła 0).

Używam tego kodu:

<?php 
$address = 'example.com'; 
$port = 1234; 

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
$sockconnect = socket_connect($sock, $address, $port); 

$c = 0; 
do { 
    $c++; 
    $msg = '<test>Xml data</test>'; 

    socket_write($sock, $msg, strlen($msg)); 

    echo socket_read($sock, 1024 * 100, PHP_NORMAL_READ); 

} while ($c < 3); 

socket_close($sock); 

Czy ktoś może mi pomóc? Dzięki za przeczytanie mojego pytania.

Odpowiedz

7

Skąd wiadomo, że wszystko jest w porządku, jeśli nie sprawdzasz błędów nawet raz?

Rozważmy następujący example from the manual:

<?php 
error_reporting(E_ALL); 

/* Get the port for the WWW service. */ 
$service_port = getservbyname('www', 'tcp'); 

/* Get the IP address for the target host. */ 
$address = gethostbyname('www.example.com'); 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . 
     socket_strerror(socket_last_error()) . "\n"; 
} 

echo "Attempting to connect to '$address' on port '$service_port'..."; 
$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . 
      socket_strerror(socket_last_error($socket)) . "\n"; 
} 

$in = "HEAD/HTTP/1.1\r\n"; 
$in .= "Host: www.example.com\r\n"; 
$in .= "Connection: Close\r\n\r\n"; 
$out = ''; 

echo "Sending HTTP HEAD request..."; 
socket_write($socket, $in, strlen($in)); 
echo "OK.\n"; 

echo "Reading response:\n\n"; 
while ($out = socket_read($socket, 2048)) { 
    echo $out; 
} 

socket_close($socket); 
?> 
+0

Nie ma żadnych błędów, ale zdalny host robi nie odpowiadaj mi jeszcze raz. Ale działa poprawnie, gdy wysyłam dane przez SocketTest v3.0 – ucha

+0

Czy mój przykład polecenia 'HEAD' działa w twoim systemie? – sanmai

+0

Tak, działa na innych hostach, ale muszę wysyłać tylko dane xml, ponieważ mój host nie odpowiada na żądania HTTP head z żadnego portu z wyjątkiem 1980. Nie odpowiada mi (nawet przy użyciu twojego przykładu) kiedy wysyłam XML dane. – ucha

1

Nie używasz funkcji gethostbyname, więc próbuje się połączyć z nieistniejącego adresu ip

<?php 
$address= gethostbyname('yourdata.com'); 
Powiązane problemy