Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056

Клиентское и серверное приложение с использованием сокетов

10.09.2021, 15:09. Показов 1642. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
прив! сразу предупрежу, что весь код взят с просторов интернета.. объясните вкратце что делает код программы? как откомпилировать и запустить на выполнение, где посмотреть результат работы?

и так, код сервера:
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
#include <winsock2.h>
#include <stdio.h>
 
int main(void)
{
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    sockVer = MAKEWORD(2,2);
 
    WSAStartup(sockVer, &amp;wsaData);
 
    //Создаем сокет
    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(servSock == INVALID_SOCKET)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
    SOCKADDR_IN sin;
    sin.sin_family = PF_INET;
    sin.sin_port = htons(1111);
    sin.sin_addr.s_addr = INADDR_ANY;
 
    retVal = bind(servSock, (LPSOCKADDR)&amp;sin, sizeof(sin));
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to bind\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    //Пытаемся начать слушать сокет
    retVal = listen(servSock, 10);
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to listen\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
    //Ждем клиента
    SOCKET clientSock;
 
    clientSock = accept(servSock, NULL, NULL);
 
    if(clientSock == INVALID_SOCKET)
    {
        printf("Unable to accept\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    char szReq[8]; 
    retVal = recv(clientSock, szReq, 8, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        return SOCKET_ERROR;
    }
 
    printf("Got the request from client\n%s\n",szReq);
 
    char *szResp = "Response";
 
    printf("Sending response from server\n");
    retVal = send(clientSock, szResp, strlen(szResp), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        return SOCKET_ERROR;
    }
 
    //Закрываем сокет
    closesocket(clientSock);
    closesocket(servSock);
 
    WSACleanup();
    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
#include <stdio.h>
#include <winsock2.h>
 
int main()
{
    WORD ver = MAKEWORD(2,2);
    WSADATA wsaData;
    int retVal=0;
 
    WSAStartup(ver,(LPWSADATA)&amp;wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");
 
    if(!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        return 1;
    }
 
    //Создаем сокет
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt-&gt;h_addr_list);
    serverInfo.sin_port = htons(1111);
 
    retVal=connect(clientSock,(LPSOCKADDR)&amp;serverInfo, sizeof(serverInfo));
    if(retVal==SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        return 1;
    }
 
    printf("Connection made sucessfully\n");
 
    char *pBuf = "Request";
 
    printf("Sending request from client\n");
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        WSACleanup();
        return 1;
    }
 
    char szResponse[9];
    retVal = recv(clientSock, szResponse, 9, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        return 1;
    }
 
    printf("Got the response from server\n%s\n",szResponse);
 
    closesocket(clientSock);
    WSACleanup();
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2021, 15:09
Ответы с готовыми решениями:

Создайте на основе сокетов клиент/серверное приложение
Всем привет!!! не могу разобраться с клиент серверными приложениями. Мне нужно выполнить задание где на основе данного кода нужно создать...

Создать на основе сокетов клиент/серверное визуальное приложение
Создать на основе сокетов клиент/серверное визуальное приложение: 1. Клиент посылает через сервер сообщение другому клиенту. 2. Чат....

Создать на основе сокетов клиент/серверное визуальное приложение
Создать на основе сокетов клиент/серверное визуальное приложение Сервер рассылает сообщения выбранным из списка клиентам. Список...

6
фрилансер
 Аватар для Алексей1153
6384 / 5540 / 1118
Регистрация: 11.10.2019
Сообщений: 14,719
10.09.2021, 15:34
proc3nt, берётся, к примеру, студия. Создаётся консольный проект для винды

в коде ошибки из-за кривого копирования:
&amp; - это &
&gt; - это >
0
Эксперт CЭксперт С++
 Аватар для liv
5118 / 4572 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
10.09.2021, 15:52
proc3nt, сервер:
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
#include <winsock2.h>
#include <stdio.h>
 
#pragma comment (lib, "ws2_32.lib")     //для сокетов нужна эта либа
 
int main(void)
{
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    sockVer = MAKEWORD(2, 2);           //задаем требуюмую версию WSA
 
    WSAStartup(sockVer, &wsaData);      //инициируем работу с сокетами
 
    //Создаем сокет
    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);    //создаем серверный сокет TCP
 
    if (servSock == INVALID_SOCKET)     //создался?
    {
        printf("Unable to create socket\n");    //нет - выводим ошибку
        WSACleanup();                           //и закрываем WSA
        return SOCKET_ERROR;
    }
    SOCKADDR_IN sin;                            //IP-адрес и порт входного соединения сервера
    sin.sin_family = PF_INET;                   //семейство
    sin.sin_port = htons(1111);                 //порт
    sin.sin_addr.s_addr = INADDR_ANY;           //любой входной адрес
 
    retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin)); //связываем сокет с IP-адресом и портом
    if (retVal == SOCKET_ERROR)                 //ошибка?
    {
        printf("Unable to bind\n");             //увы...
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    //Пытаемся начать слушать сокет
    retVal = listen(servSock, 10);              //начинаем "слушать" порт, позволяем до 10 соединений.
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to listen\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
    //Ждем клиента
    SOCKET clientSock;                          //сокет клиента
 
    clientSock = accept(servSock, NULL, NULL);  //разрешаем подключение к серверному сокету
 
    if (clientSock == INVALID_SOCKET)           //ошибка?
    {
        printf("Unable to accept\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    char szReq[8];
    retVal = recv(clientSock, szReq, 8, 0);     //принимаем сообщение из клиентского сокета
 
    if (retVal == SOCKET_ERROR)                 //ошибка?
    {
        printf("Unable to recv\n");
        return SOCKET_ERROR;
    }
 
    printf("Got the request from client\n%s\n", szReq); //выводим
 
    const char *szResp = "Response";            //ответ сервера
 
    printf("Sending response from server\n");
    retVal = send(clientSock, szResp, strlen(szResp), 0);   //посылаем ответ клиенту
 
    if (retVal == SOCKET_ERROR)                 //ошибка?
    {
        printf("Unable to send\n");
        return SOCKET_ERROR;
    }
 
    //Закрываем сокет
    closesocket(clientSock);                    //закрываем сокет клиенра, разрываем соединение
    closesocket(servSock);                      //закрываем сокет сервера
 
    WSACleanup();                               //отключаемся от WSA
    return 0;
}
Добавлено через 4 минуты
proc3nt, клиент:
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
#include <stdio.h>
#include <winsock2.h>
 
#pragma comment (lib, "ws2_32.lib") //без нее никак!
 
int main()
{
    WORD ver = MAKEWORD(2, 2);
    WSADATA wsaData;
    int retVal = 0;
 
    WSAStartup(ver, (LPWSADATA)&wsaData);   //инициализация WSA
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");   //узнаем IP-адрес localhost (127.0.0.1)
 
    if (!hostEnt)                           //получилось?
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        return 1;
    }
 
    //Создаем сокет
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);  //создаем сокет для TCP
 
    if (clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;             //IP-адрес и порт сервера
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR) *hostEnt -> h_addr_list);   //IP
    serverInfo.sin_port = htons(1111);
 
    retVal = connect(clientSock, (LPSOCKADDR)&serverInfo, sizeof(serverInfo));  //соединяемся
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        return 1;
    }
 
    printf("Connection made sucessfully\n");
 
    const char *pBuf = "Request";               //строка запроса
 
    printf("Sending request from client\n");
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);   //отправляем
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        WSACleanup();
        return 1;
    }
 
    char szResponse[9];
    retVal = recv(clientSock, szResponse, 9, 0);    //принимаем ответ
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        return 1;
    }
 
    szResponse[retVal] = 0;                         //в ответе нет завершающего нуля!
 
    printf("Got the response from server\n%s\n", szResponse);
 
    closesocket(clientSock);                        //закрываем сокет
    WSACleanup();
 
    return 0;
}
Добавлено через 1 минуту
Отдельно формируем сервер и клиент.
Запускаем сервер. Потом клиента.
После одиночного обмена обе программы завершаются...
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
10.09.2021, 15:53  [ТС]
Цитата Сообщение от liv Посмотреть сообщение
//для сокетов нужна эта либа
#pragma comment (lib, "ws2_32.lib")    
liv, а где ее можно взять?)
0
Эксперт CЭксперт С++
 Аватар для liv
5118 / 4572 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
10.09.2021, 15:56
proc3nt, стандартная либа. Нету что ли?
В чем пишем?
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
10.09.2021, 16:00  [ТС]
Цитата Сообщение от liv Посмотреть сообщение
В чем пишем?
сильно преувеличено, всего лишь только копируем..)
вообще Code::Blocks, но можно Visual Studio 2012
0
Эксперт CЭксперт С++
 Аватар для liv
5118 / 4572 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
10.09.2021, 16:55
Не люблю Code::Block именно из-за таких моментов... Может и есть, искать надо... А может, и нет
В студии точно должно быть.

Добавлено через 6 минут
О! Получилось в Code::Blocks
pragma убрать. В настройках Settings/Compiler/Linker Settings добавить ws2_32

Добавлено через 35 минут
proc3nt, и похоже, для CodeBlocks эта либа называется libws2_32.a.
Так что, в настройках лучше подключить libws2_32

Добавлено через 3 минуты
Впрочем, без разницы. В пакете все равно добавляется -lws2_32
Т.е. префикс lib добавляется/убирается автоматически

Вообще-то, подобные задачи лучше делать многопотоковыми. Особенно, сервер...
Чтобы одно соединение отрабатывалось в своем потоке...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2021, 16:55
Помогаю со студенческими работами здесь

Распределенное приложение с использованием интерфейса сокетов.
Приветствую. У меня создано приложение на технологии IB Express, которое может редактировать, просматривать, удалять, добавлять данные из...

Android приложение с использованием сокетов из определенного класса
Здравствуйте, столкнулся с некой проблемой создания клиент-сервер соединения через сокеты в андроид приложении. Итак - имеется 2 класса: ...

Клиент - серверное приложение с использованием rpc
Здравствуйте, задали написать клиент - серверное приложение с использованием rpc(максимально простое), может кто-то делал или есть примеры...

Реализовать клиент-серверное приложение с использованием БД
Добрый день. У меня в задании написано реализовать приложение, что бы оно было клиент-серверным. . Что это значит? Если у меня win...

Клиент-серверное приложение на С с использованием RPC
Имеется такая проблема. С использованием RPC реализовать клиент-серверное приложение. На вход клиенту задается имя файла, которое...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru