过程是:
>我连接到远程地址.
>我发信息给它.
>我收到一封信.
想象一下,我使用以下缓冲区:
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.
您可以使用select
或poll
系统调用以及套接字描述符来告知是否有数据等待从套接字读取.
然而,通常应该有一个同意的协议,发送方和接收方都遵循,以便双方知道要传输多少数据.例如,也许发送方首先发送一个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.