Doğru socket_select kullanımı ()

1 Cevap php

Veri göndermek ve almak için PHP içinde socket_select kullanmak için doğru yolu nedir?

Ben server TCP ve hem sağlayan bir bağlantı var UDP paket bağlantıları, ben de kullanan duyuyorum. Bu bağlantılar içinde ben yolluyorum hem aynı port üzerinde paketlerinin alınması, ancak TCP paket (29999) ve UDP başka portu gönderilir ({[(2)], bir bağlantı noktasına gönderilir }). İletim tipi AF_INET bu olacaktır. IP adresi döngü olacak 127.0.0.1.

Ben bu senaryo içinde bir soket bağlantısı oluşturmak için nasıl birçok soru var. Örneğin, socket_create_pair bağlantısı yapmak için kullandığınız, ya da sadece socket_create socket_connect ardından kullanın ve ardından uygulamak socket_select daha iyidir ?

Hiçbir veri istemciye sunucudan gönderilir ve bağlantıyı sürdürmek için müşteriye kadar olduğunu bir şans var. Bu socket_select çağrı içindeki fonksiyonunu zaman aşımı kullanılarak yapılacaktır. Hiçbir veri süre içinde gönderilmesi gerekmektedir, socket_select işlevi kırmak ve daha sonra gönderilebilir canlı paket tutacak. Aşağıdaki komut istemcisi olduğunu.

// Create
$TCP = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$UDP = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

// Misc
$isAlive = TRUE;
$UDPPort = 30000;
define('ISP_ISI', 1);

// Connect
socket_connect($TCP, '127.0.0.1', 29999);
socket_connect($UDP, '127.0.0.1', $UDPPort);

// Construct Parameters
$recv = array($TCP, $UDP);
$null = NULL;

// Make The Packet to Send.
$packet = pack('CCCxSSxCSa16a16', 44, ISP_ISI, 1, $UDPPort, 0, '!', 0, 'AdminPass', 'SocketSelect');

// Send ISI (InSim Init) Packet
socket_write($TCP, $packet);

/* Main Program Loop */
while ($isAlive == TRUE)
{
    // Socket Select
    $sock = socket_select($recv, $null, $null, 5);

    // Check Status
    if ($sock === FALSE)
        $isAlive = FALSE; # Error
    else if ($sock > 0)
        # How does one check to find what socket changed?
    else
        # Something else happed, don't know what as it's not in the documentation, Could this be our timeout getting tripped?
}

1 Cevap

Eğer 2 soketleriyle gelen uyumsuz istekleri ile başa çıkmak için çalışıyor ama hem müşteriler gibi davranıyorsun görünüyor - Ben biraz karışık mı? Bu çok sıradışı bir senaryodur. Farklı protokolleri (TCP ve UDP) kullanarak bunları uygulamak için çalışıyor olmak (H323 VOIP yapar hangi bildiğim tek applciation olan) bile tuhaf hususun olduğunu. Ama neden aynı anda çalıştıran bir TCP ve UDP istemci gerek yok - Hızlı google Eğer LFS'den için bir istemci yazmak için çalışıyoruz öneriyor? (Btw http://en.lfsmanual.net kendi Wiki üzerinde uygun PHP istemci kodu yayınlama)

Çağrı) (yani dizi) aşağı kesilmiş ve socket_select bir sonraki yineleme (önce repopulated gerekiyor edilir) (socket_select sonra okumak için bekleyen veri var soket $ recv dizi olacak.

Socket_select 0 dönerse sadece yuva engellenmeyen ve bunların hiçbiri kullanılabilir herhangi bir veri var demektir.

HTH

C.