简体   繁体   中英

Python socket library: OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected

OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied.

I am getting the above error..My server and client can send and receive their first messages but I get this error if I try to send more than one message.

My Server Code is here

import socket
import threading
import time
from tkinter import *


#functions
def t_recv():
    r = threading.Thread(target=recv)
    r.start()

def recv():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listensocket:
        port = 5354
        maxconnections = 9
        ip = socket.gethostbyname(socket.gethostname())
        print(ip)
        server = (ip, port)
        FORMAT = 'utf-8'

        listensocket.bind((server))
        listensocket.listen(maxconnections)
        (clientsocket, address) = listensocket.accept()
        msg = f'\[ALERT\] {address} has joined the chat.'
        lstbox.insert(0, msg)

    while True:
        sendermessage = clientsocket.recv(1024).decode(FORMAT)
        if not sendermessage == "":
            time.sleep(3)
            lstbox.insert(0, 'Client: ' +sendermessage)

def t_sendmsg():
    s = threading.Thread(target=sendmsg)
    s.start()

at = 0

def sendmsg():
    global at
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as g:
        hostname = 'Lenovo-PC'
        port = 5986

        if at==0:
            g.connect((hostname, port))
            msg = messagebox.get()
            lstbox.insert(0, 'You: ' +msg)
            g.send(msg.encode())
            at += 1

        else:
            msg = messagebox.get()
            lstbox.insert(0, 'You: ' +msg)
            g.send(msg.encode())      

And my client code is same with minor difference

import socket
import time
import threading
from tkinter import *

#functions
def t_recv():
    r = threading.Thread(target=recv)
    r.start()

def recv():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listensocket:
        port = 5986
        maxconnections = 9
        ip = socket.gethostname()
        print(ip)
        FORMAT = 'utf-8'
        host = 'MY_IP'    # My actual ip is there in the code

        listensocket.bind((host, port))
        listensocket.listen(maxconnections)
        (clientsocket, address) = listensocket.accept()


        while True:
            sendermessage = clientsocket.recv(1024).decode(FORMAT)
            if not sendermessage == "":                 
                time.sleep(3)                 
                lstbox.insert(0, 'Server: ' +sendermessage)

def t_sendmsg():
    s = threading.Thread(target=sendmsg)
    s.start()

at = 0

def sendmsg():
    global at
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as g:
        hostname = 'Lenovo-PC'
        port = 5354

        if at==0:
            g.connect((hostname, port))
            msg = messagebox.get()
            lstbox.insert(0, 'You: ' +msg)
            g.send(msg.encode())
            at += 1

        else:
            msg = messagebox.get()
            lstbox.insert(0, 'You: ' +msg)
            g.send(msg.encode())        

Please let me know what changes are required to be made in order to make it run for every message.

I tried to put

g.connect((hostname, port))

the above line in the loop so that it will connect every time loop iterates. But it did not help.

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as g:
    ...

    if at==0:
        g.connect((hostname, port))
        ...
        g.send(msg.encode())
        at += 1

    else:
        ...
        g.send(msg.encode())   

In the if at==0 condition it connects to the server, in the else part not. But is still trying to send something on the not connected socket.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM