Kelicula has asked for the wisdom of the Perl Monks concerning the following question:
I recently ran into a situation where I need to have many many raspberry pi's running all over the country and I need to "talk" to them from a central computer to tell them when to run a particular program I have pre-loaded on them. However the people that will be "hosting" them if you will are very very NON-computer savvy people, so I really can't have them configure their routers to set up VNC or the like connections, so I thought, I can solve this with "Sockets" right? :-) So what I want to do is have the pi's talk to my computer and say "I'm on and running, what do you want me to do?" and then I can send back to them what to do. Problem is I can't get the dang things to connect. :-( I have my router set to forward port 7777 to my computer and I have a no-ip service that hosts a name for my router.
But every time the connection times out and won't connect . What am I doing wrong? Here is my code:
Server Code
use IO::Socket::INET; # auto-flush on socket $| = 1; # creating a listening socket my $socket = new IO::Socket::INET ( LocalHost => '127.0.0.1', LocalPort => '7777', Proto => 'tcp', Listen => 5, Reuse => 1 ); die "cannot create socket $!\n" unless $socket; print "server waiting for client connection on port 7777\n"; while(1) { # waiting for a new client connection my $client_socket = $socket->accept(); # get information about a newly connected client my $client_address = $client_socket->peerhost(); my $client_port = $client_socket->peerport(); print "connection from $client_address:$client_port\n"; # read up to 1024 characters from the connected client my $data = ""; $client_socket->recv($data, 1024); print "received data: $data\n"; # write response data to the connected client $data = "ok"; $client_socket->send($data); # notify client that response has been sent shutdown($client_socket, 1); } $socket->close();
Client Code
#!/usr/bin/perl use IO::Socket::INET; $| = 1; my $socket = new IO::Socket::INET ( PeerHost => 'theaddressofmycomputer.com', PeerPort => '7777', Proto => 'tcp', ); die "Cannot connect to the server $!\n" unless $socket; print "Connected to the server!\n"; my $req = "Hello World\n"; my $size = $socket->send($req); print "Sent data of length $size\n"; shutdown($socket, 1); my $response = ""; $socket->recv($response, 1024); print "Recieved response: $response\n"; $socket->close();
OK, I got it working, thank you to everyone for all your help, it was the windows firewall. I simply had to create an inbound and outbound rule allowing communication on the port I want and it worked like a charm!
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Socket programming Help (updated)
by haukex (Archbishop) on Apr 19, 2016 at 19:52 UTC | |
by Kelicula (Novice) on Apr 19, 2016 at 21:42 UTC | |
by haukex (Archbishop) on Apr 19, 2016 at 22:01 UTC | |
by stevieb (Canon) on Apr 19, 2016 at 22:08 UTC | |
|
Re: Socket programming Help
by mlawren (Sexton) on Apr 19, 2016 at 20:59 UTC | |
|
Re: Socket programming Help
by morgon (Priest) on Apr 19, 2016 at 22:23 UTC |