Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Подключение к удаленному рабочему столу по параметрам из базы

Друзья хэлп!
Ситуация такая, в базе данных в таблице хрянятся параметры подключения к удаленному рабочему столу, эти параметры через ADOQuery выводятся в DBGrid. Нужно сделать так чтобы при выделении конкретной строки и нажатии на кнопку CONNECT устанавливалось соединение с удаленным компьютером, используя стандартные средства винды, ну тоесть через mstsc.exe
Мне не надо каких то супер пупер решений, просто вызывать mstsc.exe и передавать туда параметры подключения.
Нужен именно такой вариант, так требует начальство... Подскажите пожалуйста как это можно реализовать?
Ответ: Вот что нашел по rdp:

Mstsc
Создание подключений к серверам терминалов или другим удаленным компьютерам, редактирование существующего файла конфигурации подключения к удаленному рабочему столу (.rdp) и перенос подключений Wndows XP (подключения, созданные с помощью диспетчера клиентских подключений) в новые файлы .rdp

Синтаксис

mstsc.exe {файл_подключения|/v:сервер} [/console] [/f] [/w:ширина /h:высота]

mstsc.exe /edit"файл_подключения"

mstsc.exe /migrate

Параметры

файл_подключения
Задает имя файла .rdp для подключения.
/v:сервер
Задает имя удаленного компьютера, к которому необходимо подключиться.
/console
Подключается к сеансу консоли указанного компьютера под управлением Windows 2000 Server.
/f
Запускает подключение удаленного рабочего стола в полноэкранном режиме.
/w:ширина /h:высота
Указывает размеры экрана удаленного рабочего стола.
/edit
Открывает указанный файл .rdp для редактирования.
/migrate
Переносит устаревшие файлы подключений, созданные диспетчером клиентских подключений, в новые файлы .rdp.

Примечания
Для создания подключения к удаленной консоли необходимо быть администратором на сервере, к которому происходит подключение.
Для каждого пользователя файлы .rdp хранятся в папке «Мои документы» как скрытые.
Т.е. по сути, нужно создавать файл .rdp и подсовывать его в параметры. Но логин и пароль в этом файле не хранится.
Вопрос: Подключение SQL Server без Web.config

ASP MVC Подключения SQL Server без Web.config несколько вариантов
Дело пойдет о подключении базы
Я делал подключение Web.config все работает
но теперь лучше сделать класс что подключет базу
строкой , или значениями класса по атрибутам DataSourse,Host,Password и так далее
ведь когда тестил , все правильно написал
то когда дело дошло к выводу данных с таблице
я получил ошибку типа
Login ......... Password и так далее
И конечно же и вывод ошибки, в случаи провала подключения

Надеюсь кто то поможет поправить это дело

Настраиваем Microsoft SQL Server 2014
1) Заходим под Именем сервера у меня это такое
Server Name: SITY_PC

Жмем свойства Server Properties -> потом Security
выставляем SQL Server and Windows Authentication mode
это нужно, входа в созданную базу, под Логином и Паролем
Перезагружаем сервер Microsoft SQL Server 2014 нажав SITY_PC правой кнопкой мыши , Restart - соглашаемся на все OK
Сервер перезагружаеться приняв новые настройки

2) Заходим в Logins->NT AUTHORITY\система
жмем правой кнопкой мыши по NT AUTHORITY\система , выбираем Properties
там выбираем Server Roles, ставим птичку напротив sysadmin

3) Для удобства добавляем нумерацию строк скриптинга Microsoft SQL Server 2014
Tools->Options->Text Editor->All Languages
напротив Lines numbers поставим галочку
таким образом когда когда будете писать скрипт T-SQL
будут нумеровать строки , и в случаи ошибки будет определена строка ошибки
и вы легко можете пролистав номера строк найти строку ошибки, и править скрипт
4) Готово


Теперь о Главном
Создадим базу с готовой таблицей
1) Вот скрипт

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE DATABASE [Economics]
 
USE [Economics]
GO
 
/****** Object:  Table [dbo].[TABLE_ECONOMIC]    Script Date: 05.09.2016 11:33:10 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[TABLE_ECONOMIC](
    [ID_ECONOMIC] [int] IDENTITY(1,1) NOT NULL,
    [TEXT] [nvarchar](3600) NOT NULL,
    [COST] [money] NOT NULL,
 CONSTRAINT [PK_TABLE_ECONOMIC] PRIMARY KEY CLUSTERED 
(
    [ID_ECONOMIC] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
2) Создаем проект SQL_Server_Connect_Test_All зарание подключаем Entity Framework 5.0
Создадим Контроллер Controllers/HomeController.cs
стандарт ничего не меняем
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace SQL_Server_Connect_Test_All.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
 
        public ActionResult Index()
        {
            return View();
        }
 
    }
}
3) Создадим класс таблицы Tables/TABLE_ECONOMIC.cs
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
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
 
namespace SQL_Server_Connect_Test_All.Tables
{
    [Table("TABLE_ECONOMIC")]
    public class TABLE_ECONOMIC
    {
        [Key]
        public int ID_ECONOMIC { get; set; }
 
        [Required]
        [Display(Name = "Текст Економики")]
        public string TEXT { get; set; }
 
        [Required]
        [Display(Name = "Стоймость")]
        public double COST { get; set; }
    }
}


4) Нажав ActionResult Index() создаем представление Add View...
Тут и воротим вывод данных

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@using SQL_Server_Connect_Test_All.Models
@using SQL_Server_Connect_Test_All.Tables
@{
    ViewBag.Title = "Index";
    ManadgerDB manadgerDb=new ManadgerDB();
}
 
<h2>Index</h2><br/>
<h3>Данные Базы</h3><br/><br/>
@{
    foreach (TABLE_ECONOMIC obj in manadgerDb.GET_OBJECTS())
    {
         <p>1) @obj.TEXT = @obj.COST $</p>
    }
}
5) Создаем класс что будет выступать как подключения, и вывод данных с базы
Класс перчик все в одном))
Models/ManadgerDB.cs
Это один вариант

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
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using SQL_Server_Connect_Test_All.Tables;
 
namespace SQL_Server_Connect_Test_All.Models
{
    interface IRepository_Manadger<T> : IDisposable
    {
        IEnumerable<TABLE_ECONOMIC> GET_OBJECTS();
        SqlErrorCollection GET_ERROR_SQL();
    }
 
    public class ManadgerDB : IRepository_Manadger<TABLE_ECONOMIC>
    {
        private DB_Context db;
 
        public ManadgerDB()
        {
            string str_connect = @"Data Source=SITY_PC; Initial Catalog=Economics; Integrated Security=true; User ID=PUTIN_IS_KNDR_KOREA; Password=#tyranny";
            this.db = new DB_Context(str_connect);
        }
 
        //Колекция обьектов
        public IEnumerable<TABLE_ECONOMIC> GET_OBJECTS()
        {
            return db.TableEconomics;
        }
 
        //Возвращаем ошибки
        public SqlErrorCollection GET_ERROR_SQL()
        {
            return db.Error_Connect;
        }
 
        public void Dispose()
        {
            db.Dispose();
        }
    }
 
    //Контекст подключения
    public class DB_Context : DbContext
    {
        public SqlErrorCollection Error_Connect { get; set; }
        public DbSet<TABLE_ECONOMIC> TableEconomics { get; set; }
        //Имя подключения к базе
        public DB_Context() : base("Primaryconect")
        {
 
        }
 
        //Подключаем строку
        public DB_Context(string connection_str)
        {
            try
            {
                Database.Connection.ConnectionString = connection_str;
            }
            catch (SqlException ex)
            {
 
                Error_Connect = ex.Errors;
            }
           
        }
    }
}
Результат этого применения Ошибка

System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The 'COST' property on 'TABLE_ECONOMIC' could not be set to a 'Decimal' value. You must set this property to a non-null value of type 'Double'.
Source=System.Data.Entity
StackTrace:
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Users\Sity\Documents\Visual Studio 2010\Projects\SQL_Server_Connect_Test_All\SQL_Server_Connect_Test_All\Views\Home\Index.cshtml:line 11
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
InnerException:


6) Второй вариант Models/ManadgerDB_2.cs
с кодом , достаточно в Index.cshtml поменять класс ManadgerDB_2 manadgerDb=new ManadgerDB_2();
мы запустим и увидем результат

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
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using SQL_Server_Connect_Test_All.Tables;
 
namespace SQL_Server_Connect_Test_All.Models
{
    interface IRepository_Manadger2<T> : IDisposable
    {
        IEnumerable<TABLE_ECONOMIC> GET_OBJECTS();
        SqlErrorCollection GET_ERROR_SQL();
    }
 
    public class ManadgerDB_2 : IRepository_Manadger2<TABLE_ECONOMIC>
    {
        private DB_Context2 db;
 
        public ManadgerDB_2()
        {
            //Подключаем автоматоматически
            this.db = new DB_Context2();
        }
 
        //Колекция обьектов
        public IEnumerable<TABLE_ECONOMIC> GET_OBJECTS()
        {
            return db.TableEconomics;
        }
 
        //Возвращаем ошибки
        public SqlErrorCollection GET_ERROR_SQL()
        {
            return db.Error_Connect;
        }
 
        public void Dispose()
        {
            db.Dispose();
        }
    }
 
    //Контекст подключения
    public class DB_Context2 : DbContext
    {
        SqlConnectionStringBuilder connectStringBuilder = new SqlConnectionStringBuilder();
        SqlConnection conn;
        SqlCommand comm;
 
        public SqlErrorCollection Error_Connect { get; set; }
        public DbSet<TABLE_ECONOMIC> TableEconomics { get; set; }
 
        //Имя подключения к базе, все в одном
        public DB_Context2() : base("Primaryconect2")
        {
            try
            {
                connectStringBuilder.DataSource = "SITY_PC";
                connectStringBuilder.InitialCatalog = "Economics";
                connectStringBuilder.Encrypt = true;
                connectStringBuilder.TrustServerCertificate = true;
                connectStringBuilder.ConnectTimeout = 30;
                connectStringBuilder.AsynchronousProcessing = true;
                connectStringBuilder.MultipleActiveResultSets = true;
                connectStringBuilder.IntegratedSecurity = true;
                connectStringBuilder.UserID = "PUTIN_IS_KNDR_KOREA";
                connectStringBuilder.Password = "#tyranny";
 
                conn = new SqlConnection(connectStringBuilder.ToString());
                //Передаем строку подключения
                Database.Connection.ConnectionString = conn.ConnectionString;
            }
            catch (SqlException ex)
            {
 
                Error_Connect = ex.Errors;
            }
        }
 
    }
}
Результат этого выполнения Ошибка

System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The 'COST' property on 'TABLE_ECONOMIC' could not be set to a 'Decimal' value. You must set this property to a non-null value of type 'Double'.
Source=System.Data.Entity
StackTrace:
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Users\Sity\Documents\Visual Studio 2010\Projects\SQL_Server_Connect_Test_All\SQL_Server_Connect_Test_All\Views\Home\Index.cshtml:line 11
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
InnerException:

Пример прикрепил SQL_Server_Connect_Test_All.rar
Базу тоже Economics.rar уже есть данные

Вот и думай как же правильно , что не так ?
Ответ: Ну вообще то привелегии должны быть , ведь когда привелегий не было , или они были в master базы как стандарт,
то возникали ошибки NT AUTHORITY\система , быть может это было связано с указанием Integrated Security на отключке , не знаю ?
XML
1
Integrated Security = false;
Добавлено через 11 минут
Я шас еще раз подключаю , и пробую интеграцию Sqlite+EntityFramework6
бывают какие то приколы , хотя всеправильно не до чего придраться , это на VS2010
Я сначала использую обычное подключение
ASP MVC -> Base(базовым набором)
уже есть встроеный Entity Framework 5.0

потом аналог
ASP MVC -> Base(базовым набором)
но с использованием консольной установки
Tools->Library Package Manager->Package Manager Console
вбиваем команду
PM> Install-Package EntityFramework
по идее произойдет подмена на новую версию Entity Framework 6

Добавлено через 38 минут
Уже есть не утешительный результат
1) Первый проект что создан на VS2010
ASP MVC Razov - > Base (с базовыми компонентами EF5 версии)
использованием консольной установки
Tools->Library Package Manager->Package Manager Console
после подмены на новую версию Entity Framework 6
PM> Install-Package EntityFramework

Получаем пустоту , данные не вывелись
хотя все правильно проипсано

Добавлено через 47 минут
Теперь Разберемся

1) VS2010 ASP MVC Razov (Base компоненты) -(использование PM> Install-Package EntityFramework)
подмена EF5 на EF6
для того чтоб использовать новую версию EF6 нужно остановить сервер , или перезагрузить проект
после все начнет работать данные будут выводиться

2) VS2010 ASP MVC Razov (Base компоненты) -(использование Install-Package System.Data.SQLite.EF6)
интегрирваный SQLite+EF6
Если вы хотите использовать EF6 , а не SQLite то вам нужно зайти в Web.config
И отключить провайдера SQLite из за которого происходит конфликт
это строка
XML
1
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />

Полностью где она находиться , я ей закоментил отключил

XML
1
2
3
4
<providers>      
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <!--<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />-->
    </providers>
И тогда ошибки не будет , будет выводить данные

В случаи если вы захотите использовать SQLite , а не EF6 то разкоментите эту строку провайдера
и вперед
Вопрос: НТТР. Записать в файл количество подключений

Всем привет, помогите пожалуйста.
Нужно сделать так, чтобы в файл записывалось кол-во находящихся клиентов на сервере (на каждое подключение) на данный момент.
Типо " в сети: 1"
Подключился еще 1 - " в сети:2 "
Код клиента один и тот же на 2 решения(клиента)
Код сервера:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
 
namespace Server
{
public class ServerObject
{
static TcpListener tcpListener; // сервер для прослушивания
List<ClientObject> clients = new List<ClientObject>(); // все подключения
 
protected internal void AddConnection(ClientObject clientObject)
{
clients.Add(clientObject);
}
protected internal void RemoveConnection(string id)
{
// получаем по id закрытое подключение
ClientObject client = clients.FirstOrDefault(c => c.Id == id);
// и удаляем его из списка подключений
if (client != null)
clients.Remove(client);
}
// прослушивание входящих подключений
protected internal void Listen()
{
try
{
tcpListener = new TcpListener(IPAddress.Any, 8888);
tcpListener.Start();
Console.Beep(308, 200);
Console.Beep(372, 200);
Console.Beep(495, 200);
Console.WriteLine("===============");
Console.WriteLine("Сервер запущен. Ожидание подключений...");
Console.WriteLine("===============");
 
while (true)
{
TcpClient tcpClient = tcpListener.AcceptTcpClient();
 
ClientObject clientObject = new ClientObject(tcpClient, this);
Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
Disconnect();
}
}
 
// трансляция сообщения подключенным клиентам
protected internal void BroadcastMessage(string message, string id)
{
byte[] data = Encoding.Unicode.GetBytes(message);
for (int i = 0; i < clients.Count; i++)
{
if (clients[i].Id != id) // если id клиента не равно id отправляющего
{
clients[i].Stream.Write(data, 0, data.Length); //передача данных
}
}
}
// отключение всех клиентов
protected internal void Disconnect()
{
tcpListener.Stop(); //остановка сервера
 
for (int i = 0; i < clients.Count; i++)
{
clients[i].Close(); //отключение клиента
}
Environment.Exit(0); //завершение процесса
}
}
 
public class ClientObject
{
protected internal string Id { get; private set; }
protected internal NetworkStream Stream { get; private set; }
string userName;
TcpClient client;
ServerObject server; // объект сервера
 
public ClientObject(TcpClient tcpClient, ServerObject serverObject)
{
Id = Guid.NewGuid().ToString();
client = tcpClient;
server = serverObject;
serverObject.AddConnection(this);
}
 
public void Process()
{
try
{
Stream = client.GetStream();
// получаем имя пользователя
string message = GetMessage();
userName = message;
message = "║ " + userName + " вошел в чат" + " ║";
var line = "╔" + new string('═', message.Length - 2) + "╗";
var line2 = "╚" + new string('═', message.Length - 2) + "╝";
// посылаем сообщение о входе в чат всем подключенным пользователям
server.BroadcastMessage(message, this.Id);
Console.Beep(308, 250);
Console.WriteLine("===============");
Console.WriteLine(line);
Console.WriteLine(message);
Console.WriteLine(line2);
Console.WriteLine("===============");
// в бесконечном цикле получаем сообщения от клиента
while (true)
{
try
{
message = GetMessage();
message = message.ToString();
string UserName = "║ " + userName.ToString() + " ║";
 
line = "╔" + new string('═', UserName.Length - 2) + "╗";
line2 = "╚" + new string('═', UserName.Length - 2) + "╝";
 
Console.Beep(460, 250);
Console.WriteLine(line);
Console.WriteLine(UserName + " " + message);
Console.WriteLine(line2);
server.BroadcastMessage(message, this.Id);
}
catch
{
Console.Beep(290, 250);
Console.WriteLine("===============");
message = "║ " + String.Format("{0} покинул чат", userName) + " ║";
line = "╔" + new string('═', message.Length - 2) + "╗";
line2 = "╚" + new string('═', message.Length - 2) + "╝";
Console.WriteLine(line);
Console.WriteLine(message);
Console.WriteLine(line2);
Console.WriteLine("===============");
server.BroadcastMessage(message,
system is for sale at Squadhelp.com!
system is for sale at Squadhelp.com!
www.squadhelp.com
 
this.Id);
break;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadKey();
}
finally
{
// в случае выхода из цикла закрываем ресурсы
server.RemoveConnection(this.Id);
Close();
}
}
 
// чтение входящего сообщения и преобразование в строку
private string GetMessage()
{
byte[] data = new byte[64]; // буфер для получаемых данных
StringBuilder builder = new StringBuilder();
int bytes = 0;
do
{
bytes = Stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (Stream.DataAvailable);
 
return builder.ToString();
}
 
// закрытие подключения
protected internal void Close()
{
if (Stream != null)
Stream.Close();
if (client != null)
client.Close();
}
}
 
class Program
{
static ServerObject server; // сервер
static Thread listenThread; // потока для прослушивания
static void Main(string[] args)
{
Console.Title = "Сервер";
try
{
server = new ServerObject();
listenThread = new Thread(new ThreadStart(server.Listen));
listenThread.Start(); //старт потока
}
catch (Exception ex)
{
server.Disconnect();
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
}
 
}
Client
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
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
 
using System.Diagnostics;
 
namespace Client
{
class Program
{
static string userName;
private const string host = "127.0.0.1";
private const int port = 8888;
static TcpClient client;
static NetworkStream stream;
 
static void Main(string[] args)
{
Console.Title = "Клиент";
Console.Write("Введите свое имя: ");
userName = Console.ReadLine();
Console.WriteLine("==========");
client = new TcpClient();
try
{
client.Connect(host, port); //подключение клиента
stream = client.GetStream(); // получаем поток
 
string message = userName;
byte[] data = Encoding.Unicode.GetBytes(message);
stream.Write(data, 0, data.Length);
 
// запускаем новый поток для получения данных
Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
receiveThread.Start(); //старт потока
string Greeting = "║ Добро пожаловать: " + userName.ToString() + " ║";
var line = "╔" + new string('═', Greeting.Length - 2) + "╗";
var line2 = "╚" + new string('═', Greeting.Length - 2) + "╝";
Console.WriteLine(line);
Console.WriteLine(Greeting);
Console.WriteLine(line2);
SendMessage();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
finally
{
Disconnect();
}
}
// отправка сообщений
static void SendMessage()
{
Console.WriteLine("==========");
Console.WriteLine("Введите сообщение: ");
 
while (true)
{
string message = Console.ReadLine();
Console.WriteLine("==========");
byte[] data = Encoding.Unicode.GetBytes(message);
stream.Write(data, 0, data.Length);
}
}
// получение сообщений
static void ReceiveMessage()
{
while (true)
{
try
{
byte[] data = new byte[64]; // буфер для получаемых данных
StringBuilder builder = new StringBuilder();
int bytes = 0;
do
{
bytes = stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (stream.DataAvailable);
 
string message = builder.ToString();
Console.Beep(460, 250);
Console.WriteLine("==========");
Console.WriteLine(message);//вывод сообщения
}
catch
{
Console.Beep(250, 200);
Console.Beep(250, 200);
Console.Beep(250, 200);
Console.WriteLine("==========");
Console.WriteLine("Подключение прервано!"); //соединение было прервано
Console.WriteLine("==========");
Console.ReadLine();
Disconnect();
}
}
}
 
static void Disconnect()
{
if (stream != null)
stream.Close();//отключение потока
if (client != null)
client.Close();//отключение клиента
Environment.Exit(0); //завершение процесса
}
}
}
Добавлено через 55 минут
---
Ответ: IamRain, Ни чего не получается, можно еще раз поподробней, что нужно сделать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protected internal void AddConnection(ClientObject clientObject)
        {
            clients.Add(clientObject);
            // создать файл по пути path предварительно
            using var sw = File.AppendText(path);
   sw.WriteLine($"Подключился клиент,  в сети: {clients.Count}");
            
        }
        protected internal void RemoveConnection(string id)
        {
 
            // получаем по id закрытое подключение
            ClientObject client = clients.FirstOrDefault(c => c.Id == id);
            // и удаляем его из списка подключений
            if (client != null)
                clients.Remove(client);
            using var sw = File.AppendText(path);
   sw.WriteLine($"Отключился клиент,  в сети: {clients.Count}");
это начало, правильно понимаю?
Что к чему дальше? Ни когда раньше не делал эти события, поэтому сейчас проблемы большие...
Где их создавать? И что делать дальше
Вопрос: Подключение к Oracle из ASP.NET

Всем привет.
Пишу сайт под ASP.NET, который связан с базой Oracle 11g посредством ODP.NET. Проблема следующая:
Если вход производится с помощью учетной записи админа базы, все работает корректно. Однако на базе присутствует разделение прав, при котором рядовые пользователя не имеют доступа к таблицам. В связи с чем происходик краш приложения при запросах. В базе присутствуют схемы, благодаря которым обычный пользователь может получить доступ к запрашиваемуму им элементу. При настройке соединения через графическую оболочку Visual Studio, можно выбрать схему, которую данное подключение будет использовать.
Добавил схему "TK".

В таком варианте все работает, но мне необходимо создавать подключение из кода, дабы использовать фильтры, введенные пользователем, и в соответствии с ними выводить результаты из базы.
В связи с чем вопросы:
1. При создании подключения через графическую оболочку, где сохраняются настройки подключения? В свойствах созданного элемента DataSource никакого упоминания о схемах в строке подключения нет (хотел посмотреть строку оттуда и ручками забить в код).
2. Пытался использовать "alter session set current_schema=%schema_name%", не помогает, ошибка "не найдена таблица или представление" все равно крашит приложение. Код приведу ниже. Что я делаю не так? В каком месте должен находиться данный запрос?
3. Если я категорически не на верном пути, поставьте на верную дорогу

Так выглядит аутентификация
C#
1
2
3
4
5
6
 var constring = "DATA SOURCE=ndios;PASSWORD=" + Password.Text + ";USER ID=" + Email.Text; //Строка подключения;
                var oracleConnection = new OracleConnection(constring); 
                oracleConnection.Open();
 
                Application["Connection"] = oracleConnection; //Добавили подключение oracleConnection в Application, для дальнейшего вызова;
                FormsAuthentication.RedirectFromLoginPage(Email.Text, false); //После аутентификации отправляем на страницу с которой пришел;
Собственно код в котором возникает косяк:
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
string CommandText = "select ID AS ID, FAM || ' ' || IMQ || ' ' || OTCH || ' ' || TO_CHAR(DR, 'DD-MON-YYYY') AS FIO from TK.PS where (1 = 1)";
               
                if (tbSurname.Text != "")
                {
                    CommandText = CommandText + " AND (FAM = '" + tbSurname.Text + "')";
                }
 
                if (tbName.Text != "")
                {
                    CommandText = CommandText + " AND (IMQ = '" + tbName.Text + "')";
                }
 
                if (tbOtch.Text != "")
                {
                    CommandText = CommandText + " AND (OTCH = '" + tbOtch.Text + "')";
                    
                }
                if (tbDateBirth.Text != "")
                {
                    CommandText = CommandText + " AND (DR = '" + tbDateBirth.Text + "')";
                    
                }
 
                if (tbYearBirth.Text != "")
                {
                    CommandText = CommandText + " AND (GR = '" + tbYearBirth.Text + "')";
 
                }
 
                if (tbInn.Text != "")
                {
                    CommandText = CommandText + " AND (INN = '" + tbInn.Text + "')";
 
                }
 
                CommandText = CommandText + " ORDER BY DR ASC";
                CommandText = CommandText.ToUpper();
         
            using (var connection = (OracleConnection)Application["Connection"])
            using (var command = new OracleCommand("alter session set current_schema = TK", connection))
            {
                command.ExecuteNonQuery();
                using (OracleCommand cmd = new OracleCommand(CommandText, connection))
                using (OracleDataReader reader = cmd.ExecuteReader())
                {
                    dt1.Clear();
                    dt1.Load(reader);
                    GridView1.DataSource = dt1;
                    GridView1.DataBind();
                    GridView1.Columns[0].Visible = false;
                }
Блок с "alter session set surrent_schema=***" использовал куда только мог воткнуть, везде краш один - не найдена таблица или представление.
Заранее благодарю всех за помощь.
Ответ:
Сообщение от DalasDV
Про sql инъекции пока не задумываюсь, это первичный вариант, который будет допиливаться
Лучше бы сразу учиться делать правильно.

Вот это:
C#
1
var constring = "DATA SOURCE=ndios;PASSWORD=" + Password.Text + ";USER ID=" + Email.Text;
... не аутентификация, а ужас. У веб-приложения должен быть свой аккаунт для доступа к БД. А пользователи должны быть в эту БД занесены и аутентифицироваться самим приложением. Никто так не делает, короче.

Сохрани строку подключения в конфигурационный файл.

Вот это:
C#
1
Application["Connection"] = oracleConnection;
... тоже дичь малая (как уже выше заметили). Создавай подключение там, где оно нужно. И после использования закрывай. Если надо, создай пул подключений.

А вот это:
Кликните здесь для просмотра всего текста

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
string CommandText = "select ID AS ID, FAM || ' ' || IMQ || ' ' || OTCH || ' ' || TO_CHAR(DR, 'DD-MON-YYYY') AS FIO from TK.PS where (1 = 1)";
               
                if (tbSurname.Text != "")
                {
                    CommandText = CommandText + " AND (FAM = '" + tbSurname.Text + "')";
                }
 
                if (tbName.Text != "")
                {
                    CommandText = CommandText + " AND (IMQ = '" + tbName.Text + "')";
                }
 
                if (tbOtch.Text != "")
                {
                    CommandText = CommandText + " AND (OTCH = '" + tbOtch.Text + "')";
                    
                }
                if (tbDateBirth.Text != "")
                {
                    CommandText = CommandText + " AND (DR = '" + tbDateBirth.Text + "')";
                    
                }
 
                if (tbYearBirth.Text != "")
                {
                    CommandText = CommandText + " AND (GR = '" + tbYearBirth.Text + "')";
 
                }

... вообще кошмар. Мало того, что уродливо, громоздко и неэффективно, так ещё и не безопасно. У IDbCommand (OracleCommand) есть специальный набор методов для безопасной передачи параметров. К тому же, запросы переданные с передачей параметров через методы OracleCommand проходят разовую предкомпиляцию и работают быстрее каши приведённой выше.

По поводу вопроса об ошибке: не вижу смысла искать причину, когда весь код - одна сплошная ошибка. Переделай код. Возможно, что ошибка исчезнет. Если нет - милости просим на форум, будем искать вместе.
Вопрос: Посоветуйте безопасное подключение к MySQL

Посоветуйте безопасное подключение к MySQL.
Многие знают, что строки кода из готовой программы.exe можно легко просмотреть.
Моя программа будет публичной и в ней присутствует подключение к MySQL в таком виде:
Кликните здесь для просмотра всего текста
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
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                //подключаеся к БД
                using (var connection = new MySqlConnection("datasource=host;port=3306;username=ИМЯ;password=ПАРОЛЬ"))
                {
                    //создаем запрос к БД
                    var command = new MySqlCommand("select * from h92817_base.spisok_catalog;", connection);
                    //открываем коннект к БД
                    connection.Open();
                    //выполняем запрос
                    using (var reader = command.ExecuteReader())
                        //читаем запсис из таблицы
                        while (reader.Read())
                        {
                            // Заполняем коллекцию comboBox1 данными из базы данных
                            string Name = reader.GetString("Name");
                            comboBox1.Items.Add(Name);
                        }
                    //закрываем коннект к БД
                    connection.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Сайт на php, посоветуйте свои варианты.

P.s.
Кликните здесь для просмотра всего текста
У меня один вариант:
Подключение к файлу www.site.ru/BDconfig.php в котором есть данные подключения к MySQL
Заместо этой строки:
C#
1
2
//подключаеся к БД
using (var connection = new MySqlConnection("datasource=host;port=3306;username=ИМЯ;password=ПАРОЛЬ"))
Минус в том, что зная url файла, пользователь сможет сделать подключение, используя этот url через свою программу.

Или если возможно, то зашифровать файл с подключением и подключить его с заменой строки.
конечно и тут минус, есть такие, что расшифровать файл им не составит труда..
Ответ:
Сообщение от insite2012
Вам нужен Windows-хостинг с поддержкой IIS
Скорее всего у меня простой хост, который я оплатил уже на год, оплачивать второй хост не хочу(((
Спасибо вам конечно огромное, но видимо Ваш вариант мне уже не подойдет, но вариант был супер

Скорее всего временно остановлюсь на этом варианте, только тут для SELECT, но вот INSERT, UPDATE пока не понимаю как сделать
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button1_Click(object sender, EventArgs e)
        {
            string URL = "http://site.ru/SQLquery.php";
            WebClient webClient = new WebClient();
            NameValueCollection formData = new NameValueCollection();
            formData["name"] = textBox1.Text;
            formData["Password"] = textBox2.Text;
            byte[] responseBytes = webClient.UploadValues(URL, "POST", formData);
            string responsefromserver = Encoding.UTF8.GetString(responseBytes);
            Console.WriteLine(responsefromserver);
            if (responsefromserver == "true")
            {
                MessageBox.Show("Ok");
            }
            else
            {
                MessageBox.Show("No");
            }
            webClient.Dispose();
        }
сам SQLquery.php:
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
<?php
mysql_connect($server = "host", $user = "ЛОГИН", $pass = "ПАРОЛЬ", $link = false, $flags = 0);
@mysql_select_db($database = "БАЗА") or die("Unable to select database");
$query = "SELECT * FROM dle_users";
$result = mysql_query($query);
$num = mysql_numrows($result);
 
$i = 0;
 
while ($i < $num)
{
    $usr = mysql_result($result,$i,"name");
    $pw = mysql_result($result,$i,"Password");
    
    $Username = $_POST["name"];
    $Password = $_POST["Password"];
    
    if($usr == $Username)
    {
        if($pw == $Password)
        {
            echo("true");
        }
    }
    $i++;
}
?>


Можно в php записать строку подключения к БД?
Кликните здесь для просмотра всего текста
файл выложить на сервер, http://site.ru/BDconnection.php
C#
1
2
// подключаемся к БД
string connection = "datasource=host;port=3306;username=ИМЯ;password=ПАРОЛЬ";
и подключить в программе?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Подключение к базе данных и получение данных при запуске формы
                string Query = "select * from h92817_base.spisok_catalog";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase);
                MySqlDataReader myReader;
 
                conDataBase.Open();
                myReader = cmdDataBase.ExecuteReader();
                while (myReader.Read())
                {
                    string nameCatalog = myReader.GetString("NameCatalog");
                    comboBox1.Items.Add(nameCatalog);
                }
                conDataBase.Close();


Или все таки лучше весь код получать из php файла?
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// подключаемся к БД
string connection = "datasource=host;port=3306;username=ИМЯ;password=ПАРОЛЬ";
// Подключение к базе данных и получение данных при запуске формы
                string Query = "select * from h92817_base.spisok_catalog";
                MySqlConnection conDataBase = new MySqlConnection(constring);
                MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase);
                MySqlDataReader myReader;
 
                conDataBase.Open();
                myReader = cmdDataBase.ExecuteReader();
                while (myReader.Read())
                {
                    string nameCatalog = myReader.GetString("NameCatalog");
                    comboBox1.Items.Add(nameCatalog);
                }
                conDataBase.Close();
Я понимаю так, таким образом, если узнают строку с ссылкой на файл, изменить и понять что в нем находиться не получиться?
Вопрос: Как ограничить количество подключений к БД AbsoluteDatabase

Привет Всем!
Подскажите пожалуйста, как ограничить количество подключений к БД AbsoluteDatabase? Дело в том, что как при создании базы (в специальной утилите Absolute DBManager, которая устанавливается вместе с компонентом) можно указать максимальное количество подключений, так и в самой Delphi у компонента ABSDataBase есть свойство MaxConnections, где можно указать, как видно из названия, максимальное количество подключений к файлу БД. НО какое бы количество я бы не указал, программа в итоге все равно подключается множество раз. К примеру сказано количество - 3, запускаю 5 экземпляров своего приложения и подключений происходит на Ура. Хоть экземпляров запустить, пробовал даже с другого компьютера по сети подключаться. Все равно дает подключаться даже если количество уже давно превышено. Мало того, есть свойство MultiUser (что означает многопользовательский доступ), которое либо истинно либо ложно. Т.е. при установке этого свойства в false, после чего вообще должно быть не более 1 подключения, программу все равно можно запустить хоть 10 раз и каждый раз подключение происходит.
В чем может быть проблема? И какое есть свойство у компонента, чтобы узнать количество подключений? Перепробовал все, ничего не нашел.
Кто работал с этими компонентами, подскажите пожалуйста, очень очень нужно.
Заранее спасибо.
Ответ: В общем похоже я разобрался. Может кому пригодится на будущее: у компонента ABSDataBase есть функция GetDBFileConnectionsCount, которая возвращает количество подключений. Т.е. блокировку нужно будет делать программно.
Но вроде все работает :-)
Вопрос: Удалённое изменение строки подключения

Добрый день! Хочу задать тривиальный вопрос по строке подключения. Есть сервер, на нём крутится MS SQL Server 2008. Подключен через роутер, на котором сделан проброс портов на этот сервер. Есть приложение, клиентское, которое работает с данной БД. Подключение удалённое к БД. Внимание, вопрос: Если на сервере поменяется IP-адрес или порт подключения, как быстро у несколько сотен клиентов поменять строку подключения? Строка подключения прописана именно в классах, т.е. никаких app или config файлов! Как возможно и безопасно предусмотреть за ранее (Пока приложение на заверающей стадии разработки) изменение строки на клиентах?

Добавлено через 55 минут
И вообще, что можете предложить по этому поводу?

Добавлено через 1 минуту
При чём так, чтобы строка подключения была скрыта от посторонних глаз.
Ответ:
Сообщение от master_fatum
что можете предложить по этому поводу?
Предложить-то можно, вот только станете ли вы это реализовывать...
Сообщение от master_fatum
чтобы строка подключения была скрыта от посторонних глаз.
Да по сути, клиенты могут и вообще не иметь никакой информации. Если сделать серверное приложение на WCF (чтобы оно работало постоянно, а не с размещением в IIS/WAS), то можно в нем предусмотреть такую штуку, как WCF Discovery. Подключение к БД будет работать не напрямую, а именно через методы службы. Ну а что касается Discovery - это для того, чтобы все клиенты могли сами обнаруживать службу в сети, определять, соответствует ли она их критериям и получать ее адрес. В такой реализации у клиентов не то что строки к БД не будет, они и адреса службы до запуска знать не будут.
Вопрос: Подключение к домену через socks5

Здравствуйте.
Помогите пожалуйста с подключением к .onion серверу.

Есть стандартный код socks5:

Код:
socks5_r_TPC:record 
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion');
socks5_r_TPC.port:=htons(80);
Подключение идет к ip адрессу: socks5_r_TPC.atyp:=1;
Заменяю на socks5_r_TPC.atyp:=3;
Теперь подключение должно идти к домену. В данном случае к торовскому серверу.
Но как создать само подключение.
Подключение к ip адрессу происходит следущим образом: socks5_r_TPC.ip := inet_addr('56.63.741.23');
Но как подключится к торовскому домену?

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); - данный вариант не срабатывает.


Заранее благодарю за помощь.
Ответ: Вы все верно описали.
Просто возникло недопонимание.
Как раз проблема подключения и заключается в inet_addr().
Ее нужно заменить на что то другое, что бы шло подключение не к ip адрессу а к домену onion,
который ip адресса не имеет.
Понятно что преобразование вида: pinteger(gethostbyname('rt56jg78jgh su.onion').h_addr^)^;
то же работать не будет.

Нужно именно заменить: socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); на что то другое.

Ниже привожу полный код:

Код:
var
 sock:LongWord;
 block:u_long;
 SockAddrIn:TSockAddrIn;
 timeout:ttimeval;
 fds:TFDSet;
 rc,curr,len:integer;
 ws:TWSAData;
 send_buf, result:string;
 buf:array[0..4095] of char;
 strtarget : string;

 socks5_r:record // ??????
   ver:byte;
   nmet:byte;
   met:byte;
   end;

  socks5_r_TPC:record // ???? ????????????
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 //???????????

 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 WsaStartup($202,ws);
 //?????? ??????????
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr(string('rt56jg78jghsu.onion'));

 socks5_r_TPC.port:=htons(2365);

 block:=1;
 sock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if sock=LongWord(-1) then exit;
 SockAddrIn.sin_family := AF_INET;
 SockAddrIn.sin_port := htons(9050);
 SockAddrIn.sin_addr.s_addr := inet_addr(Pansichar('127.0.0.1'));

 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ? ????????????? ?????
 if connect(sock, SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then // ???????? ????????????
  begin
   if WSAGetLastError=WSAEWOULDBLOCK then // ????????? ??? ????? ??????? ? ????????????? ?????
     begin
      FD_ZERO(fds);
      FD_SET(sock,fds);
      timeout.tv_sec:=strtoint('1000');//(form2.Edit1.Text); // ??? ???????
      timeout.tv_usec:=0;
      rc:=select(0, nil, @fds, nil, @timeout); // ???????
     end;
   end;
 block:=0;
 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ??????? ? ??????????? ?????
if rc=0 then
 begin
   // ???????? ???????

   showmessage('showresultbad');
 end
else
 begin
   // ?????? ???????????
  // ?????? ??? http
   send_buf:='GET http://'+'mail.ru'+'/ HTTP/1.1'#13#10+
              'Host: '+'domen.ru'+#13#10+
              'Accept: */*'+#13#10+
              'Proxy-Connection: Keep-Alive'+#13#10+
              'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.7 (build 01670); Crazy Browser 1.0.5; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'#13#10#13#10;


    send(sock,socks5_r, 3,0); // ???? ??????
          len := recv(sock, socks5_r, 2, 0); // ??????? ??????

          if len > 0 then // ???? ???? ?????
          begin
            //??????? ?????????
            if (socks5_r.ver=5) and(socks5_r.met=0) then //?????
              begin

                send(sock, socks5_r_TPC, 10,0); // ?????? ?? ?????????? ? http ??????
                len := recv(sock,  socks5_r_TPC, 10, 0); // ??????? ??????
                if len > 0 then
                  if socks5_r_TPC.cmd=0 then //?????
                    begin

                         send(sock, send_buf[1], length(send_buf),0); // ???? ??????? http ????? ????? ??????
                             len := recv(sock,  buf, 4096, 0); // ?????? ?????
                             if len > 0 then
                              begin
                                result := copy(buf, 0, len);
                                if pos('200 OK', result)<>0 then result:='GOOD';
                              end;
                    end;

              end;

          end;
     if result='GOOD' then showmessage('showresultgood'); //synchronize(showresultgood);

 end;
  closesocket(sock);
  //synchronize(dec_count);

 end;
Благодарю за ответ.
Вопрос: Подключение к домену через socks5

Здравствуйте.
Помогите пожалуйста с подключением к .onion серверу.

Есть стандартный код socks5:

Код:
socks5_r_TPC:record 
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion');
socks5_r_TPC.port:=htons(80);
Подключение идет к ip адрессу: socks5_r_TPC.atyp:=1;
Заменяю на socks5_r_TPC.atyp:=3;
Теперь подключение должно идти к домену. В данном случае к торовскому серверу.
Но как создать само подключение.
Подключение к ip адрессу происходит следущим образом: socks5_r_TPC.ip := inet_addr('56.63.741.23');
Но как подключится к торовскому домену?

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); - данный вариант не срабатывает.


Заранее благодарю за помощь.
Ответ: Вы все верно описали.
Просто возникло недопонимание.
Как раз проблема подключения и заключается в inet_addr().
Ее нужно заменить на что то другое, что бы шло подключение не к ip адрессу а к домену onion,
который ip адресса не имеет.
Понятно что преобразование вида: pinteger(gethostbyname('rt56jg78jgh su.onion').h_addr^)^;
то же работать не будет.

Нужно именно заменить: socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); на что то другое.

Ниже привожу полный код:

Код:
var
 sock:LongWord;
 block:u_long;
 SockAddrIn:TSockAddrIn;
 timeout:ttimeval;
 fds:TFDSet;
 rc,curr,len:integer;
 ws:TWSAData;
 send_buf, result:string;
 buf:array[0..4095] of char;
 strtarget : string;

 socks5_r:record // ??????
   ver:byte;
   nmet:byte;
   met:byte;
   end;

  socks5_r_TPC:record // ???? ????????????
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 //???????????

 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 WsaStartup($202,ws);
 //?????? ??????????
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr(string('rt56jg78jghsu.onion'));

 socks5_r_TPC.port:=htons(2365);

 block:=1;
 sock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if sock=LongWord(-1) then exit;
 SockAddrIn.sin_family := AF_INET;
 SockAddrIn.sin_port := htons(9050);
 SockAddrIn.sin_addr.s_addr := inet_addr(Pansichar('127.0.0.1'));

 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ? ????????????? ?????
 if connect(sock, SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then // ???????? ????????????
  begin
   if WSAGetLastError=WSAEWOULDBLOCK then // ????????? ??? ????? ??????? ? ????????????? ?????
     begin
      FD_ZERO(fds);
      FD_SET(sock,fds);
      timeout.tv_sec:=strtoint('1000');//(form2.Edit1.Text); // ??? ???????
      timeout.tv_usec:=0;
      rc:=select(0, nil, @fds, nil, @timeout); // ???????
     end;
   end;
 block:=0;
 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ??????? ? ??????????? ?????
if rc=0 then
 begin
   // ???????? ???????

   showmessage('showresultbad');
 end
else
 begin
   // ?????? ???????????
  // ?????? ??? http
   send_buf:='GET http://'+'mail.ru'+'/ HTTP/1.1'#13#10+
              'Host: '+'domen.ru'+#13#10+
              'Accept: */*'+#13#10+
              'Proxy-Connection: Keep-Alive'+#13#10+
              'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.7 (build 01670); Crazy Browser 1.0.5; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'#13#10#13#10;


    send(sock,socks5_r, 3,0); // ???? ??????
          len := recv(sock, socks5_r, 2, 0); // ??????? ??????

          if len > 0 then // ???? ???? ?????
          begin
            //??????? ?????????
            if (socks5_r.ver=5) and(socks5_r.met=0) then //?????
              begin

                send(sock, socks5_r_TPC, 10,0); // ?????? ?? ?????????? ? http ??????
                len := recv(sock,  socks5_r_TPC, 10, 0); // ??????? ??????
                if len > 0 then
                  if socks5_r_TPC.cmd=0 then //?????
                    begin

                         send(sock, send_buf[1], length(send_buf),0); // ???? ??????? http ????? ????? ??????
                             len := recv(sock,  buf, 4096, 0); // ?????? ?????
                             if len > 0 then
                              begin
                                result := copy(buf, 0, len);
                                if pos('200 OK', result)<>0 then result:='GOOD';
                              end;
                    end;

              end;

          end;
     if result='GOOD' then showmessage('showresultgood'); //synchronize(showresultgood);

 end;
  closesocket(sock);
  //synchronize(dec_count);

 end;
Благодарю за ответ.
Вопрос: Подключение базы данных в отчете FastReport через Builder

Заранее прошу извинения, поскольку в FastReport еще не специалист. Но довольно-таки сложный отчет сделала. А вот на программном подключении отчета через Builder споткнулась. Хотя прошерстила все справки по FR: там почему-то все одно и то же и очень сжато.
Во-первых, не смогла понять, подключение делается через переменную или в самом коде отчета?
Пыталась просто в коде FR явно прописать путь к БД, чтобы понять принцип подключения.

    uses frxIBXComponents
    var IBX_BD: TfrxIBXDatabase;
     
    procedure FR_CatOnStartReport(Sender: TfrxComponent);
    begin
    IBX_BD.DatabaseName := 'D:\BUILDER\BD.GDB';
    IBX_BD.Connected :=true;                                        
    end;


Не компелируется. Внизу сообщение "Identifier expected" и курсор стоит на строке uses.
Отключаю эту строку, пишет, что не определен компонент IBX_BD. Но я же его объявляю?
Если через переменную в FR, то как ее связать со строкой подключения?
В общем, пока у меня "темный лес".
Естественно, БД подключила в самом компоненте отчета TfrxIBXDatabase IBX_BD. Но на другом компьютере путь нужно менять. Не красиво как-то это...
Помогите, пожалуйста! Уже несколько дней сижу безрезультатно.
Ответ:
А можно и так - я все-таки права была насчет FindObject! :)
Мой очень умный друг и программист написал код на Делфи. Я лишь перевела на язык Си. Может этот код еще кому-нибудь понадобится...

    SetRptConnectionString(FR, “IBX_CON”, IBCONNECT->DatabaseName);
           FR->ShowReport();
     
    .cpp
    //-------------------------
    Void SetRptConnectionString(TfrxReport *rpt, AnsiString DBName, AnsiString ConnStr) //функция динамического подключения к БД
    {
          TfrxIBXDatabase *db = dynamic_cast < TfrxIBXDatabase *> (prt->FindObject(DBName));
             If (db != NULL)
           {
             If(db->Connected == true) db->Connected = false;
             db->DatabaseName = ConnStr;
           }
    }
    //------------------------
    .h
    public:  //User declarations
        SetRptConnectionString(TfrxReport *rpt, AnsiString DBName, AnsiString ConnStr);


Может вылезти такая ошибка:
    Unresolved external ‘TForm1:: SetRptConnectionString(Frxclass::FrxReport*, System AnsiString’ referenced from ‘D\Form1.obj’


Нужно просто правильно объявить функцию (найти место) SetRptConnectionString.
FR- отчет FastReport;
IBX_CON - название компонента TfrxIBXDatabase в отчете;
IBCONNECT - название компонента TIBDatabase в программе Builder
Большое спасибо, что пытались помочь. Мысли потекли в правильном направлении.
Через ini, конечно, можно. Но все равно нужен был для подключения этот код.
Сообщение отредактировано: laifik -