【问题标题】:OSError: [Errno 22] Invalid argument in python3 socket [closed]OSError:[Errno 22] python3套接字中的参数无效[关闭]
【发布时间】:2013-08-05 04:34:16
【问题描述】:

我在 Python 3 中使用套接字编程时遇到问题。我遇到了一个异常,该异常不会导致程序崩溃,而只是显示在终端中。

这是我的代码:

from PyQt4 import QtCore, QtGui
from imigui import Ui_MainWindow

class imiserv(QtGui.QMainWindow):

    send_msg = pyqtSignal('QString', 'QString')

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.Sport_lineEdit.setMaxLength(5)
        self.ui.Sconnect_pushButton.clicked.connect(self.serv)

        self.send_msg.connect(self.write_msg)

    def write_msg(self, lbl_msg= None, txt_msg= None):
        if lbl_msg:
            self.ui.C_label.setText(lbl_msg)
        if txt_msg:
            self.ui.Clog_textEdit.setText(txt_msg)

    def serv(self):
        MY_LOCK = threading.Lock()
        class CountT(threading.Thread):
            def __init__(self, parent):
                threading.Thread.__init__(self)
                self._parent= parent

            def run(self):
                MY_LOCK.acquire()
                self._parent.send_msg.emit("Waiting connections","")
                while True:
                    cliconn, (addr, remoport)= self._parent.clis.accept()
                    clirecmsg= str(cliconn.recv(1024)
                    self._parent.send_msg.emit("{0}:{1} is connected.".format(addr, remoport), "{0}:{1}".format(addr, remoport)
                    cliconn.close()

                MY_LOCK.release()

        try:
            self.clis= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.clis.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            clierhost= str(self.ui.Sip_lineEdit.text())
            clierport= int(self.ui.Sport_lineEdit.text())
            self.clis.bind((clierhost, clierport))
            self.clis.listen(5)
            a= CountT(self)
            a.daemon= True
            a.start()
        except socket.error as err:
            err= str(err)
            print(err)

以下是发生的错误讨论(此错误仅在 linux os 中显示):

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.3/threading.py", line 637, in _bootstrap_inner
    self.run()
  File "imiclilap.py", line 34, in run
    cliconn, (addr, remoport)= self._parent.clis.accept()
  File "/usr/lib/python3.3/socket.py", line 135, in accept
    fd, addr = self._accept()
OSError: [Errno 22] Invalid argument

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.3/threading.py", line 637, in _bootstrap_inner
    self.run()
  File "imiclilap.py", line 34, in run
    cliconn, (addr, remoport)= self._parent.clis.accept()
  File "/usr/lib/python3.3/socket.py", line 135, in accept
    fd, addr = self._accept()
OSError: [Errno 22] Invalid argument

【问题讨论】:

  • 您发布的代码不能是您运行的代码: 1. 包含语法错误; 2.它只启动一个线程,而不是两个; 3. accept() 可能会在你没有调用listen() 的情况下引发“无效参数”。
  • 您正在调用 accept() 的套接字尚未进入 LISTEN 状态,但没有使用此代码。
  • 这能回答你的问题吗? UDP socket sendto() functions

标签: python sockets python-3.x pyqt4


【解决方案1】:

这是一个详细的答案 https://stackoverflow.com/a/30268744/8447510

简而言之:使用 192.168.1.x 而不是 127.0.0.1

【讨论】:

    【解决方案2】:

    Errorno 22 是定义为“无效参数”的 linux 错误,因此您的地址或端口可能不是正确的类型。检查一下

    地址,remoport

    分别是字符串、整数。

    也有可能你已经在不同的线程中绑定了套接字。

    您可以在 strace 1 中运行您的程序,这将允许您查看正在使用哪些套接字以及是否正在进行一些双重绑定。

    也仅供参考:

    您的程序没有崩溃,因为错误发生在单独的线程中,因此线程正在崩溃,但您的主线程仍在运行。

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 2021-08-25
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多