[英]How to determine tcp client is connect or not in c++
我保存了所有已連接的客戶端/ 套接字的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("%d\t",*it);
if (read(*it, x, 1) < 1) {
cout<<"yes"<<endl;
perror("Error on write to client socket!\r\n");
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("%d\t",*it);
if (send(*it, x, 1,0) < 0) {
cout<<"yes"<<endl;
perror("Error on write to client socket!\r\n");
fflush(stdout);
fflush(stderr);
close(*it);
it=list_client_sockets.erase(it);
--it;
//return 0;
}
it++;
}
//printf("0x%02X ",x);
fflush(stdout);
}
}
客戶端決定是否關閉連接的通常方法是檢查連接是否超時,如果在指定時間內未收到任何消息,則關閉套接字。 您可以通過嘗試讀取套接字來檢測套接字是否打開,如果套接字失敗,則關閉套接字。 您可以使用“保持活動”消息來保持套接字打開。 您可以使用單獨的線程進行套接字狀態檢測和/或保持套接字活動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.