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

Передача данных между программами (сокеты)

29.04.2010, 22:24. Показов 13633. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, есть 2 программы, между которыми нужно передавать данные. Хотелось бы организовать это с помощью сокетов. Язык С++, пишу в windows. Но, увы, ничего толкового нагуглить не получилось. Если кто знает какую-то толковую литературу про сокеты в с++, помогите пожалуйста
Да, для упрощения задачи, обе программы находятся на одном компьютере.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.04.2010, 22:24
Ответы с готовыми решениями:

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

Передача данных между программами
Здравствуйте. Нужно написать приложение на C# выполняющее передачу данных между Microsoft Office и Opera (передача web страниц данных) за...

Передача данных между программами и сигналы
Здравствуйте, помогите пожалуйста с заданием. Есть 3 программы. Первая создает набор данных (например массив типа int или даже одно...

3
11 / 11 / 2
Регистрация: 18.07.2009
Сообщений: 123
29.04.2010, 23:23
есть небольшая простенькя статья у криса касперски, вот http://www.insidepro.com/kk/006/006r.shtml
есть целые книжки на эти темы, например Э.Джонс, Д.Оланд "Программирование в сетях Windows"
1
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
09.05.2010, 15:42  [ТС]
Спасибо, почитал, немного разобрался, потестил пример. Но теперь возникла такая проблема...
При компиляции примера ТСР-сервера с ссылки выше, все было нормально. Но, как только я его засунул в .h файл при Windows Forms Application, при компиляции вылезли 2 ошибки:

Code
1
2
3
1>c:\users\андрей\documents\visual studio 2008\projects\supervisor_test\supervisor_test\Server.h(109) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'DWORD (__stdcall *)(LPVOID)' to 'LPTHREAD_START_ROUTINE'
1>        Address of a function yields __clrcall calling convention in /clr:pure and /clr:safe; consider using __clrcall in target type
1>c:\users\андрей\documents\visual studio 2008\projects\supervisor_test\supervisor_test\Server.h(14) : error C3641: 'SexToClient' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
Ошибки вылазят на этих двух строчках:

CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
DWORD WINAPI SexToClient(LPVOID client_socket);

В чем проблема?

Добавлено через 18 минут
О, уже сам нашел. Изменил Common Language Runtime support -> "/clr:pure" на "/clr"
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
10.05.2010, 16:09  [ТС]
И снова здасьте...

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
//#include "Server.h"
//#include "test.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sstream>
#include <winsock2.h>
#include <windows.h>
using namespace std;
//      Мои константы
#define MY_PORT 666
//      Мои переменные
int nclients = 0;
string s;
//      Мои функции
//      ------------
#pragma once
 
namespace SuperVisor_Test {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
    /// <summary>
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
 
 
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::Button^  button3;
    private: System::Windows::Forms::TextBox^  Chat;
 
 
    protected: 
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->button2 = (gcnew System::Windows::Forms::Button());
            this->button3 = (gcnew System::Windows::Forms::Button());
            this->Chat = (gcnew System::Windows::Forms::TextBox());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(35, 247);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = L"Begin";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // button2
            // 
            this->button2->Location = System::Drawing::Point(415, 247);
            this->button2->Name = L"button2";
            this->button2->Size = System::Drawing::Size(75, 23);
            this->button2->TabIndex = 2;
            this->button2->Text = L"End";
            this->button2->UseVisualStyleBackColor = true;
            // 
            // button3
            // 
            this->button3->Location = System::Drawing::Point(217, 247);
            this->button3->Name = L"button3";
            this->button3->Size = System::Drawing::Size(75, 23);
            this->button3->TabIndex = 3;
            this->button3->Text = L"Send";
            this->button3->UseVisualStyleBackColor = true;
            // 
            // Chat
            // 
            this->Chat->Location = System::Drawing::Point(35, 12);
            this->Chat->Multiline = true;
            this->Chat->Name = L"Chat";
            this->Chat->Size = System::Drawing::Size(455, 209);
            this->Chat->TabIndex = 4;
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(571, 374);
            this->Controls->Add(this->Chat);
            this->Controls->Add(this->button3);
            this->Controls->Add(this->button2);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->ResumeLayout(false);
            this->PerformLayout();
 
        }
#pragma endregion
    
//  Мои функции
 
private: void PRINTNUSERS() //  функция печати кол-ва клиентов
{
    if (nclients)
    {
        std::stringstream out;
        out << nclients;
        s = out.str();
        String^ MyString = gcnew String(s.c_str());
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, MyString); 
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, " user on-line\r\n");
    }
    else Chat->Text=Chat->Text->Insert(Chat->Text->Length, "No User on line\r\n");
}
 
private: DWORD WINAPI SexToClient(LPVOID client_socket) //  создаем отдельный поток для каждого пользователя
{
    SOCKET my_sock;
    my_sock = ((SOCKET *)client_socket)[0];
    char buff[20 * 1024];
    #define sHELLO "Hello, Sailor\r\n"
    send(my_sock, sHELLO, sizeof(sHELLO), 0);
    int bytes_recv;
    while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
        bytes_recv != SOCKET_ERROR){
    buff[bytes_recv]=0;
    printf("C=>S:%s", buff, "\n");
    printf("S=>C:"); fgets(&buff[0], sizeof(buff) - 1, stdin);
    send(my_sock, &buff[0], strlen(&buff[0]), 0);
    }
    nclients--; 
    printf("-disconnect\n"); PRINTNUSERS();
    closesocket(my_sock);
    return 0;
} 
 
private: void serv() //  основная функция "СЕРВЕР"
{
//  буфер
    char buff[1024]; 
 
//  инициализация winsock2
    if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Error WSAStartup\r\n");
    else 
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "WSAStartup OK!!!\r\n");
    SOCKET mysocket;
    
//  создание сокета
    if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Error socket\r\n");
        WSACleanup(); 
    }
    else
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Socket OK!!!\r\n");
 
//  создание адреса
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(MY_PORT); 
    local_addr.sin_addr.s_addr = 0;
 
//  связываем сокет с локальным адресом
    if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr)))
    {    
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Error bind\r\n");
        closesocket(mysocket);
        WSACleanup();
    }
    else
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Bind OK!!!\r\n");
 
//  ожидаем подключения
    if (listen(mysocket, 0x100))
    {
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Error listen\r\n");
        closesocket(mysocket);
        WSACleanup();
    }
    else
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Listen OK!!!\r\n");
    Chat->Text=Chat->Text->Insert(Chat->Text->Length, "Waiting for connection...\r\n");
 
//  создание клиентского сокета
    SOCKET client_socket; 
    sockaddr_in client_addr; 
    int client_addr_size = sizeof(client_addr);
 
// цикл извлечения запросов на подключение из очереди
    while ((nclients<3)&&(client_socket = accept(mysocket, (sockaddr *)&client_addr, &client_addr_size)))
    {
        nclients++;
        HOSTENT *hst;
        hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);
        Chat->Text=Chat->Text->Insert(Chat->Text->Length, "New connect!!!\r\n");
        PRINTNUSERS();
        DWORD thID;
        CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
    }
}
 
//  Программные функции
 
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             serv();
         }   
 
    };
}
В общем, пока разбираюсь с сокетами, решил перенести сервер с консоли на форму. В консольном приложении было все хорошо, все работало, здесь же выдает ошибку:
Code
1
2
1>c:\users\андрей\documents\visual studio 2008\projects\supervisor_test\supervisor_test\Form1.h(158) : warning C4441: calling convention of '__stdcall ' ignored; '__clrcall ' used instead
1>c:\users\андрей\documents\visual studio 2008\projects\supervisor_test\supervisor_test\Form1.h(240) : error C3867: 'SuperVisor_Test::Form1::SexToClient': function call missing argument list; use '&SuperVisor_Test::Form1::SexToClient' to create a pointer to member
С варнингом то ладно еще, но с ошибкой не знаю что делать... то что предлагает компилятор, не пашет. Помогите плиз, первый раз в visual c++ на форме работаю)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2010, 16:09
Помогаю со студенческими работами здесь

Передача данных между программами через TCP/IP
При передаче через сокет между двумя прогами на одном компе (т.е. на адрес 127.0.0.1) все данные пересылаються без проблем, при передаче же...

Передача изображений между программами
Мне нужно создать связь между программами. То есть одна программа должна предоставить другой - изображение (генерируется с интервалом 1...

Передача значений переменных между двумя программами на разных компьютерах
Как организовать передачу значений переменных между двумя программами? Нужно передать значение переменной А из первой во вторую...

Сокеты: передача данных
И так есть сервер, и в нем прослушка для приема файлов: Socket sListener; Socket fileHandler; .... ...

База данных и обмен между программами!
Есть две программы базы данных. Одна находится на одном компьютере ,а вторая на другом(не локальная сеть) К примеру я в базу данных...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru