簡體   English   中英

如何在C ++中確定TCP客戶端是否已連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM