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

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

21.10.2017, 19:03. Показов 2129. Ответов 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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
21.10.2017, 20:33
julok, как вариант - вы закрываете сервер-сокет что делать совсем не нужно при том что разрешения на повторное использование при открытии сокета не задается а система сама не скоро его отпустит
0
0 / 0 / 0
Регистрация: 21.10.2017
Сообщений: 9
21.10.2017, 21:10  [ТС]
julok, как вариант - вы закрываете сервер-сокет что делать совсем не нужно при том что разрешения на повторное использование при открытии сокета не задается а система сама не скоро его отпустит
Сколько читал, нигде не видел упоминания о подобном. Можно, пожалуйста, поподробней. И в чем тогда вообще смысл closesocket, если повторно открыть тот же сокет нельзя?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru