繁体   English   中英

循环读取Socket?

[英]Reading from Socket in a loop?

我正在 C 中创建服务器/客户端 TCP。

这个想法是让服务器发送相对大量的信息。 但是,客户端的缓冲区大小只有512(我不想增加这个大小),而且很明显,服务器发送的信息比这个大。 让我们想象一下 812 字节。

我想要做的是,在客户端,读取 512 个字节,在客户端的控制台上打印它们,然后读取剩余的字节,并打印它们。

这是应该发生的事情:

1)创建服务器,并阻塞在read()系统调用中(等待客户端写东西);

2)创建客户端,在socket中写入东西,然后阻塞在read()上,等待服务器响应;

3) 服务器的 read() 调用返回,现在服务器必须发送大量数据,使用以下代码(在创建新进程之后):

dup2(new_socketfd, STDOUT_FILENO); // Redirect to socket

execlp("/application", "application", NULL); // Application that prints the information to send to the client

让我们想象一下“应用程序”向套接字打印了 812 个字节的数据。

4) 现在客户端必须读取 812 字节,缓冲区大小为 512。这是我的问题。

我该如何解决这个问题? 我想知道是否可以创建一个循环并读取直到没有可读取的内容,512 x 512 字节。 但是一旦没有什么要读的,客户端就会阻塞在 read() 上。

有任何想法吗?

当 stream 中没有数据时,recv 将阻塞。 从 stream 中提取的任何数据,从 recv 返回长度。 您可以编写一个简单的 function 来提取完整数据,只需使用偏移变量并检查返回值。

像这样一个简单的 function 就可以了。

ssize_t readfull(int descriptor,char* buffer, ssize_t sizetoread){
    ssize_t offset = 0;
    while (offset <sizetoread) {
        ssize_t read = recv(descriptor,buffer+offset,sizetoread-offset,0);
        if(read < 1){
            return offset;
        }
        offset+=read;
    }
    return offset;
}

此外,服务器通常会在数据完成时发送某种 EOF。 服务器可能首先发送要读取的消息的长度,该长度是 4 个或 8 个字节的恒定大小,然后它发送数据,以便您提前知道要读取多少。 或者,例如在 HTTP 的情况下,存在内容长度字段以及“\r\n”分隔符。

实际上,没有办法知道服务器有多少数据可以发送给你,这是不切实际的。 服务器必须通过某种指标告诉你有多少数据。

由于您自己编写服务器,因此您可以首先发送一个四字节消息,该消息可以是客户端应该读取多少数据的 int 值。

所以你的服务器看起来像这样:

int sizetosend = arbitrarysize;
send(descriptor,(char*)&sizetosend,sizeof(int),0);

send(descriptor,buffer,sizetosend,0);

然后在您的客户端,读取四个字节,然后是缓冲区。

int sizetoread = 0;
ssize_t read = recv(descriptor,(char*)&sizetoread,sizeof(int),0);
if(read < 4)
  return;

//Now just follow the code I posted above

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM