如果我将在客户端和服务器之间建立连接,并为它们配置不同的缓冲区大小,会发生什么情况。
这是我客户的代码:
import socket,sys
TCP_IP = sys.argv[1]
TCP_PORT = int(sys.argv[2])
BUFFER_SIZE = 1024
MESSAGE = "World! Hello, World!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print "received data:", data服务器代码:
import socket,sys
TCP_IP = '0.0.0.0'
TCP_PORT = int(sys.argv[1])
BUFFER_SIZE = 5
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print 'New connection from:', addr
while True:
data = conn.recv(BUFFER_SIZE)
if not data: break
print "received:", data
conn.send(data.upper())
conn.close()这意味着我将被限制为只有5个字节?这意味着我将无法接收完整的数据包,并将丢失1024-5个数据包?这是否意味着我只能获得5字节的包,这意味着不是在客户端发送时接收1024字节的包,而是我必须将1024除以5得到204.8个包(?)这听起来是不可能的。
这段代码中到底发生了什么?
谢谢。
发布于 2020-11-30 00:00:48
您的论点基于单个send应与单个recv匹配的假设。但事实并非如此。TCP是字节流,而不是基于消息的协议。这意味着所有重要的是传输的字节。如果需要1个或10个recv来读取50个字节,则这并不重要。
除此之外,send也不能保证发送满缓冲区。它可能只发送缓冲区的一部分,即发送者实际上需要检查返回代码,以找出现在实际发送了多少给定缓冲区,以及需要重试多少缓冲区以便稍后发送。
请注意,底层的“数据包”又是另一回事。如果存在2000字节的send,则通常将需要发送多个分组(取决于底层数据链路层的最大传输单元)。但这并不意味着一个人也需要多个recv。如果所有的2000字节已经被传送到接收方的OS级接收缓冲器,那么即使它们在多个分组中传输,也可以一次读取它们。
发布于 2021-06-07 21:47:36
您的套接字不会丢失仅存储在套接字上并准备再次读取的剩余1024 -5 (1019) bytes.it!因此,您需要做的就是再次从套接字读取。您想要读取的缓冲区大小由您自己决定。而且您不限于5个字节,您只是将每次读取的读取缓冲区限制为5个字节。所以对于1024字节的读取,你必须读取204次,加上最后一次读取的时间。但请记住,最后一次读操作使用null填充了最后一个缓冲区索引。这意味着现在没有更多的字节可用。
https://stackoverflow.com/questions/65061942
复制相似问题