PHP: Socket server interrupted by socket_recv() - php

I am writing PHP socket server, displayed here is error causing portion. I find out socket_recv() is causing problem, it only lets one computer connect. However, if I comment out socket_recv then its working fine. But I have to receive data also in socket server. Help me find out solution. Please also point out any wrong with code. JQuery part is working fine, hence didn't print it here.
<?php
set_time_limit(0);
$host = '172.28.4.5';
$port = 10000;
$null = NULL;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);
$clients = array($socket);
while(true) {
$new_socket = socket_accept($socket);//Accepting new connection/socket/client if any
$clients[] = $new_socket;//Adding the new client/socket/connection to client array
$header = socket_read($new_socket, 1024);
perform_handshaking($header, $new_socket, $host, $port);
/* If I want to notify if new connection is established**/
socket_getpeername($new_socket, $ip);
$message = "Welcome to WebSocket $ip";
$array = array(
'message' => $message
);
$message = mask(json_encode($array));
write_to_socket($message);
$found = array_search($socket, $clients);
unset($clients["$found"]);
//Going through each client
foreach($clients as $client) {
//Getting messages with loop how many packages for each client has
while(socket_recv($client, $buf, 1024, 0) >= 1) {
$array = json_decode(unmask($buf));
print_r($array);
}
}
}
}
?>

it seems that
the code is wrong
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);
//$clients = array($socket); <---- here
while(true) {
it seems that you add the listened socket to array , you should not receive and data from the listened socket.

Related

Different PHPSESSID in WebSocket handshake

When the WebSocket handshake is done I receive a PHPSESSID different from the one in the browser, why is this?
Client code for connecting:
websocket = new WebSocket("ws://192.168.0.109:9000/php_servers/socketserver1/socketserver.php");
Server code for reading header:
<?php
include "../serverfunctions.php";
include "eventfunctions.php";
$host = '192.168.0.109';
$port = '9000';
$null = NULL;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
socket_listen($socket);
$clients = array($socket);
while (true)
{
$changed = $clients;
socket_select($changed, $null, $null, 0, 10);
if (in_array($socket, $changed))
{
$socket_new = socket_accept($socket);
$clients[] = $socket_new;
$header = socket_read($socket_new, 1024);

Receive broadcast message from 255.255.255.255 in php

I am using following code to broadcast message to 255.255.255.255. I want the client application to receive the message. What would be the receiver side code?
Also is it possible to check the code by running the server and client from the same computer or i must use 2 different computers to test them?
<?php
error_reporting(E_ALL);
$port = 56721;
set_time_limit(0);
$broadcast_string = "test";
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket\n");
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
while(true){
socket_sendto($socket, $broadcast_string, strlen($broadcast_string), MSG_DONTROUTE, '255.255.255.255', $port);
}
socket_close($socket);

php : weird socket_set_nonblock() and socket_connect()

I think there might be some problem with my using socket_set_nonblock(). Without socket_set_nonblock(), socket_select() works, but with socket_set_nonblock(), socket_select() fails. I wrote codes as below.
case 1. fail
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo socket_strerror(socket_last_error()); /* 'success' */
socket_set_nonblock($sock);
echo socket_strerror(socket_last_error()); /* 'success' */
socket_connect($sock, ADDRESS, PORT);
echo socket_strerror(socket_last_error()); /* 'unable to connect [115]: Operation now in progress' */
$read = array($sock); $write = array($sock);
socket_select($read, $write, $e=NULL, TIMEOUT);
echo socket_strerror(socket_last_error()); /* 'unable to connect [115]: Operation now in progress' */
case 2. succeed
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo socket_strerror(socket_last_error()); /* 'success' */
socket_connect($sock, ADDRESS, PORT);
echo socket_strerror(socket_last_error()); /* 'success' */
$read = array($sock); $write = array($sock);
socket_select($read, $write, $e=NULL, TIMEOUT);
echo socket_strerror(socket_last_error()); /* 'success' */
The comments after 'echo's are output of the 'echo's. I can't guess what the problem is. Furthermore, it happens to the only one server I am running. The others are working fine. The environments of the servers are exactly the same. (same os / apache / php version and modules).

Writing a UDP packet forger in PHP

I am working on an UDP spoofer written in PHP and I wanted to know how can I forge those packets. Any help is appreciated. Thank you!
The following function will create a socket in PHP with a port number. Depending on what you are spoofing, you will need to modify the 'message'. In the example below is in clear text but often applications transmit this in the form of binary information which will need to be reserve engineered to spoof it.
function sendUDP($host, $msg, $timeout = 1) {
/* ICMP ping packet with a pre-calculated checksum */
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
socket_connect($socket, $host, 8000); //Set up to send to port 8000, change to any port
socket_send($socket, $msg, strLen($msg), 0);
$buf = "";
$from = "";
$port = 0;
#socket_recvfrom($socket , $buf , 24 , 0 , $from , $port );
socket_close($socket);
return $buf;
}
just read those code:
server.php
<?php
//error_reporting( E_ALL );
set_time_limit( 0 );
ob_implicit_flush();
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
if ( $socket === false ) {
echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";
}
$ok = socket_bind( $socket, '202.85.218.133', 11109 );
if ( $ok === false ) {
echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );
}
while ( true ) {
$from = "";
$port = 0;
socket_recvfrom( $socket, $buf,1024, 0, $from, $port );
echo $buf;
usleep( 1000 );
}
?>
client.php
<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
$msg = 'hello';
$len = strlen($msg);
socket_sendto($sock, $msg, $len, 0, '202.85.218.133', 11109);
socket_close($sock);
?>

php simple socket_listen

I have the following :
$host = "192.168.0.117";
$port = 777;
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
The variable result gives me an error:
unable to listen on socket [0]: An invalid argument was supplied
You need to bind a socket to (address, port) pair first and only then call listen on it.
$host = '192.168.0.117';
$port = '777';
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($socket, $adddress, $port) or die("Could not connect");
socket_listen($socket);
$client_connection = socket_accept($socket);
$input = socket_read($client_connection, 1024);
$output = ereg_replace('[\t\n\r]','', $input).chr(0);
//display output
socket_write($client_connection, $output);
socket_close($client_connection);
socket_close($socket);

Categories