【问题标题】:Reuse the same socket to send and receive (Python)重用同一个套接字发送和接收(Python)
【发布时间】:2015-11-22 23:48:49
【问题描述】:

我编写了一个简单的脚本来使用 Python 套接字模块发送和接收消息。我想先使用sendMsg 发送消息,然后使用listen 接收响应。 sendMsg 工作正常,但是当我的服务器发送响应时,我收到错误:

“[WinError 10038] 尝试对非套接字的操作”

我关闭sendMsg 中的套接字连接,然后尝试在listen 中绑定它,但正是在这一行产生了错误。请有人告诉我我做错了什么!

import socket

port = 3400
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), port))

def sendMsg():

    print("\nSending message:\n\n")
    msg = ("Sample text").encode("utf-8")
    s.send(msg)
    s.close()

def listen():

    s.bind(("", port))
    s.listen(1)

    serverSocket, info = s.accept()
    print("Connection from", info, "\n")
    while 1:
        try:            
            buf = bytearray(4000)
            view = memoryview(buf)
            bytes = serverSocket.recv_into(view, 4000)
            if bytes:
                stx = view[0]
                Size = view[1:3]
                bSize = Size.tobytes()
                nTuple = struct.unpack(">H", bSize)
                nSize = nTuple[0]
                message = view[0:3+nSize]
                messageString = message.tobytes().decode("utf-8").strip()
                messageString = messageString.replace("\x00", "")
            else:
                break
        except socket.timeout:
            print("Socket timeout.")
            break

sendMsg()

listen()

注意:我在一个单独的客户端中实现了listen并使用了该行

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 3)

s.bind()s.connect() 之前。这工作正常。不过,将这一切都集中在一个客户端中会很好。

【问题讨论】:

    标签: python sockets port bind listen


    【解决方案1】:

    根据文档,socket.close() 将关闭套接字,并且不允许对其进行进一步的操作。

    所以在您的代码中,这一行 s.close() 正在关闭套接字。

    因为s.bind(("", port)) 将无法工作,因为套接字s 已经关闭!

    【讨论】:

    • 我明白了,谢谢。那么问题是我在s.bind 得到“[WinError 10022] 提供了一个无效的参数”。我尝试在这里使用s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 3) 以允许重用没有运气..
    • s.bind() 之前尝试s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    • 是的,我认为这已经解决了!感谢您的帮助
    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多