微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/c/110649.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐