Я имею ошибку, используя сокет openssl с select () (C ++) - PullRequest
0 голосов
/ 18 октября 2019

У меня проблема с моим кодом. Я использую C ++. Я использую сокет Openssl и выбираю многопоточную программу select ()

Если я соединяю три одновременно, один может не подключиться. один клиент возвращает -1 при Connect() коде. Иногда все три работают хорошо.

Все источники не могут быть опубликованы, поэтому я кратко опубликую их. Я был бы признателен, если бы вы могли подтвердить любые проблемы с процессом.

мой код клиента здесь. я использую многопоточную программу для подключения к серверу.

int createSocket(itld_va_ctx_t *ctx, char* host, int port)
{
    int client_desc;
    struct hostent* hp;
    unsigned long addr;
    struct sockaddr_in server;

    client_desc = socket(AF_INET, SOCK_STREAM, 0);
    if(client_desc == -1) {
        ctx->recog->error_code = E_SOCK;
        ctx->recog->error_code_detail = errno;
        LOG("Error - couldn't create socket !\n");
        return FALSE;
    }

    addr = inet_addr(host);

    if (addr == INADDR_NONE) {
        hp = gethostbyname(host);
        if (hp == NULL) {
            close(client_desc);

            return FALSE;
        }
        addr = *((unsigned long*) hp->h_addr);
    }

    server.sin_addr.s_addr = addr;
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    if ( -1 == connect(client_desc, (struct sockaddr*) &server, sizeof(server))) {
        ctx->recog->error_code = E_CONN;
        ctx->recog->error_code_detail = errno;
        printf(">>>>>>error:::%d: %s\n",errno,strerror(errno));
        LOG("ERROR: couldn't connect to server!\n");
        close(client_desc);

        return FALSE;
    }

    return client_desc;
}

мой код сервера находится здесь. Я звоню Listen() и AcceptClient()


bool Listen(int32 port) {
  h_addr_.sin_addr.s_addr = INADDR_ANY;
  h_addr_.sin_port = htons(port);
  h_addr_.sin_family = AF_INET;

  server_desc_ = socket(AF_INET, SOCK_STREAM, 0);
  maxDs = server_desc_;

  if (server_desc_ == -1) {
    return false;
  }

  int32 flag = 1;
  int32 len = sizeof(int32);
  if( setsockopt(server_desc_, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1){
    return false;
  }

  if (bind(server_desc_, (struct sockaddr*) &h_addr_, sizeof(h_addr_)) == -1) {
    return false;
  }

  if (listen(server_desc_, 1) == -1) {
    return false;
  }

  FD_ZERO(&fsStatus);
  FD_SET(server_desc_, &fsStatus);

  std::cout << "TcpServer: Listening on port: " << port << std::endl;

  return true;

}


int32 AcceptClient(bool* client_soc, int32 size) {

  socklen_t len;
  int32 nselect;
  struct timeval tv;

  fd_set temp = fsStatus;

  do{

        for(int32 i=0; i < size; i++) {
            if(client_soc[i] == true){
                FD_SET(i, &temp);
            }
        }

        nselect = select(maxDs + 1, &temp, NULL, NULL, NULL);
        KALDI_LOG << "Select :" << nselect ;
        if(nselect == 0) {

            close(server_desc_);
            return -1;
        } else if(nselect < 0) {
            if(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {

                //continue;
                return nselect;
            }else {

                return nselect;
            }
        } else {
            if(!FD_ISSET(server_desc_, &fsStatus)){

                return -1;
            } else {
                break;
            }
        }

    } while(0);

  len = sizeof(struct sockaddr);
  client_desc = accept(server_desc_, (struct sockaddr*) &h_addr_, &len);

  if(client_desc < 0){ 

    return -1;
  }

  if(client_desc > maxDs)
  {
    maxDs = client_desc + 1;
  }

  if(client_desc > 0)
  {
    tv.tv_sec = 10;
    tv.tv_usec = 0;

    if( setsockopt(client_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) == -1)
    {

      close(client_desc);
      return -1;
    }

    if( setsockopt(client_desc, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof( struct timeval)) == -1 )
    {

      close(client_desc);
      return -1;
    }

        int32 flag = 1;
    int32 len = sizeof(int32);
    if( setsockopt(client_desc, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)
    {

        close(client_desc);
        return -1;
    }   
  }

  return client_desc;
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...