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

Клиент-сервер не "видят" друг друга

05.10.2012, 11:04. Показов 1930. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! У меня имеется программа-сервер и программа-клиент, написанная по F.A.Q. Не совсем понимаю, как работать с IP-адресом, чтобы сервер и клиент видели друг-друга, прошу помощи, спасибо!

Вот килент и сервер:

Code
1
http://www4.zippyshare.com/v/91223555/file.html
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2012, 11:04
Ответы с готовыми решениями:

Клиент и сервер не видят друг друга
Здравствуйте! Бьюсь уже третий день, порты в роутере проброшены, брандмауэр настроен(пробовал даже выключать), но все равно, сервер и...

Сервер и клиент не видят друг друга
Сервер и клиент не видят друг друга. Как нужно изменить код чтобы они работали корректно? Заранее спасибо. Вот код клиента: #pragma...

Socket клиент и сервер не видят друг друга через Интернет
Добрый вечер, накатал 2 проектика, скомпилировал, у клиента есть форма для подключения, сервер только слушает определённый порт. потавил у...

17
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 11:08
Вопрос не совсем понятен! Исходники выложите!
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 11:10  [ТС]
ITDeveloper, Дык я ссылку на исходники дала, там полностью проекты для клиента и сервера
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 11:15
Вы не ссылку на левый сайт давайте, а исходники в форум добавьте, чтоб каждый форумчанин мог посмотреть и обсудить вашу проблему, избавив себя от лишних телодвижений!
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:05  [ТС]
А как прикрепить вложение?)
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:14
Внизу под редактором сообщений: Дополнительные опции-> Управление вложениями. Но лучше прям исходные коды вставьте в сообщение! Так гораздо наглядней будет!
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:15  [ТС]
Вот, пожалуйста, программа, спасибо)
Вложения
Тип файла: rar прога.rar (680.3 Кб, 10 просмотров)
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:27
Хорошо! Сам выложу ваши исходники!
Клиент:

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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMemoryStream *MS = new TMemoryStream ; // создаем поток
void Write(AnsiString Text);  // ф-я записи инфы в поток
int Size ; // размер пореданного файла
bool Receive ; // передаем ли мы на данный момент файл
AnsiString FileName ;  // имя файла
 
void Write(AnsiString Text)
{
if(MS->Size < Size)  // если мы еще принимаем файл и размер потока меньше размера файла
{
MS->Write(Text.c_str(),Text.Length()); // записываем в поток
Form1->Memo1->Lines->Add("Принимаем данные..."); //
}
if(MS->Size == Size) // если файл принят и размер потока соответствует размеру файла
{
Receive = false ; // останавливаем режим передачи
MS->Position = 0 ;   // переводим каретку потока в начало
Form1->Client->Socket->SendText("end"); // отсылаем серверу что мы приняли файл
CreateDir("Downloads"); // создаем папку для сохраненных файлов
MS->SaveToFile("Downloads\\"+FileName); // сохраняем туда наш файл
MS->Clear() ; // освобождаем поток
Size = 0 ;
Form1->Memo1->Lines->Add("Файл принят !");
}
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
   AnsiString Rtext ;  // текст, который посылает сервер
Rtext = Client->Socket->ReceiveText() ;
if(Receive == true) // если мы в режиме передачи файла, то
{
Write(Rtext); // записываем его в поток
}
else // если нет , то
{
Memo1->Lines->Add("Приняли текст :" + Rtext);
if(Rtext.SubString(0,Rtext.Pos("#")-1) == "file") // Если это файл, то...
{
Rtext.Delete(1,Rtext.Pos("#")) ;    // удаляем слово file
Name = Rtext.SubString(0,Rtext.Pos("#")-1); // Определяем имя файла
FileName = Name.SubString(Name.LastDelimiter("\\")+1,Name.Length()); ; // Выделяем чистое имя файла , например с c:\\test.txt , берем test.txt
Rtext.Delete(1,Rtext.Pos("#")) ;  // Удаляем последний разделитель
Size = StrToInt(Rtext.SubString(0,Rtext.Pos("#")-1)) ; // Определяем размер файла
Rtext.Delete(1, Rtext.Pos("#")); // Удаляем последний разделитель
Memo1->Lines->Add("Размер файла: "+IntToStr(Size)+" байт"); // Выводим размер файла
Memo1->Lines->Add("Имя файла: "+Name); // Выводим имя файла
Receive = true; // Переводим сервер в режим приёма файла
if(Receive == true)
{
Memo1->Lines->Add("Режим приема буфера");
}
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
   Memo1->Lines->Add( "Вы присоеденились ;" );     
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
   ErrorCode = 0;
    ShowMessage( "Client Error" );       
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Client->Open() ;  // открываем 
    Memo1->Lines->Add( "Коннектимся..." );        
}
//---------------------------------------------------------------------------

Сервер:
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
//---------------------------------------------------------------------------
//                        Программа "Запрос пароля"
   //-------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <jpeg.hpp>
#include "Unit1.h"
#include "Unit2.h" //Подключаем основную форму к проекту для доступа к ее элементам
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;             
TMemoryStream *MS = new TMemoryStream ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label3Click(TObject *Sender)
{
PasswordDlg->Enter=0;   //Меняем значение этой переменной на 0 (создания нового пользователя)
PasswordDlg->ShowModal(); //Запускаем модально форму запроса пользователя и пароля, только в этом случае (переменная Enter = 0) в этой форме будет заданы имя и пароль нового пользователя
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->MainForm->Close();    //Закрываем проект, т.к. это форма не является основной, то закрыть нужно MainForm
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
if(PasswordDlg->isok)Image1->Visible=true;    //Если пароль был введен правильно, то показываем картинку. Иначе, если доступ к этой форме был осуществлен другим способом, не показываем нечего и выдаем сообщение, а после закрываем форму
else {MessageBox(0,"Вы попали на эту форму незаконно, так что сейчас вас выпроводять из программы","Сообщение",0); Close();  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label2Click(TObject *Sender)
{
ShellExecute(0,"open","http://vk.com/mazzahaker",0,0,SW_SHOWNORMAL);   //Запуск браузера и переход на наш сайт
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close ();        
}
//---------------------------------------------------------------------------
 
 
 
 
 
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
void *P;   // указатель на файл
int Size; // размер
if( OpenDialog1->Execute() )
{
    MS->LoadFromFile( OpenDialog1->FileName ); // выбираем  файл 
    Memo1->Lines->Add( "Загрузили требуемый файл в поток..." ); // заполняем лог 
}
Server->Socket->Connections[0]->SendText( "file#" + OpenDialog1->FileName + "#" + IntToStr( MS->Size ) + "#" ); 
// отправляем заголовок
 
Memo1->Lines->Add ( "Послали заголовок" );
MS->Position = 0 ;      // Устанавливаем поток в начальную позицию ;
P    = MS->Memory ;     // присваиваем указателю поток файла
Size = Server->Socket->Connections[0]->SendBuf( P , MS->Size );               // отправляем буфер клиенту; Size
                                                                              //равно размеру отправленной  информации
Memo1->Lines->Add( "Отправлено: " + IntToStr( Size ) + " из " + IntToStr( MS->Size ) ); // заполняем лог
}
//---------------------------------------------------------------------------
 
 
 
 
void __fastcall TForm1::ServerAccept(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add("К вам  присоеденились");        
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ServerClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0 ;
ShowMessage("Error");        
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ServerClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
if(Server->Socket->Connections[0]->ReceiveText()=="end")
{
Memo1->Lines->Add("Клиент принял файл");
MS->Clear() ; // освобождаем поток
}        
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Server->Active = true ;
Server->Open() ;
Memo1->Lines->Add("Создан сервер.");        
}
//------------------------
 
 
 
 
Юнит2
 
[CPP]
/---------------------------------------------------------------------
//                        Программа "Запрос пароля"
//------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
//--------------------------------------------------------------------- 
#pragma resource "*.dfm"
TPasswordDlg *PasswordDlg;
TStringList* DataList=new TStringList;     //Здесь будет хранится информация о пользователях
//---------------------------------------------------------------------
__fastcall TPasswordDlg::TPasswordDlg(TComponent* AOwner)
    : TForm(AOwner)
{
Enter=1;       //Меняем значение этой переменной на 1 (вход)
p=17;          //Так сказать, некий коэффициент, который применяется при шифровани/дешифровании пароля (не особо важен)
}
//---------------------------------------------------------------------
void __fastcall TPasswordDlg::OKBtnClick(TObject *Sender)
{
 
if( (Edit1->Text!="") && (Password->Text!="")){             //Если требуемые поля заполнены
 
DataList->LoadFromFile("data.dat");       //Загружаем наши данные из файла
 
if(!Enter){                                   //Если значение переменной Enter=0 (создание нового пользователя)
 
 if(DataList->IndexOfName(Edit1->Text)==-1){        //Если заданное имя не занято
 
   DataList->Add(Edit1->Text+"="+Crypt(Password->Text));     //Создаем запись, вида "Имя пользователя = пароль(зашифрованный)"
   DataList->SaveToFile("data.dat");                     //Сохраняем измененный список пароля-пользователей обратно в файл
   MessageBox(0,"Пользователь добавлен","Сообщение",0);      //Информируем пользователя, что все прошло успешно
   Hide();                                                   //Прячем эту форму (именно прячем, а не закрываем, потому что при ее закрытии будет закрыт весь проект (это форма является главной))
 }
 else MessageBox(0,"Такой логин уже занят, к сожалению((","Внимание",0);   //Сообщаем, что пользователь с таким именем уже существует
 }
 
if(Enter){                                                 //Если пользователь входи в программу (значение равно 1)
 {
 
    if(DataList->IndexOfName(Edit1->Text)!=-1){        //Если заданное имя существует
 
   if(Password->Text==UnCrypt(DataList->Values[Edit1->Text]) )   // Если введенный текст в поле "Пароль" равен расшифрованному значению пароля
   {
     isok=1;          //Все хорошо, вход выполнен по правилам
    MessageBox(0,"Вход выполнен","Проверка пройдена",0);  //Информируем
   Form1->Show();         //Показываем вторую форму, где содержаться "секретные данные"
     Hide();             //Скрываем эту
   }
   else MessageBox(0,"Пароль не подходит. Обратитесь к хакерам, чтобы взломали.","Не правильно((",0);          //Если пароль введен не правильно
 
 
 
 
 
 }
 else MessageBox(0,"Такой пользователь не зарегистрирован. Закройте немедленно программу!!!","Паника",0);      //Если заданный пользователь не зарегистрирован, то сообщаем об этом пользователю
 
 
 }
 }
 
 
 }
}
//---------------------------------------------------------------------------
 
void __fastcall TPasswordDlg::CancelBtnClick(TObject *Sender)
{
if(Enter)Close();          //Если ввод пароля, то закрываем форму
else { Hide(); }          //Если создание нового пользователя, то прячем
}
//---------------------------------------------------------------------------
[/CPP]
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:28  [ТС]
Извините, а смысл? Ну, там есть элементы, которые меня интересуют - они именно в проекте доступны, а конкретно - как подключиться к конкретному IP-адресу
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:41
Клиент по умолчанию у вас присоединяется на локальный адрес 127.0.0.1 Это свойство Addres компонента TClientSocket
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:41  [ТС]
ITDeveloper, Так, то есть, сюда если поставить нужный мне IP в локальной сети, то все заработает, верно?
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:43
Это удобно при отладке программы! В дальнейшем вам надо будет передавать в это свойство Ip - адрес компьютера, где работает программа сервер!
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:44  [ТС]
ITDeveloper, Понятно, спасибо, еще такой вопрос... как сделать так, чтобы в Memo1 у клиента и сервера была написана скорость передачи минимальная, максимальная и средняя? Спасибо!
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:53
Цитата Сообщение от kristi1 Посмотреть сообщение
Так, то есть, сюда если поставить нужный мне IP в локальной сети, то все заработает, верно?
Верно! только не забудте запустить на том компьютере программу сервер и при необходимости добавить его в брендмауер windows

Добавлено через 8 минут
Цитата Сообщение от kristi1 Посмотреть сообщение
Понятно, спасибо, еще такой вопрос... как сделать так, чтобы в Memo1 у клиента и сервера была написана скорость передачи минимальная, максимальная и средняя?
Как вариант: запоминаете время отправки сообщения серверу и время, когда приходит ответ от сервера. Считаете сколько прошло секунд и сколько байтов перадалось туда - обратно за это время!
1
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 12:53  [ТС]
ITDeveloper, Спасибо, буду пробовать!
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
05.10.2012, 12:55
Пишите!
0
11 / 11 / 2
Регистрация: 07.03.2010
Сообщений: 465
05.10.2012, 13:19  [ТС]
ITDeveloper, Вы не могли бы помочь с передачей данных...? я не совсем понимаю как это можно сделать, если честно
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
08.10.2012, 05:40
Цитата Сообщение от kristi1 Посмотреть сообщение
Вы не могли бы помочь с передачей данных...? я не совсем понимаю как это можно сделать, если честно
Уточните!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2012, 05:40
Помогаю со студенческими работами здесь

Соединение COM портов. Подключения создаются, но сервер и клиент друг друга не видят
имеется класс с методами подключения: using System; using System.Text; using System.Runtime.InteropServices; using...

Клиент и сервер не видят друг друга, прямого подключения по ip адресу не имеется в Warcraft3FT
Имеется крупная локальная сеть (без доступа к интернету) , с большим количеством виланов. На ПК создаётся сервер (Warcraft3FT) ip...

Не видят друг друга
Здравствуйте. Имеем: 1. комп 1 - виндовс 10; 2. комп 2 - виндовс 10; 3. провод ethernet. Что не так: Один конец в один...

2 компа по wi-fi не видят друг друга
В кабинете 3 компа, два из них по wi-fi (адаптреры D-Link DWA525), один по lan соеденены к роутеру D-Link DIR-615. На всех 3 инет есть. Но...

Компы не видят друг друга
Здравствуйте. Имею два компьютера, один под управлением Windows Server 2016, второй под Windows 11, и появилась необходимость их связать...


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

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