use IO::Socket::INET; use warnings; use strict; # auto-flush on socket $| = 1; # creating a listening socket # => Wir sind der Server fuer den Anwender my $socket_server = new IO::Socket::INET ( LocalHost => '0.0.0.0', LocalPort => '9000', Proto => 'tcp', Listen => 5, Reuse => 1 ); die "cannot create socket $!\n" unless $socket_server; print "server waiting for client connection on port 9200\n"; # create a connecting socket # => Wir sind der Client fuer das Endgeraet my $socket_client = new IO::Socket::INET ( PeerHost => 'destination-srv', PeerPort => '9000', Proto => 'tcp', ); die "cannot connect to the server $!\n" unless $socket_client; print "client-part connected to the server (endpoint)\n"; while(1) { print "\n\n\n"; # waiting for a new client connection my $client_socket = $socket_server->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 "mitm server received data: $data\n"; ##################### ### MITM-PART ### ##################### my $size = $socket_client->send($data); print "mitm client sent data of length ".$size." (".$data.")\n"; # notify server that request has been sent shutdown($socket_client, 1); # receive a response of up to 1024 characters from server my $response = ""; $socket_client->recv($response, 1024); print "mitm client received response: $response\n"; ##################### ### MITM-PART ### ##################### # write response data to the connected client print "mitm server is sending data to real client\n"; $client_socket->send($response); print "mitm server has send data to real client\n"; # notify client that response has been sent shutdown($client_socket, 1); } $socket_client->close(); $socket_server->close();