0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84

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

18.09.2016, 14:21. Показов 2627. Ответов 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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,442
18.09.2016, 14:59
XChr, что такое передавались %| ?
0
0 / 0 / 1
Регистрация: 13.11.2013
Сообщений: 84
18.09.2016, 16:26  [ТС]
Переача данные. Т.е. сперва первое приложение передаёт данные второму. После принятия данных второе передаёт третьему, а третье - чертвёторму. После чего, четвёртое передаёт третьему, третье - второму, второе - первому. И так n-ое число раз
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,442
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,442
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru