加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:39:42 所属栏目:百科 来源:网络整理
导读:我正在使用berkeley套接字和TCP(SOCK_STREAM套接字). 过程是: 我连接到远程地址. 我发信息给它. 我收到一封信. 想象一下,我使用以下缓冲区: char recv_buffer[3000];recv(socket,recv_buffer,3000,0); 问题是: 如何在第一次调用recv之后知道读取缓冲区是
我正在使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读