首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP连接和客户端和服务器的不同缓冲区大小

TCP连接和客户端和服务器的不同缓冲区大小
EN

Stack Overflow用户
提问于 2020-11-29 23:43:59
回答 2查看 306关注 0票数 1

如果我将在客户端和服务器之间建立连接,并为它们配置不同的缓冲区大小,会发生什么情况。

这是我客户的代码:

代码语言:javascript
复制
 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

服务器代码:

代码语言:javascript
复制
 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个包(?)这听起来是不可能的。

这段代码中到底发生了什么?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-30 00:00:48

您的论点基于单个send应与单个recv匹配的假设。但事实并非如此。TCP是字节流,而不是基于消息的协议。这意味着所有重要的是传输的字节。如果需要1个或10个recv来读取50个字节,则这并不重要。

除此之外,send也不能保证发送满缓冲区。它可能只发送缓冲区的一部分,即发送者实际上需要检查返回代码,以找出现在实际发送了多少给定缓冲区,以及需要重试多少缓冲区以便稍后发送。

请注意,底层的“数据包”又是另一回事。如果存在2000字节的send,则通常将需要发送多个分组(取决于底层数据链路层的最大传输单元)。但这并不意味着一个人也需要多个recv。如果所有的2000字节已经被传送到接收方的OS级接收缓冲器,那么即使它们在多个分组中传输,也可以一次读取它们。

票数 3
EN

Stack Overflow用户

发布于 2021-06-07 21:47:36

您的套接字不会丢失仅存储在套接字上并准备再次读取的剩余1024 -5 (1019) bytes.it!因此,您需要做的就是再次从套接字读取。您想要读取的缓冲区大小由您自己决定。而且您不限于5个字节,您只是将每次读取的读取缓冲区限制为5个字节。所以对于1024字节的读取,你必须读取204次,加上最后一次读取的时间。但请记住,最后一次读操作使用null填充了最后一个缓冲区索引。这意味着现在没有更多的字节可用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65061942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档