簡體   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