gpt4 book ai didi

c - 如何退出recv调用

转载 作者:行者123 更新时间:2023-11-30 15:02:47 25 4
gpt4 key购买 nike

我正在从一个套接字读取数据,但我不知道有多少元素会到达,因此如果服务器已写入结构体数组的所有元素,我的套接字仍然停留在 recv 调用上。

客户端

for(;;){
...
if(strcmp(buf,"!who")==0){
while(recv(sd,name,50,0)>0)
{

printf("%s\n",name);

}
continue;
}
}

服务器

while(recv(sock,msg,1024,0)>0){

if(strcmp(msg,"!who")==0){
if(i==0){
strcpy(msg2,"Nessun giocatore collegato.");
write(sock,msg2,strlen(msg2));
}
else
for(int c=0;c<=i;c++)
write(sock,players[c].name,strlen(players[c].name));

}

}

最佳答案

I don't know how many elements will arrive

你必须知道。您有 3 个选择:

  1. 发送者在数据前加上一个计数,告诉接收者期望有多少。
  2. 发送者使用某种“完成”标记来结束数据。在您的情况下, 0 就可以了(表示零长度名称)。
  3. 发送方关闭连接,接收方看到EOF

我将更改协议(protocol)以首先发送 strlen,然后发送名称。

另请注意,TCP 没有消息边界。 recv(2) 返回 N 个字节,其中 N 是对内核方便的任何内容。如果调用被信号中断,或者内部缓冲区无法容纳发送者的输出,N 将小于发送的内容,并且下一个 recv 将得到更多(也许全部)。

正如所写,您的代码检索一个名称,后跟其长度。但不能保证最后收到的字节构成长度;如果有更多数据待处理,它们将只是名称的一部分。

关于c - 如何退出recv调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949222/

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