С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463

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

23.04.2015, 16:55. Показов 1862. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, начал изучать winsock и socket API, по статье Криса Касперски "Самоучитель игры на Winsock", скопировал примеры tcp клиента и сервера, но проблема в том, что клиент подключается к серверу, но не выводит сообщение от сервера.

Сервер же принимает запрос на подключение клиента, если успех, то создается отдельный поток для клиента и отсылается строка - Hello user!

Которая по идее должна вывестись клиентом, но этого не происходит.

сервер:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string>
#include <clocale>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "Ws2_32.lib")
 
#define PORT 666
#define wait_func system("pause >> void");
 
int connectClients = 0;
 
DWORD WINAPI inOutWithClient(LPVOID clientSocket)
{
    SOCKET mySocket = ((SOCKET *)clientSocket)[0];
    char buf[20 * 1024];
    int bytesOfUser;
 
    #define HELLO "Hello user!"
 
    send(mySocket, HELLO, sizeof(HELLO), 0);
 
    while ( (bytesOfUser = recv(mySocket, buf, sizeof(buf), 0)) && bytesOfUser != SOCKET_ERROR)
    {
        send(mySocket, buf, bytesOfUser, 0);
    }
 
    connectClients--;
    std::cout << "user disconnected" << std::endl;
 
    closesocket(mySocket);
    return 0;
}
 
void crashReport(const std::string &report)
{
    std::cout << report << std::endl;
    wait_func
    exit(1);
}
 
int main(int argc, char *argv[])
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
 
    char BUFFER[1024];
 
    if (WSAStartup(MAKEWORD(1, 1), (WSADATA *)BUFFER))
    {
        crashReport("Не удалось инициализировать библиотеку WinSock" + WSAGetLastError());
    }
 
    SOCKET mainSock;
 
    if ((mainSock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        WSACleanup();
        crashReport("Не удалось создать объект сокета.");       
    }
 
    sockaddr_in local_server;
    local_server.sin_family = AF_INET;
    local_server.sin_port = htons(PORT);
    local_server.sin_addr.s_addr = 0;
 
    if (bind(mainSock, (sockaddr *)&local_server, sizeof(local_server)))
    {
        closesocket(mainSock);
        WSACleanup();
        crashReport("Не удалось связать сокет с локальным адресом " + WSAGetLastError());
    }
 
    if (listen(mainSock, 0x10))
    {
        closesocket(mainSock);
        WSACleanup();
        crashReport("Ошибка прослушивания запросов " + WSAGetLastError());
    }
 
    cout << "Ожидание подключений..." << endl;
 
    SOCKET clientSock = 0;  // сокет для клиента
    sockaddr_in clientAddr; // адрес клиента(заполняется системой)
 
    int clientAddrSize = sizeof(clientAddr);    // функции accept требуется передать размер структуры
 
    // цикл извлечения запросов на подключение из очереди
 
    while ( (clientSock = accept(clientSock, (sockaddr *)&clientAddr, &clientAddrSize)) )
    {
        connectClients++;
        hostent *host;
 
        host = gethostbyaddr((char *)&clientAddr.sin_addr.s_addr, 4, AF_INET);
 
        cout << "+" << (host ? host->h_name : "") << " [" << inet_ntoa(clientAddr.sin_addr) << "] connected!" << endl;
 
        DWORD nextThread;
        CreateThread(NULL, NULL, inOutWithClient, &clientSock, NULL, &nextThread);
    }
 
    closesocket(mainSock);
    WSACleanup();
 
    wait_func
    return 0;
}
клиент:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <clocale>
#pragma comment(lib, "Ws2_32.lib")
 
#define PORT 666
#define SERVER_ADDRESS "127.0.0.1"
 
int main(int argc, char *argv[])
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
 
    char buffer[1024];
    WSADATA versionLib;
 
    if (WSAStartup(MAKEWORD(1, 1), &versionLib))
    {
        cout << "Error WSAStartup(): " << WSAGetLastError() << endl;
        system("pause >> void");
        return -1;
    }
 
    SOCKET mySocket;
    if ((mySocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        cout << "Error socket: " << WSAGetLastError() << endl;
        WSACleanup();
        system("pause >> void");
        return -1;
    }
 
    // пытаемся установить соединение
    sockaddr_in destAddr;
    destAddr.sin_family = AF_INET;
    destAddr.sin_port = htons(PORT);
    hostent *hst;
 
    // пытаемя преобразовать IP адрес из символного формата в сетевой формат
    if (inet_addr(SERVER_ADDRESS) != INADDR_NONE)
    {
        destAddr.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
    }
    else
    {
        if ((hst = gethostbyname(SERVER_ADDRESS)))
        {
            ((unsigned long *)&destAddr.sin_addr)[0] = 
                ((unsigned long **)hst->h_addr_list)[0][0];
        }
        else
        {
            cout << "Invalid address: " << SERVER_ADDRESS << endl;
            closesocket(mySocket);
            WSACleanup();
            system("pause >> void");
            return -1;
        }
    }
 
    if (connect(mySocket, (sockaddr *)&destAddr, sizeof(destAddr)))
    {
        cout << "Error connection: " << WSAGetLastError() << endl;
        closesocket(mySocket);
        WSACleanup();
        system("pause >> void");
        return -1;
    }
 
    cout << "Соединение с " SERVER_ADDRESS " успешно установлено!" << endl;
 
    int nbytes;
 
    while ( (nbytes = recv(mySocket, buffer, sizeof(buffer) - 1, 0)) != SOCKET_ERROR)
    {
        buffer[nbytes] = 0;
 
        printf("Сообщение от сервера: %s\n", buffer);
        printf("S<=C: "); fgets(buffer, sizeof(buffer) - 1, stdin);
 
        if (!strcmp(buffer, "quit"))
        {
            closesocket(mySocket);
            WSACleanup();
            return 0;
        }
 
        send(mySocket, buffer, nbytes, 0);
    }
 
    cout << "Recv error: " << WSAGetLastError() << endl;
    closesocket(mySocket);
    WSACleanup();
 
    system("pause >> void");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2015, 16:55
Ответы с готовыми решениями:

Не подключается клиент к серверу
Чую, что ошибка тупая, но только начал разбираться с этим всем) Клиент: var newClient = new TcpClient(); ...

Клиент не подключается к серверу
Здравствуйте, загнался такой темой, читая книгу Йона Снейдра и еще одну статью(), пишу свой чат на чистом Си, но запнулся практически с...

Клиент не подключается к серверу
Здравствуйте! Извините пожалуйста если что не так напишу. Есть сервер с базой данных, есть клиент но ни в какую этот клиент не...

7
3 / 3 / 1
Регистрация: 29.05.2014
Сообщений: 148
01.05.2015, 16:45
ASCII, и в чем была проблему?
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
01.05.2015, 17:48  [ТС]
Я так и не понял. Не работает и все. Переписал свой вариант и все заработало... писал сонным, поэтому мог что-то упустить. Заново в этом коде ковыряться нет желания. Могу скинуть рабочий вариант Простого клиент-сервера.
0
3 / 3 / 1
Регистрация: 29.05.2014
Сообщений: 148
01.05.2015, 17:56
ASCII,
Могу скинуть рабочий вариант Простого клиент-сервера.
буду очень благодарна
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
01.05.2015, 18:33  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

сервер:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string>
#include <clocale>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "Ws2_32.lib")
 
#define wait_func system("pause >> void");
 
int main(int argc, char *argv[])
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
 
    char BUFFER[1024];
 
    // инициализируем winsock2
    if (WSAStartup(MAKEWORD(1, 1), (WSADATA *)BUFFER))
    {
        cout << "WSAStartup error: " << WSAGetLastError();
        wait_func
        return -1;
    }
 
    SOCKET mainSock;
    // создаем объект сокета
    if ((mainSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        cout << "Socket error: " << WSAGetLastError();
        WSACleanup();
        wait_func
        return -1;
    }
 
    // создаем переменную для хранения локального адреса 127.0.0.1 по умолчанию
    sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(13);
    local.sin_addr.s_addr = 0;
 
    // связываем наш сокет с локальным адресом
    if (bind(mainSock, (sockaddr *)&local, sizeof(local)))
    {
        cout << "Bind error: " << WSAGetLastError();
        closesocket(mainSock);
        WSACleanup();
        wait_func
        return -1;
    }
 
    // становимся на прослушку запросов. Очередь ставим равной в 256 запросов
    if (listen(mainSock, 0x100))
    {
        cout << "Listen error: " << WSAGetLastError();
        closesocket(mainSock);
        WSACleanup();
        wait_func
        return -1;
    }
 
    cout << "Server listening: ";
 
    SOCKET clientSocket = 0;
    sockaddr_in clientAddr;
    int size = sizeof(clientAddr);
 
    // вытаскиваем запросы на подключение из очереди сокета прослушки
    while ((clientSocket = accept(mainSock, (sockaddr *)&clientAddr, &size)) != SOCKET_ERROR)
    {
        string sendString;
        hostent *hst = gethostbyaddr((char *)&clientAddr.sin_addr.S_un.S_addr, 4, AF_INET);
 
        cout << endl << endl << "User connected..." << endl;
        if (hst) cout << "User Name: " << hst->h_name << endl;
        cout << "IP address: " << inet_ntoa(clientAddr.sin_addr) << endl;
 
        cout << "Input answer for user: ";
 
        getline(cin, sendString);
 
        send(clientSocket, sendString.c_str(), sendString.size(), 0);
        closesocket(clientSocket);
    }
 
    closesocket(mainSock);
    WSACleanup();
    wait_func
    return 0;
}
клиент
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
67
68
69
70
71
72
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <clocale>
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib, "Ws2_32.lib")
 
#define waito system("pause >> void");
#define ADDRESS "127.0.0.1"
 
int main(int argc, char *argv[])
{
    using namespace std;
    setlocale(LC_ALL, "Russian");
 
    WSADATA libVersion;
    if (WSAStartup(MAKEWORD(1, 1), &libVersion))
    {
        cout << "WSAStartup error: " << WSAGetLastError() << endl;
        waito
        return -1;
    }
 
    char buffer[1024];
    int readBytes = 0;
    SOCKET mainSocket;
 
    if ((mainSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        cout << "Socket error: " << WSAGetLastError() << endl;
        WSACleanup();
        waito
        return -1;
    }
 
    sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(13);
 
    if (inet_addr(ADDRESS) != INADDR_NONE)
    {
        server.sin_addr.s_addr = inet_addr(ADDRESS);
    }
    else
    {
        cout << "Inet address error: " << WSAGetLastError() << endl;
        closesocket(mainSocket);
        WSACleanup();
        waito
        return -1;
    }
 
    if (connect(mainSocket, (sockaddr *)&server, sizeof(server)))
    {
        cout << "Connection error: " << WSAGetLastError() << endl;
        closesocket(mainSocket);
        WSACleanup();
        waito
        return -1;
    }
 
    while ((readBytes = recv(mainSocket, buffer, sizeof(buffer), 0)) > 0)
    {
        buffer[readBytes] = 0;
        cout << "Ответ сервера: " << buffer << endl;
    }
 
    closesocket(mainSocket);
    WSACleanup();
    waito
    return 0;
}
Компилировал в Visual Studio 2013

Добавлено через 1 минуту
в этом варианте нет создания потока для отдельного пользователя, запросы на подключения обрабатыавются последовательно.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.05.2015, 19:55
На всякий случай добавлю, что этот код концептуально некорректный, так
как на вызовах send и recv не учитывается возможная фрагментация TCP-потока.
2
3 / 3 / 1
Регистрация: 29.05.2014
Сообщений: 148
01.05.2015, 20:39
ASCII, безумно благодарна. вы помогли мне больше чем я ожидала. после анализа вашего кода я нашла в свою ошибку.
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
02.05.2015, 19:50  [ТС]
МАРКИЗОЧКА, вообще-то, не за что
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2015, 19:50
Помогаю со студенческими работами здесь

Не подключается клиент к серверу по PXE
Соединил два компа ethernet-шнуром. Один - сервер, другой - клиент. Клиент загружается через PXE как и должно быть (см. вложение), но...

Клиент-серверное приложение не подключается к серверу
По примеру, сделал я сервер и клиент, которые с помощью Socket подключаются друг с другом. Проверил на одном компьютере, всё работает....

Не подключается Putty клиент к серверу на базе CentOs
Добрый день всем! Ребята, после нескольких неудачных попыток подключения с моей Windows-машины к линуксовому серверу, Putty клиент...

Клиент-программа не подключается к TCP серверу даже по локальному IP
Помогите, пожалуйста! Написал обычный клиент-сервер. Код клиента: #pragma comment(lib,&quot;Ws2_32.lib&quot;) #include...

Приложение-клиент не подключается к серверу FireBird в другой подсети
Имеется подсеть, например, 120.20.150.* в которой был сервер с FB (физический Win Serv 2003) и все клиенты без проблем подключались. Сервер...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru