c – 关于recv和读缓冲区–C Berkeley Sockets

前端之家收集整理的这篇文章主要介绍了c – 关于recv和读缓冲区–C Berkeley Sockets前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用berkeley套接字和TCP(SOCK_STREAM套接字).

过程是:

>我连接到远程地址.
>我发信息给它.
>我收到一封信.

想象一下,我使用以下缓冲区:

char recv_buffer[3000];
recv(socket,recv_buffer,3000,0);

问题是:

>如何在第一次调用recv之后知道读取缓冲区是否为空?如果它不是空的,我将不得不再次调用recv,但是如果我这样做,当它是空的,我会阻止很多时间.
>我怎么知道我读过多少字节到recv_buffer?我不能使用strlen,因为我收到的消息可以包含空字节.

谢谢.

解决方法

How can I know if after calling recv
first time the read buffer is empty or
not? If it’s not empty I would have to
call recv again,but if I do that when
it’s empty I would have it blocking
for much time.

您可以使用selectpoll系统调用以及套接字描述符来告知是否有数据等待从套接字读取.

然而,通常应该有一个同意的协议,发送方和接收方都遵循,以便双方知道要传输多少数据.例如,也许发送方首先发送一个2字节的整数,指示它将发送的字节数.然后,接收器首先读取这个2字节的整数,以便它知道从套接字读取多少个字节.

无论如何,正如Tony在下面指出的那样,一个健壮的应用程序应该使用头文件中的长度信息的组合,并且在每次调用recv之前(或使用非阻塞套接字),结合轮询套接字以获取附加数据.这将阻止您的应用程序阻止,例如,您知道(从标题)仍然需要剩余100个字节进行读取,但是由于任何原因(对等计算机可能是对等体),对等体无法发送数据意外关闭),从而导致您的recv调用被阻止.

How can I know how many bytes I have
readed into recv_buffer? I can’t use
strlen because the message I receive
can contain null bytes.

recv系统调用将返回读取的字节数,如果发生错误则返回-1.

从recv(2)的手册页:

[recv] returns the number of bytes received,or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.

原文链接:https://www.f2er.com/c/110649.html

猜你在找的C&C++相关文章