Sunday, February 24, 2013

PHP Socket Programming Basics

[caption id="attachment_764" align="aligncenter" width="416"]Socket Programming Socket Programming[/caption]

Welcome to Socket programming with PHP.

Before getting into this tutorial, you should know some bits about socket related network programming. If you know the theory  just skip this introduction.
To understand sockets, first think about client server architecture. The server is running one or more services and the clients thosewho require those services make requests to get those services. Clients can request a service from the server and get it only if there is a connection between them. In another way, server can listen for client requests and serve them if there 's a connection between them.
Then how a client can find a server on a network? On the internet each device is assigned a address called IP address to uniquely identify them. Therefore, if client knows the IP address of the server, he can find it. In the server, there may be multiple services running on different ports. So knowing only the IP address of the server does not help
reach the service. Client should know the exact port where the required service is running. Usually the server publishes its ports allocated for the services so that clients can connect. Most of them are under well-known ports which are in the range between 0 and 1023. While some ports are opened other ports are blocked for security concerns. Obviously port is a security hole where hackers might use for making a connection with the server

When combined  IP address with a port, it is a socket. A socket is one end-point of a two-way communication link between two programs running on the network.

There are two ways of socket programming in PHP. One is socket extension which is widely used and pretty common among PHP developers. PHP functions in this category starts with the prefix socket_ . The second method is using streams and these functions starts with stream_. In this tutorial we are using the first method as it's really simple.

The server read from the socket connection and read the message sent by client. The it writes the  reply to the socket connection and client gets the message from client's socket connection.

Creating the server

[sourcecode language="php"]
<?php
$host = "127.0.0.1";
$port = 25003;
$message = "Hello Client";
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// put server into passive state and listen for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

// accept incoming connections
$com = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($com, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
echo "Client says: ".$input;
socket_write($com, $message , strlen ($message)) or die("Could not write output\n");
// close sockets
socket_close($com);
socket_close($socket);
?>
[/sourcecode]

Creating the client

[sourcecode language="php"]
<?php
$host    = "127.0.0.1";
$port    = 25003;
$message = "Hello Server";

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die ("Could not connect to server\n");
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
echo "Server  says :".$result;
// close socket
socket_close($socket);
?>


[/sourcecode]

No comments:

Post a Comment

How to enable CORS in Laravel 5

https://www.youtube.com/watch?v=PozYTvmgcVE 1. Add middleware php artisan make:middleware Cors return $next($request) ->header('Acces...