PHP: soket sorunu dinle

3 Cevap php

İşte benim kod:

<?php

$host = "127.0.0.1";
$portListen = 1234;
$portSend = 1240;


// create socket
$sSender = socket_create(AF_INET, SOCK_STREAM, 0);

socket_connect($sSender, $host, $portListen);

socket_write($sSender, "test", strlen ("test"));


$sListen = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($sListen, $host, $portSend);

socket_listen($sListen,1);
$dataSock = socket_accept($sListen);
echo socket_read($dataSock, 3, PHP_NORMAL_READ);

// close sockets
socket_close($sSender);
socket_close($sListen);
?>

Başka bir uygulamaya "test" göndermek, aldığı ve "teyit" geri göndermek. Sorun sadece bir kez yapabilirsiniz olduğunu. Ben yenilerseniz, ben adresi zaten kullanılan hatadır olsun. I php.net ama boşuna önerdi çözümleri çalıştı. ) (Socket_close önce () socket_shutdown çalışıyorum sadece bana bağlı değil uyarı verir ve ferahlatıcı üzerine bana bitmeyen yükleme verecektir.

Tampon veri hala var çünkü anladığım kadarıyla hemen kapanmadı nedeni yuvadır. Ama gördüğünüz gibi ben açıkça sadece 1 bağlantısı dinlemek için devlet. Ayrıca ben sadece benim uygulamadan 3 karakter gönderme ve bu komut 3 okuyorum.

Ben yanlış ne yapıyorum?

edit: Ben dinleyemiyorum çünkü ben 2 yuvalarını kullanarak yaşıyorum nedeni Soket zaten hata bağlı olduğu bana ver (ki) yazılmasından sonra () 'dir. Dinle atlama () ve () write () sonra bana geçersiz argüman hatası vermek okuma için düz gidiyor.

3 Cevap

Ben bir kaç saat uyku sahip ve benim kod ve dokümantasyon yeniden analiz ettikten sonra, ben her şeyi düzeltmek için yönetilen, bkz. Siz haklısınız, 1 soket gerçekten yeterli ve doğru yolu:

<?php

$host = "127.0.0.1";
$portListen = 1234;
$sSender = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

socket_connect($sSender, $host, $portListen) or die("Could not connect\n");

socket_write($sSender, "test", strlen ("test")) or die("Could not write output\n");

echo socket_read($sSender, 3, PHP_NORMAL_READ);

socket_close($sSender);
?>

O kadar basit!

Bir bağlantı kapatıldıktan sonra paketler kaybolur ve dağıtılamaz edildi (kapat sırasında), tepki yerine temiz bir onay olurdu RST (reset), böylece soket böyle soketi gösteren bir ayrılamamak devlet edildi girer açık. Bu TCP şartnamenin bir parçası, bunu oluyor durdurmak yapamazsınız.

Listen(1) sadece bir bağlantıyı kabul anlamına gelmez, accept() Onlara bir uygulama için bekleyen 1 bağlantılarda bir kuyruğunu korumak anlamına gelir. Yani en kısa sürede ilk kabul olarak, soket daha dinlemek için hazırdır.

Herkes gibi, ben neden tek tasarım merak ediyorum, ama ben sizin sorununuzu sunar ve mutlaka gerçek planı sunmaz, bir haşlanmış aşağı örnek varsayalım.

Why do you need to create 2 sockets for read and write? It looks like an odd design. Client apps usually open a socket connection to the server, then send a request and read the server's response on the same socket. Also, creating a listening socket (iow a server) won't scale past any firewall or NAT gateway.

Yor Yorumlarınız Cevap: dinlemek gerek yok. sadece (Sunucu henüz cevap değil ise muhtemelen çalışmasını engelleme) okuyun.