如何在 c++ 中确定 tcp 客户端是否连接

How to determine tcp client is connect or not in c++

本文关键字:tcp 客户端 是否 连接 c++      更新时间:2023-10-16

我保存了连接的客户端/套接字的所有IP,之后我想知道何时从服务器到客户端写入内容,无论客户端是否处于CONNECT状态。当我使用Write函数时,可以将数据从服务器发送到丢弃的客户端,因为一个或多个客户端可能会断开连接,连接将被关闭并且数据不会发送。我的代码是:

void *connection_determine(void *ptr){
while (1) {
putchar(x[0]);
std::list<int>::iterator it;
it=list_client_sockets.begin();

while (it!=list_client_sockets.end()){
printf("%dt",*it);
if (read(*it, x, 1) < 1) {
cout<<"yes"<<endl;
perror("Error on write to client socket!rn");
fflush(stdout);
fflush(stderr);
close(*it);
it=list_client_sockets.erase(it);
--it;
//return 0;
}
it++;
}
//printf("0x%02X ",x);
fflush(stdout);
} 
}
// function for read data from pipe and send it to clients
void *pipeRead_thread_func(void *ptr) {
int fd_pipe = *((int *) ptr);
while (1) {
char x[1];
if (read(fd_pipe, x, 1) < 0) {
perror("Read Error");
return 0;
}
putchar(x[0]);
std::list<int>::iterator it;
it=list_client_sockets.begin();

while (it!=list_client_sockets.end()){
printf("%dt",*it);

if (send(*it, x, 1,0) < 0) {
cout<<"yes"<<endl;
perror("Error on write to client socket!rn");
fflush(stdout);
fflush(stderr);
close(*it);
it=list_client_sockets.erase(it);
--it;
//return 0;
}
it++;
}
//printf("0x%02X ",x);
fflush(stdout);
}
}

客户端决定是否关闭连接的通常方法是检查它是否已超时,如果它在指定的时间内没有收到任何消息,则关闭套接字。 您可以通过尝试从套接字读取来检测套接字是否打开,如果套接字失败,套接字将关闭。 您可以使用"保持活动状态"消息使套接字保持打开状态。 您可以使用单独的线程进行套接字状态检测和/或保持套接字处于活动状态。