[英]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.