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

Сокеты

06.06.2018, 14:23. Показов 1965. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
объясните ,пж,те места ,которые мне непонятны в коде.
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
//разве мы не должны делать еще и так :#pragma comment( lib, "ws2_32.lib" )
#include <winsock2.h>
#include <stdio.h>
 
int main(void)
{
 
    WORD sockVer;
 
    WSADATA wsaData;
    int retVal;
 //откуда эти цифры(2 и 2)?
    sockVer = MAKEWORD(2,2);
 
    WSAStartup(sockVer, &wsaData);//что за сокет мы создаем?У него же даже имени нет.И разве структура 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)&sin, sizeof(sin));
    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);//максимум можно прочитать 8 символов?или это имя?по какому принципу тогда recv 
                                                           //достал это имя?
 
    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;//суть сервера была в том ,чтобы получить какое-то значение с сокета?
}
Добавлено через 7 минут
это,если что,код клиента,с которым у меня такие же вопросы
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)&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
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2018, 14:23
Ответы с готовыми решениями:

Сокеты
Ребята, подскажите отчего такое происходит и как бороться. Ситуация такая. Программа создает сокет и слушает порт, полученную информацию...

Сокеты в C++
В сервере ошибок нет, он ждёт подключения, а клиент выдает ошибку 10049, и закрывается. Как исправить код чтобы всё работало как надо?...

Сокеты
Здравствуйте!Начал изучать сокеты в винде, сервер и клиент есть, но у меня есть несколько вопросов: 1.Вкратце, клиент отправляет...

3
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,102
06.06.2018, 14:55
Лучший ответ Сообщение было отмечено lfyjy как решение

Решение

разве мы не должны делать еще и так :#pragma comment( lib, "ws2_32.lib" )
Стандартный способ подключения библиотек заключается в указании их имён линковщику в настройках проекта.
В реализации майкрософта можно подключать библиотеки нестандартно, пользуясь данной прагмой в исходнике.
Раз прагма не написана, значит библиотека подключена стандартным способом через настройки.

откуда эти цифры(2 и 2)?
Например, отсюда WSAStartup.

что за сокет мы создаем?У него же даже имени нет.И разве структура wsaData не пустая?
Тут не создаётся сокет, а выполняется подготовка сетевой библиотеки к работе. Структура заполняется библиотекой и возвращается программе, почитайте документацию по предыдущей ссылке. Сокет создаётся в следующей строке.

рандомный порт?
Да, относительно. С одной стороны важно что бы он не был занят стандартными сервисами, с другой стороны клиент должен его знать, так как он будет обращаться к нашему серверу по данному порту.

здесь запись вообще не ясна
Сокет создаётся на всех доступных сетевых интерфейсах. Если у вас в компе много сетевых карточек со своими IP подключенными к разным сетям, то клиент сможет достучаться до нашего сервера по любой из этих сетей.

не совсем понимаю,что значит слушать сокет
Существуют разные способы работать с сетью. Есть такие, которые устанавливают соединение между двумя компами и работают в рамках этого соединения. Именно такой случай используется в данном примере (TCP). Слушать, означает ждать запроса от клиента на соединение. Когда запрос придёт будет создан ещё один сокет, с которым соединится сокет клиента. Всё общение клиента и сервера будет происходить без участия первого сокета, который используется только для установки соединения.

откуда 10?
Относительно произвольно. Читайте описание listen.

Ждем клиента.В каком смысле ждем?мы же ничего не ждем,а просто создаем еще один сокет.
В процессе соединения автоматически выполняются различные сетевые посылки для подтверждения. Можно сказать ждём, наверное. Хотя основное ожидание было в listen.

максимум можно прочитать 8 символов?или это имя?по какому принципу тогда recv достал это имя?
Так как по умолчанию приём блокирующий, то 8 это не максимум, а точный размер. Пока от клиента не придут 8 байт или не будет разорвано соединение выполнение программы не продолжится.

суть сервера была в том ,чтобы получить какое-то значение с сокета?
Да.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
07.06.2018, 13:31
Цитата Сообщение от Ygg Посмотреть сообщение
Так как по умолчанию приём блокирующий, то 8 это не максимум, а точный размер. Пока от клиента не придут 8 байт или не будет разорвано соединение выполнение программы не продолжится.
https://linux.die.net/man/2/recv
The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.
1
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,102
07.06.2018, 13:45
GbaLog-, значит я был не прав. Из-за своей блокированности recv будет ждать только появления данных. А когда они появятся, то переместит их в пользовательский буфер, но не больше 9 байт. В данном примере полученные данные интерпретируются как текстовая строка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2018, 13:45
Помогаю со студенческими работами здесь

Сокеты и C++
Клиент и сервер не видят друг друга, в сервере ошибок нет, а в клиенте выходит вот это: 750281F0, не где не нашёл такой ошибки. Что не так...

Сокеты
Есть код сервера #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;WinSock2.h&gt; #include &lt;windows.h&gt; #pragma comment (lib,...

Сокеты
Здравствуйте, Дайте пожалуйста ссылочку на какой-то хороший справочник по сокетам в С++ (компилятор Dev-C++). Желательно для новичков,...

Сокеты
Добрый день! Сделал клиент и сервер с winsock2. Минимальный функционал: подключение и отправка с сервера строки в клиент. На localhost...

UDP сокеты
Всем привет. Такой вопрос. Вот у меня есть приложение, которое отправляет используя UDP сокеты данные серверу. Таких клиентов может быть...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru