开发者社区> 问答> 正文

socket连接时:[Errno 99]无法分配需要的地址

  • 用Python建立服务器使用socket发起连接时报出如下错误:OSError:[Errno99] Cannot assign requested address。
  • 百度和google类似的问题,扩大了端口范围、设置了net.ipv4.tcp_tw_reuse=1 等均未解决问题。
  • 云服务器安装ubuntu18.04,若没有错误,应该是服务端持续开启,等待客户端调用完成相应功能并打印日志。在本地ubuntu18.04虚拟机中部署同样的代码,则无错误可以正常使用。云服务器供客户端访问的url和端口号如下图: 类.png

47.11.91.28.png 错误如下图: 无法分配需要地址.png (但此url和端口使用Xftp可以正常连接和传输文件) 更改为其他端口号仍然报一样的错误。 - 若修改rul为172.31.104.103,服务器虽然不会报错可以正常打开,但是客户端访问的时候,会 TimeoutError:[WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 且cmd ping172.31.104.103请求超时。

服务端部分代码如下:

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

def get_k(key):
    """根据key查找读取数据"""
    # ...

if __name__ == '__main__':
    server3 = ThreadXMLRPCServer(('47.111.91.28', 8888))
    server3.register_function(get_k, "get")
    print("Server3 is Listening for Client...")
    server3.serve_forever()

客户端部分代码如下:

from xmlrpc.client import ServerProxy

server3 = ServerProxy("http://47.111.91.28:8888")
...
server3.get(key)

展开
收起
游客hyxbkden6msmg 2020-11-23 11:00:57 2922 0
1 条回答
写回答
取消 提交回答
  • tcpOrder_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #强制允许端口复用 tcpOrder_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) locall_addr = ("", 7890)

    绑定本地信息

    tcpOrder_socket.bind(locall_addr) #print(tcpOrder_socket) tcpOrder_socket.connect((server_ip, int(server_port))) 在最后一行程序 与服务器连接时偶尔会出现 OSError: [Errno 99] Cannot assign requested address 的错误,目前还不知道是什么原因导致如此,以下介绍两种解决办法去避免这种错误:

    方法一:命令行下运行 vim /etc/hosts

    将127.0.1.1 那一行的名字改成你的(用 vi /etc/hostname 获取)

    127.0.0.1 localhost

    127.0.1.1 your hostname #此处的填hostname,记住必须与/etc/hostname中的名字一致!

    以上更改后退出vim 保存更改 如果提示文件为只读状态导致无法更改 那就先去获取超级管理员权限(sudo -s 输入自己的密码进入),然后再去进行以上操作即可

    这种方法可以有效的防止OSError: [Errno 99] Cannot assign requested address错误的发生

    方法二:睁一只眼闭一只眼

    while True: try:# 抓取OSError: [Errno 99] Cannot assign requested address 异常 tcpOrder_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #强制允许端口复用 tcpOrder_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) locall_addr = ("", 7890) # 绑定本地信息 tcpOrder_socket.bind(locall_addr) #print(tcpOrder_socket) tcpOrder_socket.connect((server_ip, int(server_port))) choice_num = input("请输入操作代码:") except Exception as link_fault: continue 使用异常捕获,既然是偶尔出现的错误,那就让程序多执行几次,就能顺利通过,但是如果是一直出现这种错误,不建议用这种方法,因为你会一直卡在这里出不去,进入死循环

    2021-02-24 16:54:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载