wiążą gniazdo
funkcji powiązać można wykorzystać do wiązania gniazdo do określonego adresu i portu. Potrzebuje struktury sockaddr_in podobnej do funkcji łączenia.
Krótki przykład
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if(!socket_bind($sock, "127.0.0.1" , 5000))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
Teraz które wiążą się robi, jego czas, aby gniazdo słuchać połączeń. Łączymy gniazdo z konkretnym adresem IP i określonym numerem portu. W ten sposób zapewniamy, że wszystkie przychodzące dane, które są skierowane na ten numer portu, są odbierane przez tę aplikację.
To powoduje, że nie można mieć 2 gniazd podłączonych do tego samego portu. Są wyjątki od tej reguły, ale przyjrzymy się temu w innym artykule.
nasłuchiwania połączeń
Po związaniu gniazdo do portu następną rzeczą, którą musisz zrobić, to słuchać połączeń. W tym celu musimy umieścić gniazdo w trybie słuchania. Funkcja socket_listen
służy do umieszczenia gniazda w trybie słuchania. Po prostu dodaj następujący wiersz po bindowaniu.
Drugi parametr funkcji socket_listen nazywa się backlog. Kontroluje liczbę połączeń przychodzących, które są utrzymywane "czekając", jeśli program jest już zajęty. Określając 10, oznacza to, że jeśli 10 połączeń oczekuje już na przetworzenie, to 11. żądanie połączenia zostanie odrzucone. Będzie to bardziej oczywiste po sprawdzeniu socket_accept.
Teraz przychodzi główna część przyjmowania nowych połączeń.
akceptację połączenia
Funkcja socket_accept
służy do tego.
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if(!socket_bind($sock, "127.0.0.1" , 5000))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Waiting for incoming connections... \n";
//Accept incoming connection - This is a blocking call
$client = socket_accept($sock);
//display information about the client who is connected
if(socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us.";
}
socket_close($client);
socket_close($sock);
Wyjście
uruchomić program. Należy pokazać $ php /var/www/server.php Gniazdo Socket utworzony wiążą OK Gniazdo słuchać OK Oczekiwanie połączeń przychodzących ...
Więc teraz ten program czeka na połączenia przychodzące na porcie 5000. Nie zamykaj tego programu, nie uruchamiaj go. Teraz klient może się z nim połączyć na tym porcie. Do testowania tego użyjemy klienta Telnet. Otwórz terminal i wpisz telnet localhost $ 5000
Będzie on natychmiast pokazać $ telnet localhost 5000 Trying 127.0.0.1 ... Connected to localhost. Escape to "^]". Połączenie zamknięte przez hosta zagranicznego.
A na wyjściu serwera pojawi się Klient 127.0.0.1: 36689 jest już połączony z nami.
Widzimy więc, że klient jest podłączony do serwera. Wypróbuj powyższe czynności, aż uzyskasz doskonałe działanie.
Uwaga
Funkcja socket_getpeername jest używany, aby uzyskać szczegółowe informacje na temat klienta, który jest podłączony do serwera za pośrednictwem danego gniazda.
Jak to pomoże mi dostać żywe treść zaproszenia SOAP? –
Możesz śledzić referencje PHP, dla lepszego wyjaśnienia na ten temat. http://php.net/manual/en/function.http-get-request-body.php –
@NavnishBhardwaj W jaki sposób opublikowany przez ciebie kod dotyczy "przesyłania strumieniowego odpowiedzi SOAP" z "timeoutem" i/lub "interwał"? To, co widzę na razie, nie rozwiązuje problemu i po prostu nie jest odpowiedzią na to pytanie. Wyjaśnij, dlaczego Twój kod jest przydatny w przypadku problemu. –