Partage
  • Partager sur Facebook
  • Partager sur Twitter

[WinError 10038]

Une opération à été tentée sur autre chose qu'un socket

    9 septembre 2021 à 10:43:14

    VOILA je code un chatroom en python avec le module socket et je rencontre cette erreur que je parvient pas à comprendre.

    Votre aide me sera précieuse.

    def write(self):
    	message = f"{self.nickname}:{self.input_area.get('1.0', 'end')}"
    	self.sock.send(message.encode('utf-8'))
    	self.input_area.delete('1.0', 'end')

    Et la j'obtient [WinError 10038]

    Merci D'avance

    • Partager sur Facebook
    • Partager sur Twitter
      9 septembre 2021 à 11:07:41

      le message complet de l'erreur c'est que tu essaies de faire une opération sur autre chose qu'un socket (an operation was attempted on something that is not a socket)

      Donc vérifier que sock est bien un socket (et un socket ouvert de préférence, il a pu être fermé avant d'arriver à ce send)

      • Partager sur Facebook
      • Partager sur Twitter
        9 septembre 2021 à 11:19:32

        import socket
        from tkinter import *
        import tkinter as tkinter
        import threading
        from tkinter import simpledialog
        from tkinter import scrolledtext
        HOST ="192.168.1.6"
        PORT =5051
        
        class Client:
        	def __init__(self, host, port):
        		self.sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM  )
        		self.sock.connect((host, port))
        		msg = tkinter.Tk()
        		msg.withdraw()
        		
        		self.nickname = simpledialog.askstring('Nickname', "Please choose a Nickname", parent=msg)
        		self.gui_done = False
        		
        		self.running =True
        		
        		gui_thread = threading.Thread(target =self.gui_loop)
        		receive_thread = threading.Thread(target = self.receive)
        		
        		gui_thread.start()
        		receive_thread.start()
        		
        	def gui_loop(self):
        		self.win =tkinter.Tk()
        		self.win.configure(bg="lightgray")
        		
        		self.chat_label = tkinter.Label(self.win, text="chat", bg="lightgray")
        		self.chat_label.config(font=("Arial ", 12))
        		self.chat_label.pack(padx=20, pady=5)
        		
        		
        		self.chat_area= scrolledtext.ScrolledText(self.win)
        		self.chat_area.pack(padx=20, pady=5)
        		self.chat_area.config(state="disabled")
        		
        		self.msg_label = tkinter.Label(self.win, text="Message :", bg="lightgray")
        		self.msg_label.config(font=("Arial" , 12))
        		self.msg_label.pack(padx=20, pady=5)
        		
        		
        		self.input_area = tkinter.Text(self.win, height=3, width=50)
        		self.input_area.pack(padx=20, pady=5)
        
        		self.send_button =tkinter.Button(self.win, text="Send", command=self.write)
        		self.send_button.config(font=("Arial", 12))
        		self.send_button.pack(padx=20, pady=5)
        		
        		self.gui_done = True
        
        		self.win.protocol("WM_DELETE_WINDOW", self.stop)
        		
        		self.win.mainloop()
        		
        		
        		
        		
        	def write(self):
        		message = f"{self.nickname}: {self.input_area.get('1.0', 'end')}"
        		self.sock.send(message.encode('utf-8'))
        		self.input_area.delete('1.0', 'end')
        			
        	def stop(self):
        		self.running= False
        		self.win.destroy()
        		self.sock.close()
        		exit(0)	
        		
        	def receive(self):
        		while self.running:
        			try:
        				message = self.sock.recv(1024).decode('utf-8')
        				if message =='NICK':
        					self.sock.send(self.nickname.encode('utf-8'))
        				else:
        					if self.gui_done:
        						self.text_area.config(state='normal')
        						self.text_area.insert('end', message)
        						self.text_area.yview('end')
        						self.text_area.config(state='disabled')
        			except ConnectionAbortedError :
        				break
        			except:
        				print('Error')	
        				self.sock.close()
        				break
        		
        client= Client(HOST, PORT)	
        

        C est mon code j'ai vérifier et le socket semble bien ouvert

        Qu'est ce que je peux faire?

        • Partager sur Facebook
        • Partager sur Twitter
          9 septembre 2021 à 12:32:48

          place le sock.send dans un try..except et dans le except, recrée la connexion (tu peux utiliser sock.connect_ex et lire son résultat)

          ça peut aussi venir du côté serveur qui fermerait la connexion trop tôt (un socket.close() mal indenté par exemple)

          • Partager sur Facebook
          • Partager sur Twitter
            9 septembre 2021 à 14:16:35

            J'ai essayer le try et except pour recréer la connexion mais j'ai toujours cette erreur et je crois que c'est clean du coté de mon serveur.

            Par contre je ne connais pas la syntaxe de sock.connect_ex()

            • Partager sur Facebook
            • Partager sur Twitter
              9 septembre 2021 à 15:57:17

              Ca n'a pas marché mais MERCI quand même
              • Partager sur Facebook
              • Partager sur Twitter
                9 septembre 2021 à 16:22:05

                    def write(self):
                        message = f"{self.nickname}: {self.input_area.get('1.0', 'end')}"
                        try: #on essai l'envoie
                            self.sock.send(message.encode('utf-8'))
                        except OSError as err: #si erreur de type OSError
                            print("OSError:", err) # on affiche l'erreur
                            recon=self.soc.connect_ex((HOST,PORT)) # on essaie de se reconnecter (on utilise les valeurs globales ici)
                            if recon = 0: #si connexion réussi
                                print("reconnecté") #on l'affiche dans la console
                            else: # sinon on affiche le numéro de l'erreur
                                print("échec: erreur",recon)
                        else: # si l'envoi à réussi, on efface l'input_area
                            self.input_area.delete('1.0', 'end')
                Tu peux quand même mettre ton code serveur, au cas où

                -
                Edité par umfred 9 septembre 2021 à 16:22:42

                • Partager sur Facebook
                • Partager sur Twitter
                  9 septembre 2021 à 17:07:11

                  J'ai insérer le code at voilà le résultat je crois que le problème vient d'ailleurs peut être mon serveur

                  import socket
                  import threading
                  
                  HOST ="192.168.1.6"
                  PORT =5051
                  SERVER =(HOST, PORT)
                  server= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                  
                  server.bind(SERVER)
                  server.listen()
                  
                  Clients =[]
                  Nicknames =[]
                  
                  def broadcast(message):
                  	for client in Clients:
                  		client.send(message)
                  		
                  def handle(client):
                  	while True:
                  		try:
                  			message =client.recv(1024)
                  			print(f'{Nicknames[Clients.index(client)]} says {message}')
                  			broadcast(message)
                  			
                  		except:
                  			index = Clients.index(client)
                  			Clients.remove(client)
                  			client.close()
                  			nickname =Nicknames[index]
                  			Nicknames.remove(nickname)
                  			break
                  			
                  def receive():
                  	while True :
                  		client ,address =server.accept()
                  		print(f'Connected with {str(address)} !')
                  		
                  		client.send("NICK".encode('utf-8'))
                  		nickname= client.recv(1024).decode('utf-8')
                  		
                  		Nicknames.append(nickname)
                  		Clients.append(client)
                  		print(f'Nickname of the client is {nickname}')
                  		broadcast(f'{nickname} connected to server\n'.encode("utf-8"))
                  		client.send("Connected to the server ".encode('utf-8'))
                  		thread= threading.Thread(target=handle, args=(client,))
                  		thread.start()
                  print('Server running ///')
                  receive()
                  		
                  

                  C'est le code de mon serveur  

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 septembre 2021 à 18:00:45

                    avec tes 2 codes, j'ai le message Error qui apparait côté client, donc on ferme le socket.

                    L'erreur est une erreur d'attribut: 'Client' n'a pas d'attribut 'text_area' => remplacer text_area par chat_area aux lignes 81 à 84 du client 

                    Après pour le message ligne 63, pas obliger d'indiquer le nickname dans le message  (côté serveur, on aura l'affichage "arthur says arthur:  message")

                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 septembre 2021 à 18:22:53

                      Merci beaucoup pour votre aide 

                      Mon code marche bien

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [WinError 10038]

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown