gpt4 book ai didi

sockets - 套接字上的服务器响应被截断为 2K

转载 作者:行者123 更新时间:2023-12-03 11:51:15 28 4
gpt4 key购买 nike

我编写了以下函数,用于我用于测试的一组套接字实用程序中。 (如果这很重要,请使用 Python 2.7.3。)我拉出 select 的主要原因将库放入其中,这样我就可以实现超时,而不是永远等待响应。我发现的问题是响应在 2048 个字符处被截断,尽管使用 64K 作为 .recv() 的最大大小。套接字上的方法。在我参与 select 之前没有发生这种截断。 .当我将最大尺寸设置得更高时,它很高兴地通过了 64K 甚至更多。

我浏览了 select 上的一些在线资源我找到了有关接收数据大小的明显上限的任何信息。 IE。没有它存在的信息,更不用说如何修改它了。谁能指出我克服这个 2K 限制的方法?

导入套接字,选择
最大尺寸 = 65535
超时 = 10

def transient 连接(主机、端口、发送数据):
错误,响应=假,''
尝试:
sendSocket = socket.socket()
sendSocket.connect((主机,端口))
sendSocket.send(sendData)
gotData = select.select([sendSocket],[],[],TIMEOUT)
如果(得到数据 [0]):
响应 = sendSocket.recv(MAXSIZE)
别的:
错误=真
response = '*** TIMEOUT ***\n主机没有响应。'
sendSocket.close()
除了异常,errText:
错误,响应 = True,'*** SOCKET 错误 ***\n'+str(errText)
返回(错误,响应)

最佳答案

TCP 套接字为您提供双向字节流,但在较低级别,它是通过基于数据包的协议(protocol) (IP) 实现的。这意味着您可以在每次读取时接收任意流 block (尽管字节都是按顺序排列的),具体取决于 TCP/IP 堆栈如何决定拆分流以进行传输。

这里的关键点是 你必须做recv()循环 直到您收到完整的“应用程序消息”。引用 Socket Programming HOWTO :

Now we come to the major stumbling block of sockets - send and recv operate on the network buffers. They do not necessarily handle all the bytes you hand them (or expect from them), because their major focus is handling the network buffers. In general, they return when the associated network buffers have been filled (send) or emptied (recv). They then tell you how many bytes they handled. It is your responsibility to call them again until your message has been completely dealt with.


您在这里看到的是 select为您提供早期通知 - 只要有一些数据可用。

希望这可以帮助。

关于sockets - 套接字上的服务器响应被截断为 2K,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506025/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com