2015-08-14 85 views
0

我正在用C++和socket.h庫編寫套接字代碼,而我的服務器和客戶端是使用TCP協議的流套接字。 我有一個類的用戶顯示連接的客戶端。C++ socket在斷開後發送數據

class User 
{ 
private: 
    int sockfd; 
    int n; 
    thread *Thread; 
public: 
    User(int sockfd); 
    void Get_Message(); 
    void Join(); 
    ~User(); 
}; 
User::User(int sockfd) 
{ 
    this->sockfd=sockfd; 
    Thread=new thread(&User::Get_Message,this); 
} 
void User::Get_Message() 
{ 
    while (1) 
    { 
     readmessage(sockfd); 
    } 
} 
void readmessage(int sock) 
{ 
    int n=0; 
    char buffer[256]; 
    bzero(buffer, 256); 
    n = read(sock, buffer, 255); 
    if (n < 0) 
    { 
     error("ERROR reading from socket "); 
    } 
    cout<<"the message\t"<<buffer<<endl; 
} 

現在這個代碼工作,幾個客戶端可以加入我的服務器併發送消息;

然而,當這些客戶端的一個從服務器斷開連接,它使打印"the message:",我不知道爲什麼,以及如何阻止它... 我會很感激,如果有人可以幫助我與爲什麼和如何修理它。

+0

你怎麼會不知道爲什麼?你有一個無限循環,'while(1)readmessage(sockfd);'當然你的代碼會繼續打印'「這條消息:」'。解決的辦法是讓'readmessage'返回一個狀態並在狀態指示連接已關閉時退出循環。 –

回答

0

在您的Get_Message() while循環中,您可能需要檢查sockfd是否有效,因此在讀取消息之前檢查sockfd !=0

+0

檢查它如何?並關閉它爲什麼? – EJP

+0

@EJP謝謝我編輯了我的答案 – Chrim

+0

重複的開合握手也浪費資源。你需要取得平衡。大多數協議不僅僅爲一條消息使用連接。 – EJP

2

您還沒有檢查read()(或recv())返回零,這是一個對等體斷開正常情況。

0

readwrite函數返回零,而其他同行斷開,buffernull,所以你應該處理這種情況。

void readmessage(int sock) 
{ 
    int n=0; 
    char buffer[256]; 
    bzero(buffer, 256); 
    n = read(sock, buffer, 255); 
    if (n < 0) 
    { 
     error("ERROR reading from socket "); 
    } 
    else if (n == 0) 
    { 
     cout << sock <<" client disconnected" << endl; 
    } 
    else { 
     cout<<"the message\t"<<buffer<<endl; 
    } 
}