подключиться к одному из множества серверов с помощью сокета - PullRequest
0 голосов
/ 03 июня 2018

У меня есть клиент, который должен подключиться к одному из многих серверов, у меня есть 5 серверов с портом от 8000 до 8004, и один клиент, который должен подключиться к первому серверу, который подключен к сети.Моя идея состоит в том, чтобы попытаться подключиться к каждому серверу, пока не будет установлено одно соединение, таким образом:

определение структуры

char * host_name = "127.0.0.1"; // local host
int port[5] = {8000,8001,8002,8003,8004}

struct sockaddr_in serv_addr;
struct hostent* server;

if ( ( server = gethostbyname(host_name) ) == 0 )
{
    perror("Error resolving local host\n");
    exit(1);
}


int sockfd = socket( PF_INET, SOCK_STREAM, 0 );
if ( sockfd == -1 )
{
    perror("Error opening socket\n");
    exit(1);
}

Это то, что я делаю для решения проблемы

bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = ((struct in_addr *)(server->h_addr))->s_addr;

for (int i=0;i<5;i++){
    serv_addr.sin_port = htons(port[i]);
    if ( connect(sockfd, (void*)&serv_addr, sizeof(serv_addr) ) != -1 )
    {
        printf("connect to server %d\n",port[i]);
        break;
    } else{
        printf("impossible to  connect to server %d \n",port[i]);
    }
}

Это работает, только если первый сервер (порт 8000) подключен к сети, соединение установлено.Если сервер с портом от 8001 до 8004 подключен к сети, соединение не установлено.Конечно, на стороне сервера есть listen () для нового соединения.

1 Ответ

0 голосов
/ 03 июня 2018

Невозможно повторно подключить сокет, который уже пытался подключиться, даже если произошел сбой.Вы должны закрыть его и создать новый сокет.

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