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

Сервер не принимает клиента

21.10.2017, 19:03. Показов 2099. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Дико извиняюсь, если создал темку не там или похожий вопрос уже обсуждался. Прошу ткнуть носом на подобный вопрос, я почитаю. В гугле ничего не нашел, может совсем кривой.
Проблема такова. Вот код сервера.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <conio.h>
#include "winsock.h"
 
#pragma comment(lib, "Wsock32.lib")
 
const int WINSOCK_VERSION = 0x0101;
 
using namespace std;
 
 
WSADATA wsaData;
int sizeofaddr;
SOCKADDR_IN addr;
SOCKET sConnection;
SOCKET newConnection;
int result;
char rMsg[256];
 
int main()
{
    result = WSAStartup(WINSOCK_VERSION, &wsaData);
    if (result != 0)
        MessageBox(NULL, "WSAStartup failed", "Error", MB_OK);
 
    sizeofaddr = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(8888);
 
    while(1)
    {
        sConnection = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
        if (sConnection == INVALID_SOCKET) 
        {
            std::cout << WSAGetLastError() << std::endl;
            _getch();
            return 1;
        }
    
        result = bind(sConnection, (LPSOCKADDR)&addr, sizeofaddr);
        if(result == SOCKET_ERROR)
        {
            std::cout << WSAGetLastError() << std::endl;
            _getch();
            return 1;
        }
 
        listen(sConnection, SOMAXCONN);
 
        newConnection = accept(sConnection, (SOCKADDR *)&addr, &sizeofaddr);
 
        while(result != -1)
        {
            result = recv(newConnection, rMsg, sizeof(rMsg), NULL);
            if(result == 0 && result == -1)
                break;
 
            std::cout << rMsg << std::endl;
        }
 
        closesocket(newConnection);
        closesocket(sConnection);
 
    }
}
Я знаю, что это вариант не верный и делается все по другому. В данном случае я хочу понять, почему такой вариант не пашет. Первый раз самый простой клиент подключается успешно. Но все последующие разы - мимо. Возникает ошибка 10061 при вызове connect. Почему же это происходит?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.10.2017, 19:03
Ответы с готовыми решениями:

Сервер принимает запрос от клиента только 1 раз (windows)
Всем привет, как заставить сервер принимать от клиента запрос и ждать следующего. В моей реализации сервер принимает запрос только...

TCP сервер принимает укороченные пакеты
Создал (Visual Studio 6.0 на простом &quot;C&quot;) самое простое клиент-серверное приложение: клиент посылает серверу (по TCP протоколу) 10...

Пересылка бинарного файла с клиента на сервер
Всем доброго времени суток. Есть 2 проги: сервер и клиент. С клиента на сервер посылается бинарный файл и исполняется на нем. Файл вводится...

16
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
21.10.2017, 20:33
julok, как вариант - вы закрываете сервер-сокет что делать совсем не нужно при том что разрешения на повторное использование при открытии сокета не задается а система сама не скоро его отпустит
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
21.10.2017, 21:10  [ТС]
julok, как вариант - вы закрываете сервер-сокет что делать совсем не нужно при том что разрешения на повторное использование при открытии сокета не задается а система сама не скоро его отпустит
Сколько читал, нигде не видел упоминания о подобном. Можно, пожалуйста, поподробней. И в чем тогда вообще смысл closesocket, если повторно открыть тот же сокет нельзя?
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
23.10.2017, 06:31
julok, https://msdn.microsoft.com/en-... s.85).aspx но в вашем случае хватает просто нормального использования сервер сокета - не закрывайте его - когда вы так делаете вы как будто перезагружаете сервер ради каждого подключения. Флаг переиспользования потребуется вам если приложение сервер быстро физически рестартует на том же порту
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
23.10.2017, 17:31  [ТС]
julok, https://msdn.microsoft.com/en-... s.85).aspx но в вашем случае хватает просто нормального использования сервер сокета - не закрывайте его - когда вы так делаете вы как будто перезагружаете сервер ради каждого подключения. Флаг переиспользования потребуется вам если приложение сервер быстро физически рестартует на том же порту
Вот тут не понял. Как тогда быть, если нужно полностью перегрузить сервер? Не запускать же приложение каждый раз заново.
И в догонку вопрос, можно ли как-нибудь организовать соединение без сервера (как, например, точка-точка)? Нахожу только общую информацию, а относительно кода ничего нет.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
23.10.2017, 18:12
julok, если перезагружаете очень быстро то переиспользование пригодится, точка к точке шлёт UDP пакеты - там все могут быть отправителями и слушателями но для того что бы вычислить порт на котором ждут ваших пакетов нужна третья строна
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
23.10.2017, 22:10  [ТС]
julok, если перезагружаете очень быстро то переиспользование пригодится, точка к точке шлёт UDP пакеты - там все могут быть отправителями и слушателями но для того что бы вычислить порт на котором ждут ваших пакетов нужна третья строна
Если не затруднительно, можно пример с перугрузкой и тыкнуть носом, что используется, ибо я не совсем въезжаю.
Вот тут и проблема. Попробовал переписать через UDP, но у второй стороны были проблемы с работой. В чем же проблема, зачем нужна 3 сторона? Почему нельзя принудительно указать? Чет вопросов больше, чем ответов.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.10.2017, 09:12
julok, ещё раз по буквам:
1 если вы собираетесь принимать входящие подключения то не закрывайте сервер-сокет (sConnection) - вы сами не видите что код который закрывает сокет а потом сразу его же открывает выглядит странно?
2 когда я закрывал своё приложение-сервер а потом запускал его заново (спустя достаточно короткое время) система не успевала "отпустить" порт и отказывалась открывать сокет на том же порту - в этом случае мне помогало использование SO_REUSEADDR - с ним мой сервер мог нормально рестартовать на том же порту.
3 про общение p2p - если оба компьютера имеют выделенные постоянные внешние IP адреса то вы можете спокойно строить коммуникации между ними как вам заблагорассудится - хоть TCP хоть UDP хоть с координирующим сервером хоть без него. Если же у них нет таких адресов и нет возможности организовать VPN что бы компьютеры думали что они в обычной локальной сети где адреса как правило "хорошие", а хочется передавать данные от компьютера к компьютеру без транзитного узла с "хорошим" адресом то приходится идти на хитрость до которой думаю вам ещё очень далеко и которая имеет свои особенности https://en.m.wikipedia.org/wik... networking)
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
24.10.2017, 16:36  [ТС]
julok, ещё раз по буквам:
1 если вы собираетесь принимать входящие подключения то не закрывайте сервер-сокет (sConnection) - вы сами не видите что код который закрывает сокет а потом сразу его же открывает выглядит странно?
2 когда я закрывал своё приложение-сервер а потом запускал его заново (спустя достаточно короткое время) система не успевала "отпустить" порт и отказывалась открывать сокет на том же порту - в этом случае мне помогало использование SO_REUSEADDR - с ним мой сервер мог нормально рестартовать на том же порту.
3 про общение p2p - если оба компьютера имеют выделенные постоянные внешние IP адреса то вы можете спокойно строить коммуникации между ними как вам заблагорассудится - хоть TCP хоть UDP хоть с координирующим сервером хоть без него. Если же у них нет таких адресов и нет возможности организовать VPN что бы компьютеры думали что они в обычной локальной сети где адреса как правило "хорошие", а хочется передавать данные от компьютера к компьютеру без транзитного узла с "хорошим" адресом то приходится идти на хитрость до которой думаю вам ещё очень далеко и которая имеет свои особенности https://en.m.wikipedia.org/wik... networking)
1. Это я понял. Видимо ненормальность кода я не вижу.
2. К сожалению, я с подобным не сталкивался, поэтому знать о таком не мог, а про подобные штуки нигде не упоминается. Но если углубиться, то мне не понятно где использовать SO_REUSEADDR. В статье примера для кривых дурачков нет.
3. Дальше своего компьютера я пока не выхожу, поэтому стоит начать с 127.0.0.1. Даже так я не могу отослать данные, не делая одно из приложений серверным (сейчас говорю про UDP). Поэтому, надеюсь, вы сошлете меня на код с реализацией, ибо ничего работающего найти не могу.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
25.10.2017, 06:37
julok,
2 вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    int optval = 1;
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval));
 
    sa.sin_family = AF_INET;
    sa.sin_port = htons(12345);
    sa.sin_addr.s_addr = INADDR_ANY;
 
    bind(s, (SOCKADDR *)&sa, sizeof(sa));
 
    listen(s, SOMAXCONN);
3 recvfrom принимает структуру в которой хранится адрес и порт отправителя, sendto указывают структуру в которой хранится адрес и порт адресата. listen и accept для UDP не вызывают. таким образом определить кто из приложений сервер, а кто клиент не представляется возможным) разве что по bind но он может быть с обоих сторон если предполагается взаимный независимый обмен
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
25.10.2017, 20:35  [ТС]
julok,
2 вот так
3 recvfrom принимает структуру в которой хранится адрес и порт отправителя, sendto указывают структуру в которой хранится адрес и порт адресата. listen и accept для UDP не вызывают. таким образом определить кто из приложений сервер, а кто клиент не представляется возможным) разве что по bind но он может быть с обоих сторон если предполагается взаимный независимый обмен
Ага. Вот как. А есть какая-нибудь литература по-этому поводу, кроме msdn? На форуме советуют только общие сведения по работе сетей, а эти знания уже есть.

А вот с UDP проблемы. Видимо опять где-то накосячил, ничего не приходит.
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
42
43
44
45
46
47
48
#include <iostream>
#include <conio.h>
#include <winsock2.h>
 
#pragma comment(lib, "Wsock32.lib")
using namespace std;
 
 
int main()
{
    WSADATA WsaData;
    WSAStartup(MAKEWORD(2,2), &WsaData);
 
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == INVALID_SOCKET)
    {
        cout << WSAGetLastError() << endl;
        _getch();
        return 1;
    }
 
    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = htons(666);
    int address_size = sizeof(address);
 
    int inp;
    unsigned char data[256] = "Hello from me";
    unsigned int packet_size = sizeof(data);
    while(1)
    {
        cout << "Send/Recv (0/1): ";
        cin >> inp;
 
        if(inp == 0)
            sendto(sock, (const char*)data, packet_size, 0, (sockaddr*)&address, address_size);
        else
        {
            int received_bytes = recvfrom(sock, (char*)data, packet_size, 0, (sockaddr*)&address, &address_size);
 
            if (received_bytes <= 0)
                continue;
            
            cout << data << std::endl;
        }
    }
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2017, 07:47
посмотрите в отладчике, что вам возвращает inet_addr.
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
26.10.2017, 18:29  [ТС]
посмотрите в отладчике, что вам возвращает inet_addr.
127.0.0.1. В s_b1-4 стоит 127, 0, 0, 1 соответственно. В этом проблем я не вижу. Либо не понимаю намека.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.10.2017, 06:12
Цитата Сообщение от julok Посмотреть сообщение
В этом проблем я не вижу.
у меня просто недавно на винде с этим проблема была, порядок байт менялся и я пытался подключиться к 1.0.0.127.
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
28.10.2017, 11:02  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
у меня просто недавно на винде с этим проблема была, порядок байт менялся и я пытался подключиться к 1.0.0.127.
Ага, тоже с похожим встречался, только проблема была не в inet_addr.

Добавлено через 17 часов 26 минут
Проблему решил, но добавило новых вопросов. На "приемнике" нужно добавить bind, т.е
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    while(1)
    {
        cout << "Send/Recv (0/1): ";
        cin >> inp;
 
        if(inp == 0)
        {
            //cin.getline(data, sizeof(data));
                sendto(sock, (const char*)data, packet_size, 0, (sockaddr*)&address, address_size);
        }
        else
        {
            bind(sock, (SOCKADDR *) &address, sizeof(address));
            
            int received_bytes = recvfrom(sock, (char*)data, packet_size, 0, (sockaddr*)&address, &address_size);
 
            if (received_bytes <= 0)
                continue;
            
            cout << data << std::endl;
        }
    }
Тогда не понятно, почему адрес на принимающей стороне нужно связывать с сокетом, а передающая в этом не нуждается. Также проблемка, почему-то первая передача/прием не срабатывают, а только последующие, причем без исключений и такая ситуация наблюдается при каждом запуске. Так что на "пакеты не доходят" не очень похоже.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
30.10.2017, 16:22
Цитата Сообщение от julok Посмотреть сообщение
почему адрес на принимающей стороне нужно связывать с сокетом
Чтобы система могла сопоставить работающий приемник и порт к нему - если приходят данные на этот порт ( и адрес), то данные передаются именно этому приложению.
Цитата Сообщение от julok Посмотреть сообщение
передающая в этом не нуждается
Можно привязать и исходящий порт, но обычно система это делает сама.

Цитата Сообщение от julok Посмотреть сообщение
Так что на "пакеты не доходят" не очень похоже.
В каком порядке запускаешь приемник\отправитель?
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
02.11.2017, 22:12  [ТС]
Цитата Сообщение от Вованя Посмотреть сообщение
Чтобы система могла сопоставить работающий приемник и порт к нему - если приходят данные на этот порт ( и адрес), то данные передаются именно этому приложению.

Можно привязать и исходящий порт, но обычно система это делает сама.


В каком порядке запускаешь приемник\отправитель?
Вот этого и не понятно, почему это так необходимо для принимающей части, а передающей хватает и "авто" вызова. Что мешало прописать и для приемника?
Вот тут опять не понятно. Как я понимаю, то все сообщения, которые пришли на порт, сохраняются в очереди. Если послать сообщение, но не зайти в программу, дальнейшие попытки получить это сообщения обламываются. Если дойти до выбора оправки/приема (см код), и не выбирать прием, опять сообщение потеряется. Если хоть раз пройтись по приему, то все сообщения будут нормально приходить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2017, 22:12
Помогаю со студенческими работами здесь

Передать данные от клиента на сервер и наоборот
Не получаеться передать данные от клиента на сервер и наоборот, нет информации. Хотя они между собой соеденяються, этому свидетельствует...

Сервер принимает пакеты если клиент указывает неверный порт получателя UDP.
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя UDP. Кто то может...

Клиент сервер Winsock + SDL. Форма клиента зависает
Проблема клиета: Форма SDL зацикливаеться циклом while и создается менюшка с кнопками и текстом тут все хорошо.Winsock тоже зацикливается...

Как из TCP пакета пришедшего на сервер выделить IP клиента
Как из TCP пакета пришедшего на сервер выделить IP клиента?? Где в передаваемом пакете на сервер будет находится ip клиента вначале или в...

Сервер не принимает сообщение от клиента
Здравствуйте! Пишу чат на Embarcadero C++Builder XE2. Проблема: не принимает сообщение от клиента. Сам клиент(судя по вылетающему...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru