Mahmoud_Gamal Ответов: 1

Как я могу оптимизировать TCP-соединение между клиентом и серверами


привет Идеальный программист

у меня есть 2 Службы одна на java а другая на c++ обе действуют как клиент и сервер в обмене данными но через 1 или 2 часа служба на c++ останавливается ненормально из за CLOSE_WAIT статус TCP соединения увеличивается на unix it многопоточном приложении
переменная str_write является BufferedOutputStream добраться из сокета в C++ службу и вернуться к нему
подсказка : эти два раздела являются общими для всех потоков в каждой службе
 str_write.write("send o c++ service @".getBytes(), 0, 10);
str_write.flush();
Thread.sleep(3000L);
str_write.close();
this.socket.close();
finalize();
return;

а служба c++ - это получение таких данных, как
  int l;
char delem = "@";
     timeval t_out;

         fd_set set;
   
     
       t_out.tv_sec = 6;
      
      t_out.tv_usec = 0;
      FD_ZERO(&set);   
      FD_SET(Socket,&set);
  
  l = 8;    
        l = select(Socket +1, &set, NULL, NULL, &t_out);
      
         setsockopt(Socket,SOL_SOCKET,TCP_NODELAY|SO_RCVTIMEO,(char*)&t_out,sizeof(struct timeval));

       if(l==0)
         {
          printf("\n time out kk %i \n",timeout);
          return -10;
         }
       
         else if(len<0)
          {
         printf("\n error in select 2 TCPClient \n");
       
           return -5;
          }
         
     char a[1] = {0};
    
       memset(data,0,sizeof(data));
      // strcpy(data," ");   
     ssize_t l1;
     int i = 0;
     int cycle = 0;
     while(true)
     {
     
          l1 = recv(Socket,a,1,0);
          
          if(l1==0)
          {
          printf("\n closed ");
          i = 0;
            break;
          }
          if(l1 == -1)
          {
            cycle++;
            if(r==5 &&cycle<6)
             {
                sleep(1);
                printf("wait");
             
                    continue;
             }
             
            break;
          }
          data =  stpcpy(data,a);
          i +=l1;
         
          if(delm_len>1 &&strstr(data,delem)!=NULL)
          {
            printf("\n hit strstr \n  ");
            break;
          }
            else if(delm_len==1 && delem[0]==a[0])
            { 
            r = 1;
            printf("\n hit \n");
                break;
            }
            if(i>=len && r==1)
            break;
            
      }//while(i< len) ;    
       printf("\n data recv %i  r = %i ",i,r);      


Что я уже пробовал:

каждая вещь попробовать снизить удастся не допустить

1 Ответов

Рейтинг:
2

KarstenK

CLOSE_WAIT-это признак того, что время ожидания соединения истекло. Вот некоторые хорошие моменты для этого вопрос.

Потеря связи-это общий сценарий, таким образом, ваша программная логика всегда должна иметь некоторую встроенную логику переподключения. Поэтому лучше всего открывать соединение, когда это необходимо, делать работу, а затем закрывать и ждать или опрашивать новую работу.

мета-код:

while( flagServiceRunning ) {
 if( newJobAvailable() ) {
   if( connect() ) {
     if( processJob() ) {
       markJobAsDone();
     }
     disconnect();
   }
 }
 sleep();//some energy saving state, for a well choosen time
}


Mahmoud_Gamal

вы имеете в виду установить тайм-аут для каждого процесса потока