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

WinSock Server-Client. Не могу найти ошибку

06.12.2015, 00:48. Показов 832. Ответов 0

Студворк — интернет-сервис помощи студентам
Сервер и клиент. Клиент отсылает строчку, сервер возвращает все символы используя только верхний регистр. Возникло 2 проблемы.
1. Во время работы, при вводе пустой строки всё зависает, клиент и сервер не реагируют. Возможно в цикле клиента проблема.
2. Как сделать так, чтобы при вводе команды Port, сервер возвращал номера портов клиента и сервера (код сервера, строки 143-147? (они одинаковые у меня 1500). Буду благодарен за любую помощь.

Приложение-сервер
Кликните здесь для просмотра всего текста

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#pragma comment (lib,"WSock32.Lib")
#define SERVER "127.0.0.1"
#pragma warning(disable : 4996)
 
// TCP-порт сервера
#define SERVICE_PORT 1500 
#define SERVER "127.0.0.1"
int send_string(SOCKET s, const char * sString);
//
int main(void)
{
    setlocale(LC_CTYPE, "rus"); //функция обработки символов
    SOCKET S; //дескриптор прослушивающего сокета
    SOCKET NS; //дескриптор присоединенного сокета
 
    sockaddr_in serv_addr;//указатель на структуру с адресом
    WSADATA   wsadata;//хранение информации об инициализации сокетов Windows после того как WSAStartup инициализирует сокет
    char    sName[128];
    bool    bTerminate = false;
 
    // Инициализируем библиотеку сокетов
    WSAStartup(MAKEWORD(2, 2), &wsadata);
 
    // Пытаемся получить имя текущей машины
    gethostname(sName, sizeof(sName));
    printf("\nServer host: %s\n", sName);
 
    // Создаем сокет
    // Для TCP-сокета указываем параметр SOCK_STREAM
    // Для UDP - SOCK_DGRAM 
    if ((S = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        fprintf(stderr, "Can't create socket\n");
        exit(1);
    }
    // Заполняем структуру адресов 
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
 
 
    // Разрешаем работу на всех доступных сетевых интерфейсах,
    // в частности на localhost
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    // Обратите внимание на преобразование порядка байт
    serv_addr.sin_port = htons((u_short)SERVICE_PORT);
 
    // Связываем сокет с заданным сетевым интерфесом и портом
    if (bind(S, (sockaddr*)&serv_addr, sizeof(serv_addr)) == INVALID_SOCKET)
    {
        fprintf(stderr, "Can't bind\n");
        exit(1);
    }
 
    struct sockaddr_in sin;
                int addrlen = sizeof(sin);
                if (getsockname(S, (struct sockaddr *)&sin, &addrlen) == 0 &&
                    sin.sin_family == AF_INET &&
                    addrlen == sizeof(sin))
                {
                    int local_port = ntohs(sin.sin_port);
                }
    // Переводим сокет в режим прослушивания заданного порта
    // с максимальным количеством ожидания запросов на соединение 5
    if (listen(S, 5) == INVALID_SOCKET)
    {
        fprintf(stderr, "Can't listen\n");
        exit(1);
    }
        printf("Server listen on %s:%d\n",
        inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
 
    // Основной цикл обработки подключения клиентов 
    while (!bTerminate)
    {
        printf("Wait for connections.....\n");
        sockaddr_in clnt_addr;
        int addrlen = sizeof(clnt_addr);
        memset(&clnt_addr, 0, sizeof(clnt_addr));
 
        // Переводим сервис в режим ожидания запроса на соединение.
        // Вызов синхронный, т.е. возвращает управление только при 
        // подключении клиента или ошибке 
        NS = accept(S, (sockaddr*)&clnt_addr, &addrlen);
        if (NS == INVALID_SOCKET)
        {
            fprintf(stderr, "Can't accept connection\n");
            break;
        }
        // Получаем параметры присоединенного сокета NS и
        // информацию о клиенте
        addrlen = sizeof(serv_addr);
        getsockname(NS, (sockaddr*)&serv_addr, &addrlen);
        // Функция inet_ntoa возвращает указатель на глобальный буффер, 
        // поэтому использовать ее в одном вызове printf не получится
        printf("Accepted connection on %s:%d ",
            inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
        printf("from client %s:%d\n",
            inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));
 
        // Отсылаем вводную информацию о сервере
        send_string(NS, "* * * Welcome to simple UPCASE TCP-server * * *\r\n");
        //
        char  sReceiveBuffer[1024] = { 0 };
        // Получаем и обрабатываем данные от клиента
        while (true)
        {
            int nReaded = recv(NS, sReceiveBuffer, sizeof(sReceiveBuffer)-1, 0);
            // В случае ошибки (например, отсоединения клиента) выходим
            if (nReaded <= 0) break;
            // Мы получаем поток байт, поэтому нужно самостоятельно 
            // добавить завержающий 0 для ASCII строки 
            sReceiveBuffer[nReaded] = 0;
 
            // Отбрасываем символы превода строк
            for (char* pPtr = sReceiveBuffer; *pPtr != 0; pPtr++)
            {
                if (*pPtr == '\n' || *pPtr == '\r')
                {
                    *pPtr = 0;
                    break;
                }
            }
            // Пропускаем пустые строки
            if (sReceiveBuffer[0] == 0) continue;
 
            printf("Received data: %s\n", sReceiveBuffer);
 
            // Анализируем полученные команды или преобразуем текст в верхний регистр
            if (strcmp(sReceiveBuffer, "info") == 0)
            {
                send_string(NS, "Test TCP-server.\r\n");
            }
 
 
 
            
            /*else if (strcmp(sReceiveBuffer, "port") == 0)
            {
                send_string(NS, "\n" );
                break;
            }*/
            
 
 
            else if (strcmp(sReceiveBuffer, "exit") == 0)
            {
                send_string(NS, "Bye...\r\n");
                printf("Client initialize disconnection.\r\n");
                break;
            }
            else if (strcmp(sReceiveBuffer, "shutdown") == 0)
            {
                send_string(NS, "Server go to shutdown.\r\n");
                Sleep(200);
                bTerminate = true;
                break;
            }
            
            else if (strcmp(sReceiveBuffer, "time") == 0)
            {
                time_t rawtime;
                struct tm * timeinfo;
                time(&rawtime);
                timeinfo = localtime(&rawtime);
                printf("System time: ", asctime(timeinfo));
                send_string(NS, "System time: ");
                send_string(NS, asctime(timeinfo));
 
            }
            else 
            {
                // Преобразовываем строку в верхний регистр
                char sSendBuffer[1024];
                _snprintf(sSendBuffer, sizeof(sSendBuffer), "Server reply: %s\r\n",
                    strupr(sReceiveBuffer));
                send_string(NS, sSendBuffer);
            }
            
            
        }
        // закрываем присоединенный сокет
        closesocket(NS);
        printf("Client disconnected.\n");
    }
    // Закрываем серверный сокет
    closesocket(S);
    // освобождаем ресурсы библиотеки сокетов
    WSACleanup();
    return 0;
}
// Функция отсылки текстовой ascii строки клиенту
int send_string(SOCKET s, const char * sString)
{
    return send(s, sString, strlen(sString), 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
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
 
using namespace std;
#include <cstdlib>   
using namespace std; 
 
 
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
 
 
int send_string(SOCKET s, const char * sString);
int __cdecl main(void)
{
    setlocale(LC_CTYPE, "rus"); //функция обработки символов
    WSADATA wsaData;
    SOCKET S;  // впускающий сокет и сокет для клиентов
    sockaddr_in server_addr;  // это будет адрес сервера
    int err, maxlen = 1024;  // код ошибки и размер буферов
    char* recvbuf = new char[maxlen];  // буфер приема
    char* query = new char[maxlen];  // буфер отправки
    bool    bTerminate = false;
 
    // Initialize Winsock
    WSAStartup(MAKEWORD(2, 2), &wsaData);
 
    // Connect to server
    S = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(1500);
 
 
    err = connect(S, (sockaddr *)&server_addr, sizeof(server_addr));
 
    if (err == SOCKET_ERROR) {
        printf("connect failed: %d\n", WSAGetLastError());
        closesocket(S);
        WSACleanup();
        return 1;
    }
 
    while (true)
    {
        //получаем данные с сервера
        err = recv(S, recvbuf, maxlen, 0);
    
        if (err > 0) 
        {
            recvbuf[err] = 0;
            printf((char*)recvbuf);
 
        }
        else if (err == 0)
            printf("Connection closing...\n");
        else  {
            printf("recv failed: %d\n", WSAGetLastError());
            closesocket(S);
            WSACleanup();
            return 1;
        }
        //отправлям данные на сервер
        string message, tag;
        int recvm;
        getline(cin, message);
        send(S, message.c_str(), strlen(message.c_str()), 0);
        if (message == "stop")
        {
            break;
        }
    }
    closesocket(S);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2015, 00:48
Ответы с готовыми решениями:

WinSock tcp client/server
Может у кого то есть пример простой реализации client/server на winsock ? неважно на каком языке. Мне надо что бы сервер отправлял...

"WinSock" problem with connecting Client to Server
Здравствуйте. Есть программа файлового сервера, который слушает все запросы на стандартный порт 80. Тестирую всё на localhost ...

Не могу найти в vb.net winsock контрол
я не могу найти в vb.net winsock контрол не ужели его нет?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2015, 00:48
Помогаю со студенческими работами здесь

Udp server-client. server ничего не принимает
Клиент отправляет. сервер запускается, но чтение IdUDPServer1UDPRead не выполняется. подскажите пожалуйста почему сервер не читает. ...

Client-Server: GET request refused by the server
Пишу Client-Server (Ubuntu), имеется рабочая версия для проверки. Запустил сервер, vitaly@vitaly-laptop:~/Desktop$ ./ft 10000 In...

Не могу открыть SQL Server 2014 Management Studio. Выдает ошибку
Когда нажимаю на ярлык SQL Server 2014 Management Studio сначала грузит программу, а потом выдает такую ошибку: Ошибка при загрузке меню...

Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Вот,например массив 5 5 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 считываются два числа m и n и далее в выходной...

client - server - client
Здравствуйте, я хочу розобратся как работает скрипт такого плана как вконтакте в сообщениях при нажатии кнопок на 1 машине, на второй...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru