c – 关于recv和读缓冲区–C Berkeley Sockets
我正在使用berkeley套接字和TCP(SOCK_STREAM套接字).
过程是: >我连接到远程地址. 想象一下,我使用以下缓冲区: char recv_buffer[3000]; recv(socket,recv_buffer,3000,0); 问题是: >如何在第一次调用recv之后知道读取缓冲区是否为空?如果它不是空的,我将不得不再次调用recv,但是如果我这样做,当它是空的,我会阻止很多时间. 谢谢. 解决方法
您可以使用 然而,通常应该有一个同意的协议,发送方和接收方都遵循,以便双方知道要传输多少数据.例如,也许发送方首先发送一个2字节的整数,指示它将发送的字节数.然后,接收器首先读取这个2字节的整数,以便它知道从套接字读取多少个字节. 无论如何,正如Tony在下面指出的那样,一个健壮的应用程序应该使用头文件中的长度信息的组合,并且在每次调用recv之前(或使用非阻塞套接字),结合轮询套接字以获取附加数据.这将阻止您的应用程序阻止,例如,您知道(从标题)仍然需要剩余100个字节进行读取,但是由于任何原因(对等计算机可能是对等体),对等体无法发送数据意外关闭),从而导致您的recv调用被阻止.
从recv(2)的手册页:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |