[英]How to exit a blocking call of recv() on a thread from a different thread?
[英]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种选择:
0
(表示长度为零的名称)。 EOF
。 我将更改协议以先发送strlen
,然后发送名称。
还要注意,TCP没有消息边界。 recv (2)返回N个字节,其中N是适合内核的任何值。 如果呼叫被信号打断,或者内部缓冲区无法容纳发送方的输出,则N将小于发送的发送方,下一个recv
将获得更多(也许全部)。
按照编写的方式,您的代码将检索一个名称,然后是其长度。 但是不能保证最后接收的字节构成长度。 如果有更多数据待处理,它们将只是名称的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.