I am trying to send a message to a socket and read the response back in either PHP or Python. I have tried Telneting into the IP/Port and manually sending a command/receiving a response to verify the server is operating as expected. I have also tried connecting using nc (netcat) and that also works fine. In both cases I get a response immediately after sending a test string.
When I try to code it, I am seemingly able to successfully open a socket and send a message, but there is never a response after sending the test message. I’ve tried coding it in PHP & Python and the result is the same – nothing seems to be waiting to be read back from the socket. The read just times out with a blank response.
This is an example of what I do with nc to test the connection:
$ nc 192.168.85.251 10001 tC <--- I type this, and press enter. tRIN. <--- this is the response
Here’s the Python code I’ve been using:
#!/usr/bin/env python3 import socket HOST = '192.168.85.251' # The server's hostname or IP address PORT = 10001 # The port used by the server with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'tCr') data = s.recv(1024) print('Received', repr(data))
Here’s the equivalent PHP:
<?php $host="192.168.85.251"; $port = 10001; $payload = "tC" . Chr(10); $fp = fsockopen ($host, $port, $errno, $errstr); if (!$fp){ $result = "Error: could not open socket connection"; } else { // write the user string to the socket fputs ($fp, $payload); socket_set_timeout($fp, 5); $feedback = fgets ($fp, 2); echo "Returned: ". $feedback . " ENDn"; } ?>
Can anyone suggest where I might be going wrong?
Advertisement
Answer
s.sendall(b’tCr’)
This is not what is done with telnet or nc. With these tools either b'tCn'
or b'tCrn'
is send but not b'tCr'
. Likely the server does not respond since the expected message is not (fully) received.