Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 30.12.2019
Сообщений: 20
1

Как клиенту подключаться к серверу, после того, как работа сервера была остановлена

22.08.2022, 12:56. Показов 8908. Ответов 1

Author24 — интернет-сервис помощи студентам
Всем добрый день. Есть сервер и клиент. Клиент вводит в консоль какие-то данные, после обработки эти данные отправляются на сервер. Надо сделать так, чтобы работа клиента была максимально независима от работы сервера. Таким образом, внезапный останов работы сервера не должен сказаться на работе клиента. После перезапуска сервера надо, чтобы клиент произвел переподключение. Для этого у меня есть класс клиента. Отсоединение от сервера проверяю посредством того, что сервер отправляет в ответ сообщение, после того, как принял его. Если не отправил в ответ, надо переподключаться. Я это делаю методом connectToServer, однако получаю в окне вот такую ошибку: connect: Transport endpoint is already connected
Как мне надо переподключаться?

client.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#include <iostream>
#include <chrono>
 
#ifndef CLIENT_HPP
#define CLIENT_HPP
 
 
 
class Client
{
private:
    int                sock;
    struct sockaddr_in addr;
 
public:
    Client();
    bool connectToServer();
    bool sendMessage(char*, size_t size);
    char* getMessage();
};
 
#endif
client.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "client.hpp"
 
Client::Client()
{
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
}
 
bool Client::connectToServer()
{
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        return false;
    }
    return true;
}
 
 
bool Client::sendMessage(char* cstr, size_t size)
{
    send(sock, cstr, size, 0);
    if (!recv(sock, cstr, 1, 0)) return false;
    return true;
}
 
char* Client::getMessage()
{
    char cstr[256];
    cstr[255] = '\0';
    recv(sock, cstr, 256, 0);
    return cstr;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2022, 12:56
Ответы с готовыми решениями:

Как сделать лаунчер для SAMP сервера чтобы была загрузка файлов и подключение к серверу?
Разрабатываю свой мод для SAMP, но подумал нужен лаунчер но не знаю как его сделать, в интернете...

Что и как делать после того как была написана программа
Объясните, пожалуйста, практически &quot;на пальцах&quot;, что и как делать после того, как была написана...

Как подключаться удалённо к серверу 1С?
Есть в локальной сети предприятия сервер 1С. Юзеры за своими ПК вводят ip этого сервака, логинятся...

Компьютер стал зависать после того, как была добавлена ОЗУ
Доброго времени суток, форумчане! Обращаюсь за помощью в решении следующей проблемы: 2 недели...

1
Заблокирован
12.04.2023, 22:30 2
Проблема заключается в том, что после остановки сервера соединение все еще установлено, и при попытке повторного вызова функции connect() вы получаете ошибку "Transport endpoint is already connected". Чтобы решить эту проблему, вам необходимо закрыть сокет перед повторным вызовом функции connect(). Для этого вы можете использовать функцию close() сокета, которую можно вызвать внутри метода connectToServer() перед повторным вызовом функции connect(). Вот как может выглядеть исправленный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool Client::connectToServer()
{
    if(sock >= 0) close(sock);
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        return false;
    }
    return true;
}
Здесь мы добавили вызов close() сокета, чтобы закрыть его, а затем создали новый сокет с помощью функции socket(). Затем мы повторно задали значения структуры sockaddr_in и вызвали функцию connect() для установления нового соединения. Это должно позволить клиенту переподключаться к серверу после его перезапуска.
0
12.04.2023, 22:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2023, 22:30
Помогаю со студенческими работами здесь

Открыть ссылку сразу, после того, как была запущена форма
Здравствуйте, как можно реализовать подобное: Необходимо открыть ссылку сразу, после того, как...

Необходимо сделать исчезновение списка select после того как подкатегория была выбрана
Сайт на laravel &lt;?php $cats = $cats-&gt;groupBy('parent_id'); $sub_cats = $cats; $cats =...

Как оптимально подключаться к серверу - SQLConnection или ADOConnection?
Здравствуйте ! Хотел бы спросить мнение: как ВЫ подключаетесь из сервера к базе - данных -...

Передача от клиента к серверу и от сервера к клиенту через канал fifo()
Всем привет. Мне нужно через канал fifo отправить от клиента к серверу строку, сервер должен...

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

Как клиенту подключиться к серверу?
Добрый день! Подскажите, как можно решить задачу, в локальной сети из нескольких компьютеров есть...

Как лучше настроить роутеры, чтобы бухгалтер мог подключаться к серверу
Доброго времени суток! Помогите пожалуста правильно настроить сеть. Интернет приходит на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru