user3893623
user3893623

Reputation: 321

php sockets - listen on the "internet"?

Using the example from http://www.codeproject.com/Tips/418814/Socket-Programming-in-PHP

SERVER.PHP:

// set some variables
$host = "127.0.0.1";
$port = 25003;
// don't timeout!
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");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
echo "Client Message : ".$input;
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
// close sockets
socket_close($spawn);
socket_close($socket);

CLIENT.PHP:

$host    = "127.0.0.1";
$port    = 25003;
$message = "Hello Server";
echo "Message To server :".$message;
// 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 "Reply From Server  :".$result;
// close socket
socket_close($socket);

As you can see, the server is listening on 127.0.0.1:port and client is connecting to 127.0.0.1:port

However, I want my client and server to be on two different servers.

For example:

My server will listen be on IP 11.22.33.44:1234 and my client will be connecting from IP 12.23.45.66:1234

I am going to be using linux servers, but right now I am doing this on my windows machine.

So I want to listen on my external IP. When I enter my external IP as host, I get errors thrown.

Warning: socket_bind(): unable to bind address [10049]: The requested address is not valid in its context. in C:\xampp\htdocs\server.php on line 12

Warning: socket_listen(): unable to listen on socket [10022]: An invalid argument was supplied. in C:\xampp\htdocs\server.php on line 14

Warning: socket_accept(): unable to accept incoming connection [10022]: An invalid argument was supplied. in C:\xampp\htdocs\server.php on line 17

Warning: socket_read() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\server.php on line 18

Warning: socket_write() expects paramet

er 1 to be resource, boolean given in C:\xampp\htdocs\server.php on line 20

How can I do this?

Thanks.

Upvotes: 0

Views: 2686

Answers (2)

Erdem Ün
Erdem Ün

Reputation: 228

open cmd and write that php -f C:\xampp\htdocs\server.php your code

Upvotes: 1

brandonscript
brandonscript

Reputation: 73034

Since you're (speculation!) probably hosting this service behind a proxy, router, firewall, or other perimeter device, your box won't have direct access to bind to the external IP. Therefore, leave it bound to localhost and forward (open) the applicable ports from the perimeter device to your server.

If, for example, you're using AWS to host, you would set the firewall ACL to permit your socket ports to both servers and then the connections should flow through.

This is akin to binding your Apache web services to the localhost IP address of the server.

Alternatively, if you're not hosting this and communication is happening on a local network, then you should be able to at least bind to the assigned/internal IP address of each local network card.

Upvotes: 1

Related Questions