繁体   English   中英

如何从接收电话退出

[英]how to exit from a recv call

我正在从一个套接字读取数据,但是我不知道会到达多少个元素,因此即使服务器已写入struct数组的所有元素,我的套接字也仍然停留在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));

    }

}

我不知道会有多少元素

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

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

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

还要注意,TCP没有消息边界。 recv (2)返回N个字节,其中N是适合内核的任何值。 如果呼叫被信号打断,或者内部缓冲区无法容纳发送方的输出,则N将小于发送的发送方,下一个recv将获得更多(也许全部)。

按照编写的方式,您的代码将检索一个名称,然后是其长度。 但是不能保证最后接收的字节构成长度。 如果有更多数据待处理,它们将只是名称的一部分。

暂无
暂无

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

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