Jellytoaster
Jellytoaster

Reputation: 1

An established connection was aborted by the software in your host machine - Python socket

I'm trying to create an online code to a game I'm making. Obviously, running this code gives an error. The error is [WinError 10053] An established connection was aborted by the software in your host machine.

Here's my code: SERVER

from _thread import *
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
server = 'localhost'
port = 5555

server_ip = socket.gethostbyname(server)

try:
    s.bind((server, port))
except socket.error as e:
    print(str(e))

s.listen(2)
print("Currently waiting for other users...")

currentId = "0"
pos = ["0:50,50", "1:100,100"]
def threaded_client(conn):
    global currentId, pos
    conn.send(str.encode(currentId))
    currentId = "1"
    reply = ''
    while True:
        try:
            data = conn.recv(2048)
            reply = data.decode('utf-8')
            if not data:
                conn.send(str.encode("Goodbye"))
                break
            else:
                print("Recieved: " + reply)
                arr = reply.split(":")
                id = int(arr[0])
                pos[id] = reply

                if id == 0: nid = 1
                if id == 1: nid = 0

                reply = pos[nid][:]
                print("Sending: " + reply)

            conn.sendall(str.encode(reply))
        except:
            break

    print("Connection Closed")
    conn.close()

while True:
    conn, addr = s.accept()

    start_new_thread(threaded_client, (conn,))

CLIENT

import time

class Network:
    def __init__(self):
        randomvar = "."
        while True:
            try:
                self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.host = "localhost" # For this to work on your machine this must be equal to the ipv4 address of the machine running the server
                                            # You can find this address by typing ipconfig in CMD and copying the ipv4 address. Again this must be the servers
                                            # ipv4 address. This feild will be the same for all your clients.
                self.port = 5555
                self.addr = (self.host, self.port)
                self.id = self.connect()
                break
            except ConnectionRefusedError:

                if randomvar != "Waiting for server...":
                    print("Waiting for server...")
                    randomvar = "Waiting for server..."

    def getNumber(self):
        pass

    def connect(self):
        self.client.connect(self.addr)
        return self.client.recv(2048).decode()

    def send(self, data):
        """
        :param data: str
        :return: str
        """
        try:
            self.client.send(str.encode(data))
            reply = self.client.recv(2048).decode()
            return reply
        except socket.error as e:
            return str(e)

n = Network()
print(n.send("Host"))
print(n.send("hello"))

On the server, the only things it receives Host, but not hello. That's where I get the error, but It won't tell me which line it is.

Any help?

Upvotes: 0

Views: 4460

Answers (2)

MoralCode
MoralCode

Reputation: 2050

When closing the connection, you are likely forgetting to close both sides.

I was able to modify your code to fit the scenario from this post which explains the root cause of [WinError 10053] An established connection was aborted by the software in your host machine, which lies in the WSAECONNABORTED error from WinSock, the windows sockets api

I made a more detailed answer about this on this SO post.

Upvotes: 0

001
001

Reputation: 13533

You are ignoring the exception. Instead, print it out to get an idea of what is wrong:

Traceback (most recent call last):
  File "D:\temp\python\server.py", line 39, in threaded_client
    id = int(arr[0])
ValueError: invalid literal for int() with base 10: 'Host'

This leads to this line:

id = int(arr[0])

It looks like the server is expecting the messages to be in the form of id:msg but the client is not sending that. It is just sending the message without an id. You can check this in the server.

arr = reply.split(":")
if len(arr) != 2 or !arr[0].isdigit():
    # Handle error....

Upvotes: 2

Related Questions