gpt4 book ai didi

c++ - 在无 block 模式下处理随机数据大小的接收

转载 作者:行者123 更新时间:2023-11-28 06:23:38 25 4
gpt4 key购买 nike

我敢肯定这个问题以前有人问过,也许它只是隐藏在谷歌结果或 Stackoverflow 某处的某个地方。但到目前为止,我已经设置了一个非阻塞缓存服务器。这适用于小消息或数据。但是,如果客户端尝试发送大量数据怎么办?在我使用每个客户端设置的阻塞线程之前,我使用了一个定界符来告诉数据包在哪里结束。在意识到由于硬件限制此路由不可靠之后。因此,如果可能,我将采用单线程方法。

基本上,我想知道如何执行 recv 来捕获附加到单个缓冲区中的数据包,以便在用户发送完数据后使用?

我的一个想法就是像往常一样简单地进行 recv。如果未找到分隔符,则将 recv fork 到一个线程中,并将数据添加到缓冲区中的某处。

I.E

struct tempBuffer{
int socket;
std::string buffer;
bool isDone;
};

std::vector<tempBuffer> temp;

...
if !findDelimiter(recvResponseData)
startThread(collectData, socket);

这是我的 recvAll 的样子:

std::string swiss_cache::recvAll(int socket, bool &quit) {

std::string buffer;
size_t sentBuffer = 0;
quit = false;

//now it is time to receive the page
while(true)
{
char buf[CHUNK_SIZE+1];
memset(buf, 0, strlen(buf));
size_t tmpres = recv(socket, buf, CHUNK_SIZE, 0);

if(tmpres == 0){
quit = true;
return buffer;
}

buffer += (const char*)buf;

if(findEscapeKey(buffer)) { /* FOUND ESCAPE KEYWORD TO LEAVE RECV */
return buffer;
}
}


return buffer;

} /* recvAll */

当客户端必须发送多个数据包时,如何以无阻塞模式从客户端收集单个缓冲区中的数据包?

最佳答案

这归结为如何在单个线程中处理多个套接字上的通信的问题。传统的解决方案是使用 select()poll() 系统调用,它们获取感兴趣的文件描述符集,并返回有关哪些描述符已准备好数据的信息阅读。

使用select(),数据处理循环如下所示:

Zero read-set of file descriptors.
For each client:
add client socket to read-set if client not done.

Call select() on read-set.
# read-set now contains file descriptors with pending data

For each file descriptor in the read-set:
Find the corresponding client.
Do recv() operation on the file descriptor.
Update 'done' status for the client if delimiter found.
Process complete data for the client.

poll() 的逻辑类似。

关于c++ - 在无 block 模式下处理随机数据大小的接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28905198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com