Python socket error: Can't convert 'tuple' object to str implicitly - python

I start to build a simple client - server chat room today and I am new to Python and network connection. I made a simple code on server something like this:
HOST = socket.gethostname()
PORT = 21238
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
On the client:
HOST = socket.gethostbyaddr('54.201.33.XX') #54.201.33.XX is my EC2 public IP
PORT = 21237
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
I have already running my server code on server and when I am trying to run client code on my PC. I got the error:
Traceback (most recent call last):
s.connect((HOST, PORT))
TypeError: Can't convert 'tuple' object to str implicitly
I have found some sample codes but nealy all of them are using local host. Thank you for your helps.
/////
Based on #Jon S.'s answer. My client code should be
HOST = '54.201.33.XX'
But still time out to connect to server. I am sure my ip is correct.

The problem is
HOST = socket.gethostbyaddr('54.201.33.XX')
in your second example. gethostbyaddr returns a tuple, containing (hostname, a list of aliases, ip addresses). connect expects a string as the first element of the tuple that specifies the address and port to connect to.
You can change this to
HOST = '54.201.33.XX'
and it should work.

I found the answer.
On server, the HOST = socket.gethostname(); On client, the HOST = '54.201.33.XX', which is your server ip address
In EC2, the default security setting is only open ssh. You should open the Port you have used in your codes. The operations are following:
2.1 Enter AWS console and enter EC2
2.2 Find Security Group on the left under NETWORK & SECURITY
2.3 Click your current security group (For me, it is not the default one) and open Inbound on the below information
2.4 Choose Custom TCP rule and enter your Port range (21237 in my pasted code) and click on add Rules
2.5 DO NOT forget to press button "Apply Rule Changes"!!!

Related

Win Error 10061 No connection could be made because the target machine actively refused it

I have been experimenting with the socket library for python. I made a simple program for the server and client where the client can message the server.
Here is my code for the server:
import socket
print("Host")
socket_main = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_main.bind(('127.0.0.1', 9999))
socket_main.listen(1)
conn, addr = socket_main.accept()
while True:
data = conn.recv(1204).decode()
print(data)
conn.close()
Here is my code for the client
import socket
print("Client")
socket_main = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_main.connect(('127.0.0.1', 9999))
while True:
message = input(": ")
socket_main.send(message.encode())
socket_main.close()
When I run these programs in two different terminals on one computer it works just fine, but when I try to run the server and client on different computers I get an error on the clients end saying, "No connection could be made because the target machine actively refused it".
I have tried changing the port multiple times but it didn't help. I have looked through a lot of other forums and I haven't been able to fix this problem for a while now so I decided to ask here.
when I try to run the server and client on different computers I get an error on the clients end
That is because you are using127.0.0.1 on both sides. That is the localhost loopback IP address. It works when the client and server are on the same machine, but it is not routable on the LAN network.
You need to:
change the server to listen on either 0.0.0.0 (to listen on all installed network interfaces), or its actual LAN IP address (just the network interface attached to the LAN).
change the client to connect to the server's hostname or IP address on the LAN.
I have tried changing the port multiple times but it didn't help
The problem is nit with the port, but with the IP address.

Firewall is not allowing my python client application to connect to a server running on my machine even after I turn off firewall completely

I am learning about the python socket library and am running into problems whenever I try to connect to the server running on my localhost with a client application.
Here is the server code:
import socket
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
print(data)
Here is the code for my client application:
import socket
HOST = "localhost" # The server's hostname or IP address
PORT = 65432 # The port used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Here is my error message:
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
Here is what I have tried so far:
Disabling my Window's 10 firewall completely on the windows command prompt with the use of the following command:
netsh advfirewall set allprofiles state off. This did not work
To windows firewall I added an inward rule and outward rule that allows any application on my OS to access a service running on port 65432
I changed my python version from 3.8.2 to 3.7.7 because before hand I was able to run this code perfectly and I was using a python 3.7 version
I tried multiple different methods of setting the HOST variable, which include "localhost", '127.0.0.1', socket.gethost(), and socket.gethostbyname("localhost")
I am able to connect to the server through the use of the Window's telnet application but that is it. To be honest I have exhausted possible solutions that I can find online, and I know that this question has came up on this website a lot, but I have honestly tried every solution I have seen so far - which included three hours of searching.
I appreciate any possible help that you guys can give, thanks.
Since the code was working earlier in the machine,this doesn't seem to be code issue.
Also the code ran fine in my machine.
I suggest you to run through the below steps once again:
Solution 1:
1. edit the server address as 127.0.0.1 or the host private IP in both the code just to be assured there is no discrepancy.
2. Start the server program first and make sure it didn't terminate.
3. Start the client application and check if the server program threw any error or exceptions.
Solution 2:
Change the port number and follow solution 1.
Solution 3:
Switch off the windows firewall from the UI just to be sure.
Follow the solution 1 steps
Solution 4:
Change the server address as host=''

Python websockets server works on localhost but not on server

I made a basic chat client and server using python websockets, ran it on my pc and it worked completely fine, when I uploaded it to my windows server machine (which has the port '12345' forwarded) and tried to access it using a client from my pc I got a ConnectionRefusedError
I've tried switching to a different port (which was also forwarded) but it didn't change the result
The client (this is the bit that caused the error)
ip = input("IP Address: ")
port = int(input("Port: "))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
The server
def open_socket(PORT:int, MAX_USERS:int):
new_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ("localhost", PORT)
new_socket.bind(server_address)
new_socket.listen(MAX_USERS)
return new_socket
Here's the error:
Traceback (most recent call last):
File "client.py", line 24, in <module>
sock.connect((ip, port))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
EDIT: After trying out Jin's answer I'm now getting a timeout error at the same place (line 24 in client.py)
EDIT #2: It is now working! I changed the port to the original one (12345) and I successfully connected to the server!
Even though you changed a port forward config in your router, you still need to check whether your server is accepting incoming traffic in the firewall setting. You can do this from Control Panel-Security or Windows Firewall (Sorry I don't remember the exact name of the menu of the Windows).
You should bind your IP with the socket, not localhost. You would want to programmatically get your IP address, rather than using hard-coded one. The followed link would help.
Finding local IP addresses using Python's stdlib

Why am I getting the error "connection refused" in Python? (Sockets)

I'm new to Sockets, please excuse my complete lack of understanding.
I have a server script(server.py):
#!/usr/bin/python
import socket #import the socket module
s = socket.socket() #Create a socket object
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
s.listen(5) #Wait for the client connection
while True:
c,addr = s.accept() #Establish a connection with the client
print "Got connection from", addr
c.send("Thank you for connecting!")
c.close()
and client script (client.py):
#!/usr/bin/python
import socket #import socket module
s = socket.socket() #create a socket object
host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service
s.connect((host,port))
print s.recv(1024)
s.close
I go to my desktop terminal and start the script by typing:
python server.py
after which, I go to my laptop terminal and start the client script:
python client.py
but I get the following error:
File "client.py", line 9, in
s.connect((host,port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
I've tried using different port numbers to no avail. However, I was able to get the host name using the same ip and the gethostname() method in the client script and I can ping the desktop (server).
Instead of
host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) #Bind to the port
you should try
port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port
so that the listening socket isn't too restricted. Maybe otherwise the listening only occurs on one interface which, in turn, isn't related with the local network.
One example could be that it only listens to 127.0.0.1, which makes connecting from a different host impossible.
This error means that for whatever reason the client cannot connect to the port on the computer running server script. This can be caused by few things, like lack of routing to the destination, but since you can ping the server, it should not be the case. The other reason might be that you have a firewall somewhere between your client and the server - it could be on server itself or on the client. Given your network addressing, I assume both server and client are on the same LAN, so there shouldn't be any router/firewall involved that could block the traffic. In this case, I'd try the following:
check if you really have that port listening on the server (this should tell you if your code does what you think it should): based on your OS, but on linux you could do something like netstat -ntulp
check from the server, if you're accepting the connections to the server: again based on your OS, but telnet LISTENING_IP LISTENING_PORT should do the job
check if you can access the port of the server from the client, but not using the code: just us the telnet (or appropriate command for your OS) from the client
and then let us know the findings.
Assume s = socket.socket()
The server can be bound by following methods:
Method 1:
host = socket.gethostname()
s.bind((host, port))
Method 2:
host = socket.gethostbyname("localhost") #Note the extra letters "by"
s.bind((host, port))
Method 3:
host = socket.gethostbyname("192.168.1.48")
s.bind((host, port))
If you do not exactly use same method on the client side, you will get the error: socket.error errno 111 connection refused.
So, you have to use on the client side exactly same method to get the host, as you do on the server. For example, in case of client, you will correspondingly use following methods:
Method 1:
host = socket.gethostname()
s.connect((host, port))
Method 2:
host = socket.gethostbyname("localhost") # Get local machine name
s.connect((host, port))
Method 3:
host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((host, port))
Hope that resolves the problem.
host = socket.gethostname() # Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((host,port)) # Bind to the port
I think this error may related to the DNS resolution.
This sentence host = socket.gethostname() get the host name, but if the operating system can not resolve the host name to local address, you would get the error.
Linux operating system can modify the /etc/hosts file, add one line in it. It looks like below( 'hostname' is which socket.gethostname() got).
127.0.0.1 hostname
in your server.py file make : host ='192.168.1.94' instead of host = socket.gethostname()
Pay attention to change the port number. Sometimes, you need just to change the port number. I experienced that when i made changes over changes over syntax and functions.
I was being able to ping my connection but was STILL getting the 'connection refused' error. Turns out I was pinging myself! That's what the problem was.
I was getting the same problem in my code, and after thow days of search i finally found the solution, and the problem is the function socket.gethostbyname(socket.gethostname) doesnt work in linux so instead of that you have to use socket.gethostbyname('put the hostname manually') not socket.gethostbyname('localhost'), use socket.gethostbyname('host') looking with ifconfig.
try this command in terminal:
sudo ufw enable
ufw allow 12397

Errno 10061 : No connection could be made because the target machine actively refused it ( client - server )

I have a problem with these client and server codes, I keep getting the [Errno 10061] No connection could be made because the target machine actively refused it
I'm running the server on a virtual machine with Windows XP SP3 and the client on Windows 7 64bit, my python version is 2.7.3. What I want to know is how should I edit the code to use the client and server on different networks! Thanks!
server :
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = '0.0.0.0' # Get local machine name
port = 12345 # Reserve a port for your service.
print 'Server started!'
print 'Waiting for clients...'
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
while True:
msg = c.recv(1024)
print addr, ' >> ', msg
msg = raw_input('SERVER >> ')
c.send(msg);
#c.close() # Close the connection
client :
#!/usr/bin/python # This is client.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
print 'Connecting to ', host, port
s.connect((host, port))
while True:
msg = raw_input('CLIENT >> ')
s.send(msg)
msg = s.recv(1024)
print 'SERVER >> ', msg
#s.close # Close the socket when done
PS : code is from internet.
10061 is WSAECONNREFUSED, 'connection refused', which means there was nothing listening at the IP:port you tried to connect to.
There was a firewall product around the year 2000 that issued refusals instead of ignoring incoming connections to blocked ports, but this was quickly recognised as an information leak to attackers and corrected or withdrawn.
Hint: actively refused sounds like somewhat deeper technical trouble, but...
...actually, this response (and also specifically errno:10061) is also given, if one calls the bin/mongo executable and the mongodb service is simply not running on the target machine. This even applies to local machine instances (all happening on localhost).
➪ Always rule out for this trivial possibility first, i.e. simply by using the command line client to access your db.
See here.
So I was facing the same issue,
and the solution that worked for me was...
I am assuming your server and client program are written in python.
First, open one python shell
open and run the Server program first
then open another different python shell
open and run the Client program here
done !!
Using the examples from: https://docs.python.org/3.2/library/socketserver.html
I determined that I needed to set the HOST port to the machine I had the server program running on. So TCPServer on 192.168.0.1 HOST = TCPServer IP 192.168.0.1 then I had to set the TCPClient side to point to the TCPServer IP. So the TCPClient HOST value = 192.168.0.1 - Sorry, that's the best I can describe it.
There is no relationship between error and firewall.
first, run server program,
then run client program in another shell of python
and it will work
instead of localhost of '0.0.0.0', use local network address as host in case of both - the server and the client - code.
host = '192.168.12.12'
port = 12345
use this host address when binding and connecting to the socket.
server.bind((host, port))
client.connect((host, port))
this change solved the issue for me.
The solution is to use the same IP and Port number in both client and server.
Try, in client to use
TCP_IP = 'write the ip number here'
TCP_PORT = writ the port number here
s.connect((TCP_IP, TCP_PORT))
if you have remote server installed on you machine. give server.py host as "localhost" and the port number.
then client side , you have to give local ip- 127.0.0.1 and port number.
then its works
I was facing a similar problem when I was calling REST API using python library and what I found that my server was going into sleep mode which was leading to this. As soon as I logged in to the server via Remote Desktop Connection, my API call used to work.
This could be because of proxy or firewall. If it's proxy, then you need to specify proxy setting at entry point of your code or project.
import os #for proxy
proxy = 'http://10.XX.XX.XX:8X8X' #your own proxy 'http://<user>:<pass>#<proxy>:<port>'
os.environ['http_proxy'] = proxy
os.environ['HTTP_PROXY'] = proxy
os.environ['https_proxy'] = proxy
os.environ['HTTPS_PROXY'] = proxy
#rest of code .....
The below changes fixed my problem.
I struggled with the same error for a week. I would like to share with you all that the solution is simply host = '' in the server and the client host = ip of the server.  
The first: Please make sure your port '12345' is opening and then
when you using a different network. You have to use the IP address in LAN. Don't use the 'localhost' or '127.0.0.1'.
The solution here is:
In server
host = '192.168.1.12' #Ip address in LAN network
In client
host = '27.32.123.32' # external IP Address
Hope it works for you
I had errors 10060 and 10061. The reason was in my antivirus(Eset Nod 32). Try to turn off the Firewall of your antivirus as I did or just delete it for a time to test the program. If everything started to work properly, add that program to the exclusion or switch to another antivirus.
Also, try to change the 'host' variable to an empty string:
host = ''
And add socket.AF_INET, socket.SOCK_STREAM to the 's' variable:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
I was doing this tutorial and they said that windows users will have a problem. They said that you can check the Windows Firewall to fix the problem. Let me show you a quick Google Search on how to change the windows firewall:
Go to Start and open Control Panel. Select System and Security > Windows Defender Firewall. Choose Turn Windows Firewall on or off. Select Turn on Windows Firewall for domain, private, and public network settings.
After that, your app should work. Also, in your client(not server side) the port should be 0.0.0.0 and in the server side, it should be 127.0.0.1.
If the client and server are running on the same machine (as in running 2 programs), it's OK to config both IP address as locahost. However, if you are to run them on different machines (including VMs), you need to
Make sure they are on the same subnet (usually by pinging each other)
The Server needs to config the host IP as its IP address (like 192.168.xxx.xxx instead of localhost or 127.0.0.1). You may find the IP address by running ipconfig on Windows or ip a on Unix-like server
This change worked for me with my Client on Windows and Server on Ubuntu VM.
Some of the other solutions will work if you want to run server.py and client.py on the same machine. I wanted to try and run it on two different machines (windows and raspberry pi), but on the same network.
For me, it was a matter of choosing the correct IP address. If my windows machine is the server, I used the IPV4 address of the windows machine. This can be found by running ipconfig in the command prompt and selecting the 192.168.X.X number. The raspberry client side bounded to the same address. If the raspberry pi is the server, then I would bind to the inet address. You can find this by running ifconfig in the terminal (again the 192.168.X.X).
Note though, the IP addresses are temporary. I believe if you want a more permanent set-up, the server IP address needs to be bound to the router's IP address, then port-forward to the server. That way, the client wouldn't even have to be on the same network.
First you have to start your server( run server.py ) using Command prompt and after that you can easily run client.py because you need a server first which will host so that client.py could be run.
the short term solution is to use the default iis host and port normally 120.0.0.1 and 80 respectively. However am still looking for a more versatile solution.
When you run the code on windows machine, firewall prompts it to allow network access, allow the network access and it will work, if it does not prompts, go to firewall settings > allow an app through firewall and select your python.exe and allow network access.

Categories

Resources