I have one PHP application which have socket connection. I am thinking for integrate proxy in it so I can make connection using proxy. My current code for connection is like below
public function connect()
{
if ($this->isConnected()) {
return true;
}
/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket !== false) {
$result = socket_connect($socket, 'e'.rand(1, 16).'.myserver.net', Constants::PORT);
if ($result === false) {
$socket = false;
}
}
if ($socket !== false) {
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => Constants::TIMEOUT_SEC, 'usec' => Constants::TIMEOUT_USEC]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => Constants::TIMEOUT_SEC, 'usec' => Constants::TIMEOUT_USEC]);
$this->socket = $socket;
$this->eventManager()->fire('onConnect',
[
$this->phoneNumber,
$this->socket,
]
);
$this->logFile('info', 'Connected to server');
return true;
} else {
$this->logFile('error', 'Failed to connect server');
$this->eventManager()->fire('onConnectError',
[
$this->phoneNumber,
$this->socket,
]
);
return false;
}
}
Let me know if someone have reliable idea for do it. Thanks
Related
I'm trying to catch an exception if socket_connect failed or timeout but it automatically displays an "internal server error"…
My code is below:
//function to make connection
public static function connect()
{
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//create socket
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 5, 'use' => 0));
//set option
try{
//throwing exceptions here
$result = #socket_connect($socket, 127.0.0.1,80);
if ($result === false)
{
throw new customException("connect error");
}
}
//cathcing exception here
catch(customException $e)
{
echo "exception occurs";
}
return $socket;
}
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);
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.
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).
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);
?>