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

Передача сокетов между приложениями

18.09.2016, 14:21. Показов 2660. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть сервер и есть приложения, в конечном счёте, нужно сделать так, чтобы сокеты переправлялись заданное число раз (цикл n раз). То, как должна быть организована передача файлов, изображено на рисунке. Вопрос такой: как сделать передачу сокета от приложения 4 к приложению 3 и т.д.? Как это зациклить на n раз?

Код клиента
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <ctime>
#define SERVERADDR "127.0.0.1"
using namespace std;
 
int main(int argc, char* argv[])
{
    char buff[1024];
    printf("TCP CLIENT\n");
 
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        printf("WSAStart error %d\n", WSAGetLastError());
        return -1;
    }
 
    system("pause");
 
    auto my_sock = socket(AF_INET, SOCK_STREAM, 0);
 
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    dest_addr.sin_port = htons(15002);
 
    if (connect(my_sock, (LPSOCKADDR)&dest_addr, sizeof(dest_addr)) == SOCKET_ERROR) return 0;
 
    srand(time(nullptr));
 
    // Отсылаем ответ серверу
    char num[5];
    _itoa_s(rand() % 3000, num, 5, 10);
    strcpy_s(buff,"#1 sends regards to #2. Num is ");
    strcat_s(buff, num);
//  char* reply = "#1 sends regards to #2. Num is ";
    Sleep(rand() % 3000);
    send(my_sock, buff, (int)strlen(buff), 0);
    closesocket(my_sock);
 
 
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    dest_addr.sin_port = htons(15003);
    if (connect(my_sock, (LPSOCKADDR)&dest_addr, sizeof(dest_addr)) == SOCKET_ERROR) return 0;
 
    _itoa_s(rand() % 3000, num, 5, 10);
    strcpy_s(buff,"#1 sends regards to #2. Num is ");
    strcat_s(buff, num);
    Sleep(rand() % 3000);
    send(my_sock, buff, (int)strlen(buff), 0);
    closesocket(my_sock);
 
    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
78
79
80
81
#include "stdafx.h"
using namespace std;
 
#define MY_PORT 15002
 
int main()
{
    setlocale(0, "");
    char buff[1024]; // Буфер для различных нужд
 
    printf("TCP SERVER \n");
 
    if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 2 - создание сокета
    auto mysocket = socket(AF_INET, SOCK_STREAM, 0);
 
    // Шаг 3 - связывание сокета с локальным адресом
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(MY_PORT);
    local_addr.sin_addr.s_addr = INADDR_ANY;
 
    // вызываем bind для связывания
    bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr));
 
    // Шаг 4 - ожидание подключений
 
    listen(mysocket, 0x100);
 
    printf("Ожидание подключений...\n");
 
    while (true)
    {
        // Принимаем соединения от клиентов
        int from_len;
        SOCKET client_socket; // Сокет клиента
        sockaddr_in client_addr; // Адрес клиента
 
        from_len = sizeof(client_addr);
        client_socket = accept(mysocket, (LPSOCKADDR)&client_addr, &from_len);
 
        // Проверяем ошибочность соединения
        if (client_socket == INVALID_SOCKET)
            continue; // Если что опять переходим в режим ожидания соединения
 
        cout << "Client connected [" << inet_ntoa(client_addr.sin_addr) << "]..." << endl;
 
        // Отсылаем "приветствие" подключившемуся клиенту
        //      char* greeting = "Hello!!!";
        //      send(client_socket, greeting, (int)strlen(greeting), 0);
 
        // Получаем ответ клиента
 
        int len = recv(client_socket, buff, 1024, 0);
        if (len != SOCKET_ERROR)
        {
            buff[len] = 0; // Не забываем ставить терминирующий ноль (если мы строку принимаем)
            cout << buff << endl;
        }
 
        // Закрываем сокет
        closesocket(client_socket);
 
        // Переходим к следующему клиенту
        cout << "...disconnected" << endl;
    }
 
    // 6. Закрываем серверный сокет
    closesocket(mysocket);
 
    // 7. Завершаем работу с сокетами
    WSACleanup();
 
    return 0;
}


Изображение того, как должна происходить передача, находится в приложениях
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2016, 14:21
Ответы с готовыми решениями:

Передача файла с помощью сокетов (UDP)
Всем привет! Пишу лабу по сокетам. Полностью задание звучит так: У меня возникла проблема с передачей файла блоками и заданием в...

Обмен данными между приложениями
Здравствуйте Нужна помощь Нужна программа которая будет брать некие данные из одной программы и копировать их в другую программу и...

Обмен информацией между приложениями
Допустим, мы имеем 2 приложения (запущенных exe-файла), не буду называть процессами, т.к. пока что не понял, может ли приложение быть...

12
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
18.09.2016, 14:59
XChr, что такое передавались %| ?
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
18.09.2016, 16:26  [ТС]
Переача данные. Т.е. сперва первое приложение передаёт данные второму. После принятия данных второе передаёт третьему, а третье - чертвёторму. После чего, четвёртое передаёт третьему, третье - второму, второе - первому. И так n-ое число раз
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
18.09.2016, 17:20
XChr, и в чем проблема? данные приходят в приложение и оно шлет их указанному абоненту. абоненты для каждой копии приложения указываются так что образуют цепочку
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
20.09.2016, 18:16  [ТС]
А как сделать это, например, 4 раза?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
20.09.2016, 18:39
Есть несколько вопросов:
1. Вам нужна передача сокетов (т.е. указание откуда читать) или данных?
2. Данные раздает сервер? Должны ли приложения модифицировать данные?
3. Должен ли получатель знать отправителя?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
20.09.2016, 19:10
XChr, пусть передатчики считают до 4х или передают счётчик в сообщении или ещё 101 вариант что за задача вцелом?
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
26.09.2016, 06:48  [ТС]
1. Если я всё правильно понимаю, то передаётся дескриптор сокета (функции connect, accept)
2. Сервер генерирует случайные числа с случайными интервалами времени и отдаёт их первому клиенту, то - второму и т.д.
3. Получать, по идее, должен знать отправителя, потому что "на обратном пути" ему понадобиться отправить ему сокет.

Я пытался сделать отдельный сервер, ответственный за циклы, но я запутался и у меня ничего не получилось. К сообщению прикрепляю схему того, что я хотел сделать.

С - Сервер
Он отправляет (зелёная стрелочка) количество циклов и итераций, которые определил пользователь.

СЦ - Сервер циклов
Хранит информацию о количестве выполненных итераций. В случае, если количество итераций равно определённому пользователем значению, то дальнейшая отправка сокетов прекращается.

К1..4 - Клиент
Клиент перед каждой отправкой сокета другому клиенту отправляет сообщение СЦ о том, что он собирается это сделать, и если СЦ одобряет это, то клиент совершает передачу сокета другому клиенту.

Схема вроде бы рабочая, но это только для одного сокета. Что делать, если спустя какое-то время из сервера отправляется новый сокет?
Миниатюры
Передача сокетов между приложениями  
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
26.09.2016, 07:08  [ТС]
Сейчас возникла идея создания ассоциативного массива, у которого в качестве ключа будет использоваться число, которое ходит по циклу, а в качестве значения количество переходов от одного клиента к другому. Может кто-нибудь ещё что-нибудь предложить?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
26.09.2016, 11:50
Вы немого не правильно понимаете, в Вашем случае передаются данные, а не сам дескриптор. Вопрос: зачем клиент должен передавать данные другому клиенту?, может ли сервер выслать данные двум клиентам?

Вероятнее всего в Вашем случае все должно быть просто, есть сервер у которого есть список клиентов он проходя по этому списку отправляет данные.
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
26.09.2016, 12:20  [ТС]
Я выполняю лабораторную работу. Преподаватель нарисовал мне схемку, которую я прикрепил в первом посте и сказал: "1..4 - приложения, которые обменивают между с собой случайные числа с случайными интервалами времени. Предусмотреть возможность циклов".
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
26.09.2016, 16:38
Что означают стелки вперед и стрелки назад в изначальном рисунке?
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
26.09.2016, 20:15  [ТС]
Направление, по которому передаются данные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.09.2016, 20:15
Помогаю со студенческими работами здесь

Обмен данными по сети между двумя приложениями
Всем доброго времени суток! суть вопроса: есть 2 приложения на разных компах. Одно приложение рассчитывает параметры движения объекта,...

Передача данных между приложениями
Задача такая: есть приложение, после его отработки сохраняются данные, затем запускается другое приложение которое надо загрузить данные...

Передача данных между приложениями
Есть два приложения на c# одно консольное, другое windows forms. Эти приложения должны обмениваться определёнными данными. Каким способом...

Передача данных между приложениями
я вызываю функцию CreateProcess(NULL, filename, NULL, NULL, 0, 0, t, NULL, &amp;st, &amp;pr)filename это имя экзешника , запускаемой проги ...

Передача объектов между приложениями
Есть ли способ напрямую передать объекты из одного .NET приложения в другое? Объём достаточно большой, поэтому сериализация-десериализация...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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