Python3 socket中的OSError:[Errno 22]无效参数

10
我可以帮忙翻译。以下是您需要翻译的内容:

我在 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操作系统中发生):

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

请查看https://dev59.com/BWUq5IYBdhLWcg3wBL0-。 - pfc
8
你发布的代码不可能是你运行的代码:1. 它包含语法错误;2. 它只启动了一个线程,而不是两个;3. accept() 只会在你没有调用 listen() 的情况下才会引发 "无效参数" 错误。 - Andrea Corbellini
1
你正在调用一个未被置于LISTEN状态的套接字上的accept()函数,但这并不是由于这段代码引起的。 - user207421
这个回答解决了你的问题吗?UDP套接字sendto()函数 - Brian Tompsett - 汤莱恩
2个回答

0

-3

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

addr,remoport

分别为字符串和整数。

还有可能是您已经在不同的线程中绑定到套接字。

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

还有一个提示:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接