断开连接后c ++套接字发送数据

时间:2015-08-14 07:13:18

标签: c++ sockets

我正在用C ++和socket.h库编写套接字代码,我的服务器和客户端是使用TCP协议的流套接字。 我有一个类用户,显示客户端连接。

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:",我不知道为什么以及如何阻止它... 如果有人帮助我解决原因和解决方法,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

您没有检查read()(或recv())返回零,这是断开连接的对等方的正常情况。

答案 1 :(得分:0)

Get_Message() while循环中,您可能需要在阅读邮件之前检查sockfd是否有效,因此sockfd !=0

答案 2 :(得分: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;
    }
}