服务器连接中正在排队的recv

服务器连接中正在排队的recv,c,sockets,queue,recv,C,Sockets,Queue,Recv,情况:我正在用c创建一个服务器守护进程,它同时接受许多连接,客户端将向服务器发送数据。目前,我已经将每个客户端连接生成到一个新线程中 问题是:如果客户机非常快地发送了许多行内容(例如,在不到一秒钟的时间内发送了10行数据),那么服务器将看到前两行,但看不到其余的 问题:如何“排队”来自客户端的数据(c中的recv命令)?这是否需要select或poll来完成?基本上,我想确保任何客户端都可以非常快速地发送大量数据,而不必担心任何内容被删除。如何做到这一点 示例代码:(注意:下面的代码显然已被大量

情况:我正在用c创建一个服务器守护进程,它同时接受许多连接,客户端将向服务器发送数据。目前,我已经将每个客户端连接生成到一个新线程中

问题是:如果客户机非常快地发送了许多行内容(例如,在不到一秒钟的时间内发送了10行数据),那么服务器将看到前两行,但看不到其余的

问题:如何“排队”来自客户端的数据(c中的
recv
命令)?这是否需要
select
poll
来完成?基本上,我想确保任何客户端都可以非常快速地发送大量数据,而不必担心任何内容被删除。如何做到这一点

示例代码:(注意:下面的代码显然已被大量修改,特别是通过删除错误检查。我试图修改我的代码,以使问题/解决方案清晰,而不会陷入不相关部分的语义中。请不要在此处被任何非标准或缺少的元素所困扰)

//此函数处理线程
void*ThreadedFunction(void*arg){
//做一些事情,比如:把vars从我的结构中拉出来
整数字节;
char-buf[256];
而(1){
如果((nbytes=recv(conid,buf,sizeof buf,0))您不需要“排队”来自客户端的数据。
因为TCP是为您而做的。如果服务器速度太慢,无法为TCP接收缓冲区腾出空间,TCP的流控制甚至会降低客户端的速度

因此,可能服务器或客户端的代码中存在错误。可能客户端在每行末尾发送“\0”。在这种情况下,以下代码不会打印所有行:

if((nbytes=recv(conid, buf, sizeof buf, 0)) <= 0) {
    //handle break in connection
} else {
    //for this example, just print out data from client to make my point
    buf[nbytes] = 0;
    printf("%s\n",buf);
}
TCP通常使用两个数据包发送这些数据包,其中包含以下内容:

"abc\n\0"
"def\n\0ghi\n\0"
服务器通常需要2个recv调用来接收传入数据。 因此,您的服务器将使用2个打印调用:

printf("%s\n", "abc\n\0\0");
printf("%s\n", "def\n\0ghi\n\0\0");
结果输出为:

abc
def

recv是否应该读取“(sizeof buf)-1”以便为终止null留出空间?我猜mystruct是malloced?您不定义“行”是什么,但通常情况下,一秒钟(甚至100毫秒)内有10行文本是慢的-您的recv()循环应该能够轻松跟上这一点,(除非有数百个同时繁忙的客户端连接)。愚蠢的我;我从来没有想过发送者可以在每行之后附加“0”。
printf("%s\n", "abc\n\0\0");
printf("%s\n", "def\n\0ghi\n\0\0");
abc
def