跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 刚好工作中遇到的 socket 问题想问一下大家
未分類
29 5 月 2020

刚好工作中遇到的 socket 问题想问一下大家

刚好工作中遇到的 socket 问题想问一下大家

資深大佬 : 18870715400 15

server 端的代码

import socket  server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) addr = ("0.0.0.0", 9000) server.bind(addr) server.listen(5)   while 1:     print("waiting for connection")     client, address = server.accept()     print("connection from {}:{}".format(address[0], address[1]))      while 1:         data = client.recv(1024)         if data == b"":             break         print(data)     client.close()     print("close connection from {}:{}".format(address[0], address[1])) 

client 的代码

import socket  addr = ("localhost", 9000) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(addr) client.close() client.connect(addr)  

运行的时候服务端没有啥问题, 但是在客户端的时候, 我先关闭再连接也就是 client 中的最后一行会报一个错:OSError: [WinError 10038] 在一个非套接字上尝试了一个操作, 我一直不懂为什么会报这个错, 有朋友帮我解释一下么

大佬有話說 (13)

  • 資深大佬 : opengps

    我不懂 py,但我理解 socket 连接不能这么复用(直接断直接重开)。
    在 c#下得先=null 然后重新 new 才能使用新的对象建立连接

  • 資深大佬 : limboMu

    TCP 主动关闭一方,是要等待 2msl 才能复用端口的,重新连接多半是要换一个端口,so 原来的 socket 实例是不能使用的

  • 資深大佬 : ysc3839

    要重新调用 socket.socket 创建个新的吧?

  • 主 資深大佬 : 18870715400

    @limboMu
    等 2msl 是什么意思, 等 2 毫秒么
    client.connect(addr)之前再重新赋值下 client
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    这样就不会报错

  • 主 資深大佬 : 18870715400

    @ysc3839 的确是需要建立一个新的

  • 資深大佬 : est

    client.connect(addr)

    这个不能重复写。得再弄一个 client2

  • 資深大佬 : limboMu

    @18870715400 2msl 是个虚数,很长可能半分钟也可能一分钟,这个取决于操作系统的网络协议栈的实现,建议了解一下 TCP 的状态机

  • 資深大佬 : lackywind

    最后一个 client.connect(addr) 应该是把套接字的句柄给关闭了,需要再重新创建下

    import socket

    addr = (“localhost”, 9000)
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(addr)
    client.close()
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(addr)

  • 資深大佬 : sujin190

    socket 创建的也是文件句柄,你都关闭了,那么这个文件句柄在内核里就直接被释放了啊,你在操作他当然不行了,就好比你一个文件打开然后关闭再读写当然不行了

    第二个也是上面说的,tcp 为了过滤异常包所以关闭后会继续保持占用一段时间端口,立刻重用这个端口也是不行的

  • 資深大佬 : HanMeiM

    2msl 是指两倍的报文最长生存时间,保证被关闭的一方确定收到 ack 和旧数据的清除

  • 資深大佬 : youngce

    刚好之前做过类似 tcp 断线(实际上可能是服务端暂时不可用)重连的机制,一般是 client.close()主动 sleep 一段时间,然后再重新发起 client.connect(addr),这样就避免了你这里的报错

  • 資深大佬 : yannxia

    Socket 被 close 就约等于 FD 被 lose 约等于 此次的 TCP 链路结束了,再 Connect 需要一个 新的 FD,也就是创建一个新的 Socket

  • 主 資深大佬 : 18870715400

    @sujin190 看到你的例子突然懂了, 谢谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具