我正在用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:"
,我不知道为什么以及如何阻止它...
如果有人帮助我解决原因和解决方法,我将不胜感激。
答案 0 :(得分:2)
您没有检查read()
(或recv()
)返回零,这是断开连接的对等方的正常情况。
答案 1 :(得分:0)
在Get_Message()
while循环中,您可能需要在阅读邮件之前检查sockfd
是否有效,因此sockfd !=0
。
答案 2 :(得分:0)
read
或write
函数在其他对等方断开连接时返回零,而buffer
为null
,因此您应该处理此情况。
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;
}
}