C 在套接字中写入的读数小于

C 在套接字中写入的读数小于,c,sockets,client,buffer,C,Sockets,Client,Buffer,想象一下C语言中的TCP服务器/客户端。想象一下: 1) 在服务器中,我向套接字写入812个字节 2) 在客户端,我只读取512字节 3) 在客户端,我写任何东西 服务器发送的其他300字节会发生什么情况?它们被覆盖了吗 另外,缓冲区大小仅为512,如何读取所有812字节?我能做个循环吗?如何知道read()是否已读取服务器发送的所有内容 谢谢 行为取决于套接字是阻塞还是非阻塞。阻塞将一直等到收到数据。 操作系统将缓冲一定数量的数据,等待您读取,一旦数据已满,服务器将阻止等待缓冲区有空间,或者返

想象一下C语言中的TCP服务器/客户端。想象一下:

1) 在服务器中,我向套接字写入812个字节

2) 在客户端,我只读取512字节

3) 在客户端,我写任何东西

服务器发送的其他300字节会发生什么情况?它们被覆盖了吗

另外,缓冲区大小仅为512,如何读取所有812字节?我能做个循环吗?如何知道read()是否已读取服务器发送的所有内容


谢谢

行为取决于套接字是阻塞还是非阻塞。阻塞将一直等到收到数据。 操作系统将缓冲一定数量的数据,等待您读取,一旦数据已满,服务器将阻止等待缓冲区有空间,或者返回-1 ewoodblock error。 发送的数据将在那里等待,直到客户端读取它。通常,在得到所需内容之前,您希望进行循环阅读

服务器发送的其他300字节会发生什么情况

它们仍然坐在客户机套接字的内部缓冲区中,等待客户机的代码读取它们

它们被覆盖了吗

没有

另外,缓冲区大小仅为512,如何读取所有812字节?我能做个循环吗

是的,这正是你必须要做的。您需要多次读取套接字,直到所有812字节都已读取。读取将告诉您每次调用它时接收的字节数

如何知道read()是否已读取服务器发送的所有内容

套接字无法知道这一点。您在套接字上实现的协议需要说明这一点。对于TCP,只有3个选项:

  • 发送方可以在发送数据之前发送数据的大小。然后,接收器可以先读取大小,然后继续读取,直到接收到指定数量的数据

  • 发送方可以在发送数据后发送唯一的终止符。接收器可以一直读取,直到接收到终止符

  • 发件人可以关闭连接。然后,接收器可以继续读取,直到检测到闭合


  • 1) 在套接字关闭之前,套接字缓冲区中的300字节保持未读状态。它们不会被覆盖。2) 奇怪的问题。当然,在512字节的缓冲区中不能容纳812字节。您必须读取512字节,将这些字节传递给应用程序,然后返回读取剩余的字节。3) 检查文档。它返回recvd字节数,否则错误时返回-1,errno变量将提供有关原因的信息(通常没有更多数据),如果服务器已关闭套接字,则返回0。感谢帮助!你介意检查我自己的答案吗?这对我帮助很大!非常感谢。