Интерфейс сервера и основные функции

advertisement
1
Local System Monitor
“Мониторинг работы учащихся
в локальной сети”
Среда программирования: Microsoft Visual Basic 6
Выполнил: Левин Иван, ГБОУ лицей 1550, 11 класс
Руководители: Воробьева В.В., Дружерукова Л.В.
Москва 2013
2
Оглавление
Описание ........................................................................................................................................3
Интерфейс сервера и основные функции ....................................................................................4
1. Информация ........................................................................................................................4
2. Процессы .............................................................................................................................5
3. Питание................................................................................................................................6
4. Монитор...............................................................................................................................6
5. Сообщение...........................................................................................................................7
6. Удаленный доступ ..............................................................................................................7
7. Режим отладки ....................................................................................................................8
Интерфейс клиента и основные функции ...................................................................................9
1. Основная форма ..................................................................................................................9
2. Форма сообщения .............................................................................................................10
Пример исходного кода программы клиента ...........................................................................11
1. Используемые функции и модули. Декларации. ...........................................................11
2. Запуск программы ............................................................................................................13
3. Отправка и прием данных ...............................................................................................14
4. Питание..............................................................................................................................14
5. Монитор.............................................................................................................................15
6. Сообщение.........................................................................................................................17
7. Видео..................................................................................................................................18
Пример исходного кода программы сервера ............................................................................20
1. Используемые функции и модули. Декларации. ...........................................................20
2. Запуск программы ............................................................................................................20
3. Отправка и прием данных ...............................................................................................21
4. Лог ......................................................................................................................................22
5. Видео..................................................................................................................................22
3
Описание
Данный проект содержит 2 программы: сервер и клиент. Они
предназначены для мониторинга и управления другими компьютерами в
локальной сети или сети Интернет. В первую очередь проект полезен в
школах, в кабинетах информатики, где ученики взаимодействуют с
компьютером и могут не следовать указаниям учителя.
Для начала работы необходимо установить программу-клиент LSM
Client на компьютер ученика и сервер LSM Server на компьютер учителя.
Узнать IP адрес компьютера учителя (это можно сделать, открыв в сервере
лог) и вписать его в текстовый файл prop.txt. Запустить программу-клиент.
Она автоматически добавит себя в автозагрузку, и теперь не будет нуждаться
в повторном запуске. Для работы программ необходимы библиотеки,
которые содержатся в папке с дистрибутивом. Их следует оставить в одном
каталоге с исполняемым файлом. Примечательная функция клиента
заключается в том, что, после отправки команды сервером, он становится
полностью автономным и может выполнять поставленную задачу без
подключения.
4
Интерфейс сервера и основные функции
При подключении
клиентов, их данные
добавляются в список. На
данный момент доступно
максимально 50
подключений
одновременно, однако
количество подключений в
скором времени будет
изменяемым.
1. Информация
Данная
форма
предоставляет
основную
информацию о клиенте:

имя компьютера

имя пользователя

IP-адрес в локальной
сети

специальное имя,
присвоенное каждому
компьютера в отдельности.
5
2. Процессы
При нажатии на кнопку «Процессы» открывается форма с процессами
клиента и автоматически обновляется список запущенных программ. Здесь
можно завершить выделенный процесс и выполнить новую задачу
аналогично диспетчеру задач Windows.
6
3. Питание
Данная функция
позволяет управлять
питанием устройствами
учеников: выключать,
перезагружать,
отправлять в
гибернацию, и выходить
из системы. Время
выключения можно
изменять. Кнопка
открытия
формы одновременно
является строкой
состояния.
4. Монитор
При необходимости остановить
работу компьютеров, но не отключать
их, можно воспользоваться функцией
выключения и включения монитора.
Для этого нужно установить время,
через которое монитор выключится, и
время, через которое он снова
включится.
7
5. Сообщение
При
сообщить
желании
что-то
клиенту
(если,
например, учитель видит, что
ученик занимается не тем, чем
надо)
можно
сообщение.
6. Удаленный доступ
отправить
8
На данный момент является основной функцией.
Для видео открывается отдельное окно, где можно выбрать клиента и тип
видео (экран или веб-камера).
При нажатии на кнопку «Старт» начинается видеотрансляция с выбранного
экрана.
Программа позволяет сохранять фрагменты видео в изображения в
формате .jpg. Стоит нажать кнопку «Сохранить список», как сразу создается
папка “ScreenShots”, и в неё добавляются изображения.
Для
активации
удаленного
доступа
необходимо
нажать
на
соответствующую кнопку. Если кнопка вдавлена, то доступ функция
активирована. В данном режиме передаются положения курсора мыши и
клавиш.
7. Режим отладки
Верхние меню позволяет включить режим отладки. В этом режиме
активируется лог – история использования. В логе записываются все
использованные команды, а также отчеты об ошибках.
Все это
записывается в файл
log.txt
Функции «Свернуть в трей», «Настройки»,
«Передача файла», и «Файловая система» находятся в разработке.
9
Интерфейс клиента и основные функции
При запуске программы клиента считывается файл её настройки
prop.txt. Программа автоматически распаковывает необходимые библиотеки
и ActiveX элементы, необходимые для работы, в директорию с исполняемым
файлом.
Ip – массив IP-адресов, к которым может присоединиться клиент.
Mainport – основной порт подключения.
Specname – специальное имя, задается сервером.
Autorun – добавление программы в автозагрузку.
Devices – количество устройств в сети.
1. Основная форма
Данная форма
предназначена
исключительно для
разработки.
В ней можно найти
основную информацию о
происходящем: статус
подключения, время
включения и отключения
компьютера и монитора,
список процессов и скриншот
экрана, который в следствии
будет переслан серверу.
Видимость этого окна определяется свойством hide в файле.
10
2. Форма сообщения
Программа сервера позволяет отправлять сообщения. В свойствах
этой функции можно выбрать размер окна сообщения: «На весь экран» или
не на весь. Первая опция разворачивает окно во весь экран и блокирует
клавиатуру
и
мышь.
Вторая
же
активирует
маленькое
окошко
с
возможностью его закрытия и ответа учителю.
Внизу располагается таймер, показывающий время, через которое
окно закроется автоматически.
Также есть форма ответа серверу, однако эта функция пока находится
в разработке.
11
Пример исходного кода программы клиента
1. Используемые функции и модули. Декларации.
‘WIN API для основных функций программы
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long
Public Declare Function GetDestktopWindow Lib "user32" () As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long,
ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long,
ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As
Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As
Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As
Long, ByVal bRedraw As Boolean) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal
hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy
As Long, ByVal wFlags As Long) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As
Long
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
Public Const TH32CS_SNAPPROCESS As Long = 2&
Public Const MAX_PATH As Integer = 260
Public Type ProcessEntry
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias
"CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "Kernel32" Alias "Process32First" (ByVal hSnapShot
As Long, uProcess As ProcessEntry) As Long
Public Declare Function ProcessNext Lib "Kernel32" Alias "Process32Next" (ByVal hSnapShot
As Long, uProcess As ProcessEntry) As Long
Public Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
12
Public split_tag As String
Public ProcMsg As String
Public MsgFulled As Boolean
‘Разделитель
Public ConnectionIP As String
‘Переменные, считываемые из файла
Public HideProgramm As Boolean
Public SpecialName As String
Public MainPort As Integer
Public VideoPort As Integer
Public AddToAutorun As Boolean
Public Sub addautorun()
‘Функция добавления в автозагрузку
On Error Resume Next
Set Reg = CreateObject("WScript.Shell")
Reg.RegWrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\" & App.EXEName
& ".exe", App.Path & "\" & App.EXEName & ".exe"
Set Reg = Nothing
End Sub
Public Sub GetProcessList()
‘Функция для просмотра процессов
On Error Resume Next
ProcMsg = ""
Mainform.ListOfProcesses.Clear
Dim hSnapShot As Long
Dim uProcess As ProcessEntry
Dim r As Long
hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
If hSnapShot = 0 Then Exit Sub
uProcess.dwSize = Len(uProcess)
r = ProcessFirst(hSnapShot, uProcess)
Do While r
Mainform.txt_proc.Text = uProcess.szExeFile
Proc = Mainform.txt_proc.Text & " / " & uProcess.th32ProcessID ' & " / "
Mainform.ListOfProcesses.AddItem Proc
r = ProcessNext(hSnapShot, uProcess)
ProcMsg = ProcMsg & Proc & split_tag
Loop
Call CloseHandle(hSnapShot)
Mainform.wsk_send "processes" & split_tag & ProcMsg
End Sub
Public Function ReadMainFile()
‘Функция считывания из файла
On Error Resume Next
Dim InLine As String
Dim LA() As String
Open App.Path & "\prop.txt" For Input As #1
While EOF(1) = False
DoEvents
Line Input #1, InLine
LA = Split(InLine, "=")
13
Select Case LA(0)
Case "ip"
ConnectionIP = LA(1)
Case "hide"
HideProgramm = LA(1)
Case "mainport"
MainPort = LA(1)
Case "videoport"
VideoPort = LA(1)
Case "specname"
SpecialName = LA(1)
Case "autorun"
AddToAutorun = LA(1)
End Select
Wend
Close #1
End Function
2. Запуск программы
Private Sub Form_Load()
split_tag = " -('V')- "
ReadMainFile
If AddToAutorun = True Then addautorun
If App.PrevInstance = True Then End
If HideProgramm = True Then Me.Hide
wsk.RemoteHost = ConnectionIP
wsk.RemotePort = MainPort
wsk_video.LocalPort = VideoPort
wsk_video.Listen
tmr_connect.Enabled = True
‘Разделитель
‘Считывание из файла
‘Добавление в автозагрузку
‘Завершает приложение, если уже запущено
‘Winsock – ActiveX для соединения по сети
‘Таймер присоединения
ComputerName = Environ("computername")
UserName = Environ("username")
InfoAboutComputer = "info" & split_tag & ComputerName & split_tag & UserName &
split_tag & SpecialName
pic.Width = Screen.Width
‘PictureBox для скриншота
pic.Height = Screen.Height
pic.AutoRedraw = 1
End Sub
Private Sub tmr_connect_Timer()
‘Таймер присоединения
If wsk.State <> 6 And wsk.State <> 7 Then
wsk.Close
wsk.Connect
tmr_senddata.Enabled = True
‘Таймер отправки данных
Text1.Text = Val(Text1.Text) + 1
'для проверки таймера
14
End If
If wsk_video.State <> 6 And wsk_video.State <> 7 Then
wsk_video.Close
wsk_video.Listen
End If
End Sub
Private Sub tmr_senddata_Timer()
If wsk.State = 7 Then
wsk_send InfoAboutComputer
txt_senddata = InfoAboutComputer
tmr_senddata.Enabled = False
End If
End Sub
‘Таймер отправки данных
3. Отправка и прием данных
Public Function wskV_send(wsk_message As String)
On Error GoTo err2
wsk_video.SendData wsk_message
txt_senddata.Text = wsk_message
Exit Function
err2:
txt_senddata.Text = "Error(" & Err.Number & ") sending: " & wsk_message
Resume Next
End Function
Private Sub wsk_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim data() As String
Dim IncomeData As String
wsk.GetData IncomeData
txt_senddata.Text = IncomeData
data = Split(IncomeData, split_tag)
If data(0) = "shell" Then Shell data(1), vbHide: GetProcessList_Click
If data(0) = "needproc" Then Call GetProcessList
If data(0) = "power" Then Call power(data(1), data(2), data(3))
If data(0) = "monitor" Then Call monitor(data(1), data(2), data(3))
If data(0) = "msg" Then Call message(data(1), data(2), data(4), data(5), data(3))
End Sub
4. Питание
Private Sub power(action As String, time As String, time_for As String)
If action = "cancel" Then
tmr_power.Enabled = False
Shell ("shutdown -a")
wsk_send "power_state" & split_tag & "Питание"
Else
time_remaining = Val(time)
time_for = Val(time_for)
15
Wpower.time_remaining = time_remaining
Wpower.time_for = time_for
Wpower.action = action
If Wpower.action = "shutdown" Then Wpower.action_title = "Выключение"
If Wpower.action = "reboot" Then Wpower.action_title = "Перезагрузка"
If Wpower.action = "sleep" Then Wpower.action_title = "Сон"
If Wpower.action = "hibernate" Then Wpower.action_title = "Гибернация"
If Wpower.action = "block" Then Wpower.action_title = "Блокировать"
If Wpower.action = "changeuser" Then Wpower.action_title = "Смена пользователя"
If Wpower.action = "logout" Then Wpower.action_title = "Выход из системы"
tmr_power.Enabled = True
‘Таймер времени отключения
If Wpower.action = "cancel" Then Wpower.action_title = "Питание": Shell ("shutdown -a"):
txt_power.Text = Wpower.action_title: tmr_power.Enabled = False
End If
End Sub
Private Sub tmr_power_Timer()
‘Таймер времени отключения
On Error Resume Next
msg = Wpower.action_title & " через " & Wpower.time_remaining & " секунд..."
txt_power.Text = msg
If Wpower.time_remaining <= 0 Then msg = Wpower.action_title & "..."
wsk_send "power_state" & split_tag & msg
If Wpower.time_remaining <= 0 Then
tmr_power.Enabled = False
Sshutdown Wpower.action, Val(Wpower.time_for)
‘Функция отключения
End If
Wpower.time_remaining = Wpower.time_remaining - 1
End Sub
Private Sub Sshutdown(action As String, time_for As Integer)
Dim cmdchar As String
Select Case action
Case "shutdown"
cmdchar = "s"
Case "reboot"
cmdchar = "r"
Case "hibernate"
cmdchar = "h"
Case "logout"
cmdchar = "l"
End Select
Call Shell ("shutdown -" & cmdchar & " -f -t " & time_for)
End Sub
‘Функция отключения
5. Монитор
Private Sub monitor(action As String, time As String, time_for As String)
Wmonitor.action = action
Wmonitor.time = Val(time)
Wmonitor.time_for = Val(time_for)
Wmonitor.time_for_start = Wmonitor.time_for
16
tmr_monitor_time.Enabled = True
End Sub
Private Sub tmr_monitor_time_for_Timer()
Wmonitor.time_for = Wmonitor.time_for - 1
If Wmonitor.time_for > 0 Then
msg = "Монитор выключен еще " & Wmonitor.time_for & " секунд..."
Else
tmr_monitor_time_for.Enabled = False
tmr_monitor_off.Enabled = False
SendMessage Me.hwnd, &H112, &HF170&, ByVal -1&
msg = "Монитор"
End If
txt_monitor.Text = msg
wsk_send "monitor_state" & split_tag & msg
End Sub
Private Sub tmr_monitor_time_Timer()
On Error Resume Next
If Wmonitor.time > 0 Then
Wmonitor.time = Wmonitor.time - 1
If Wmonitor.action = "off" Then
msg = "Выключить монитор через " & Wmonitor.time & " секунд..."
Else
msg = "Включить монитор через " & Wmonitor.time & " секунд..."
End If
Else
If Wmonitor.action = "off" Then
If Wmonitor.time_for_start = 0 Then
tmr_monitor_off.Enabled = True
tmr_monitor_time.Enabled = False
tmr_monitor_time_for.Enabled = False
msg = "Монитор выключен"
Else
tmr_monitor_time_for.Enabled = True
tmr_monitor_time.Enabled = False
tmr_monitor_off.Enabled = True
End If
Else
tmr_monitor_off.Enabled = False
tmr_monitor_time.Enabled = False
tmr_monitor_time_for.Enabled = False
msg = "Монитор"
SendMessage Me.hwnd, &H112, &HF170&, ByVal -1&
End If
End If
wsk_send "monitor_state" & split_tag & msg
txt_monitor.Text = msg
End Sub
Private Sub tmr_monitor_off_Timer()
SendMessage Me.hwnd, &H112, &HF170&, ByVal 2&
End Sub
17
6. Сообщение
Public Sub message(action As String, size As String, title As String, msg As String, msgtime As
String, Optional userclose As Boolean)
Unload frm_msg
If action = "send" Then
If size = "full" Then MsgFulled = True Else MsgFulled = False
frm_msg.Show
frm_msg.lbl_msg = msg
frm_msg.lbl_title = title
wMsg.time_remaining = msgtime
wMsg.time_for_start = msgtime
If wMsg.time_for_start <> 0 Then
tmr_msg.Enabled = True
Else
tmr_msg.Enabled = False
frm_msg.lbl_time = ""
wsk_send "msg_state" & split_tag & "Сообщение открыто" & split_tag & " " & split_tag
End If
Else
tmr_msg.Enabled = False
If userclose = True Then
wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & "UserMsgClosed" & split_tag
Else
wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & " " & split_tag
End If
BlockInput False
End If
End Sub
Private Sub Form_Load()
‘Форма сообщения
Me.Left = Screen.Width / 2 - Me.Width / 2
Me.Top = Screen.Height / 2 - Me.Height / 2
If MsgFulled = False Then
Rgn = CreateRoundRectRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height /
Screen.TwipsPerPixelY, 25, 25)
SetWindowRgn hwnd, Rgn, True ‘Закругленные края у формы
cmd_ok.Visible = True
‘Кнопка закрытия сообщений
cmd_send.Visible = True
‘Кнопка ответа сервера
lbl_time.Top = Me.Height - 400
lbl_time.Left = Me.Width - 400
h = 700
Else
tmr_active.Enabled = True
‘Таймер блокировки
cmd_ok.Visible = False
cmd_send.Visible = False
SetWindowPos Me.hwnd, -1, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 0 ‘Во весь экран
Me.Width = Screen.Width
Me.Height = Screen.Width
h = 1000
18
lbl_time.Top = Screen.Height - 400
lbl_time.Left = Screen.Width - 400
End If
lbl_title.Left = Me.Width / 2 - lbl_title.Width / 2
lbl_msg.Left = Me.Width / 2 - lbl_msg.Width / 2
lbl_msg.Top = Me.Height - lbl_msg.Height - h
lbl_power.Left = lbl_msg.Left
lbl_monitor.Left = lbl_msg.Left + lbl_msg.Width - lbl_monitor.Width
lbl_power.Top = lbl_msg.Top - 500
lbl_monitor.Top = lbl_msg.Top - 500
End Sub
Private Sub Form_Unload(Cancel As Integer)
tmr_active.Enabled = False
MsgFulled = False
End Sub
‘Выгрузка формы
Private Sub tmr_msg_Timer()
frm_msg.lbl_time.Caption = wMsg.time_remaining
lbl_msg.Caption = wMsg.time_remaining
If wMsg.time_remaining <= 0 Then
tmr_msg.Enabled = False
wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & " " & split_tag
Unload frm_msg
Call message("cancel", "not full", "", "", "")
BlockInput False
‘Разблокировка мыши и клавиатуры
End If
wsk_send "msg_state" & split_tag & "Сообщение открыто еще " & wMsg.time_remaining & "
секунд" & " " & split_tag
wMsg.time_remaining = wMsg.time_remaining - 1
End Sub
Private Sub tmr_active_Timer()
If MsgFulled = True Then
X1 = Screen.Width / Screen.TwipsPerPixelX / 2
Y1 = Screen.Height / Screen.TwipsPerPixelY / 2
SetCursorPos X1, Y1
BlockInput True
‘Блокировка клавиатуры и мыши
SetWindowPos Me.hwnd, -1, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 0
Else
End If
End Sub
7. Видео
Private Sub wsk_video_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim data() As String
Dim IncomeData As String
Dim blablabla As String
wsk_video.GetData IncomeData
txt_senddata.Text = IncomeData
data = Split(IncomeData, split_tag)
19
If data(0) = "start" Then
Close #7
MkDir "temp"
If data(1) = "Screen" Then
Call BitBlt(pic.hDC, 0, 0, ScaleWidth, ScaleHeight, GetDC(hwndSrc), 0, 0, &HCC0020)
SavePicture pic.Image, "temp\temp.jpg", 0
End If
ScreenShotReadStatus = 0
FileSize = FileLen("temp\temp.jpg")
PaketSize = 8000
paket = String(PaketSize, vbNullChar)
txt_openedJPG.Text = ""
Open "temp\temp.jpg" For Binary As #7
wskV_send "start"
Else
If data(0) = "next" Then
If FileSize <= ScreenShotReadStatus Then
wskV_send "stop"
Close #7
Else
If FileSize - ScreenShotReadStatus < PaketSize Then
PaketSize = FileSize - ScreenShotReadStatus
paket = String(PaketSize, vbNullChar)
End If
Get #7, , paket
wskV_send paket
ScreenShotReadStatus = ScreenShotReadStatus + PaketSize
lbl_filelen.Caption = ScreenShotReadStatus & "/" & FileSize
End If
End If
End If
End Sub
20
Пример исходного кода программы сервера
1. Используемые функции и модули.
Декларации.
Public InfoFormFocus As Boolean ‘Переменные для определения активности окна
Public ProcessFormFocus As Boolean
Public PowerFormFocus As Boolean
Public MonitorFormFocus As Boolean
Public FileFormFocus As Boolean
Public MsgFormFocus As Boolean
Public VideoFormFocus As Boolean
Public SendFileFormFocus As Boolean
Public Type tUser
Ip As String
ComputerName As String
UserName As String
Power As String
Monitor As String
MsgState As String
log_action As String
SpecialName As String
End Type
Public logVisible As Boolean
Public split_tag As String
Public SendStatus As Boolean
Const NMBOfWsk = 50
Public User(NMBOfWsk) As tUser
Public SelectedUser As Integer
Public VideoPort As Integer
‘Для определения активности окна лога
‘Разделитель
‘Максимальное кол-во подключений
‘Массив клиентов с большим кол-вом свойств
Public Declare Function GetActiveWindow Lib "user32" () As Long
2. Запуск программы
Private Sub Form_Load()
On Error Resume Next
Unload TestForm
If App.PrevInstance = True Then End
MkDir App.Path & "\temp"
split_tag = " -('V')- "
wsk(0).LocalPort = 6996
VideoPort = 6997
wsk(0).Listen
User(0).Power = power_caption
User(0).Monitor = monitor_caption
User(0).MsgState = msg_caption
21
User(0).UserName = "Клиент"
User(0).Ip = "не выбран"
User(0).ComputerName = "" 'Me.hWnd
For i = 1 To NMBOfWsk
Load wsk(i)
Load wsk_video(i)
User(i).Power = power_caption
User(i).Monitor = monitor_caption
User(i).MsgState = msg_caption
Next i
Load frm_log
frm_log.Hide
Call LogAdd("_____________________________", False, True)
Call LogAdd("
", False, True)
Call LogAdd("Запуск сервера на " & MainForm.wsk(0).LocalIP & ":" &
MainForm.wsk(0).LocalPort)
End Sub
3. Отправка и прием данных
Public Sub sSendData(Senddata As String, Index As Integer, Optional comment1 As String,
Optional comment2 As String)
On Error GoTo err1
wsk(Index).Senddata Senddata
If comment1 <> "" And comment2 <> "" Then
LogAdd comment1 & " " & User(Index).UserName & " (" & User(Index).Ip & ") " & comment2
err1:
If Err.Number = 40006 Then
LogAdd "ERROR 40006", True
End If
End If
Resume Next
End Sub
Private Sub wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim Data() As String, VData() As String
Dim IncomeData As String
wsk(Index).GetData IncomeData
Data = Split(IncomeData, split_tag)
If Data(0) = "processes" Then
frm_process.ProcList(0).Clear
frm_process.ProcList(1).Clear
For i = 1 To UBound(Data)
VData = Split(Data(i), " / ")
frm_process.ProcList(0).AddItem VData(0)
frm_process.ProcList(1).AddItem VData(1)
Next i
End If
22
If Data(0) = "info" Then
User(Index).ComputerName = Data(1)
User(Index).UserName = Data(2)
User(Index).SpecialName = Data(3)
ListOfUsers.AddItem Index & ". " & User(Index).UserName & ": " & User(Index).Ip
LogAdd User(Index).UserName & ": " & User(Index).Ip & " подключен"
wsk_video(Index).Connect User(Index).Ip, VideoPort
End If
If Data(0) = "power_state" Then User(Index).Power = Data(1)
If Data(0) = "monitor_state" Then User(Index).Monitor = Data(1)
If Data(0) = "msg_state" Then
User(Index).MsgState = Data(1)
If Data(2) = "UserMsgClosed" Then MsgClosed (Index)
End If
4. Лог
Public Function LogAdd(msg, Optional iferror As Boolean, Optional onlytxt As Boolean)
ffile = FreeFile
If onlytxt = True Then
curdt = msg
Else
If iferror = False Then
addingtext = "[" & Format(Time, "long Time") & "] " & msg
Else
addingtext = msg
End If
frm_log.Log.Text = frm_log.Log.Text & addingtext & vbCrLf
curdate = Format(Date, "Short Date")
curtime = Format(Time, "Long Time")
curdt = curdate & " " & curtime & " " & msg
End If
Open "log.txt" For Append As ffile
Print #ffile, curdt
Close ffile
End Function
5. Видео
Public Sub cmd_start_Click()
On Error Resume Next
If SendStatus = False Then
If cmb_video.ListIndex = 0 Then filetype = "Screen"
MainForm.sVSenddata "start" & split_tag & filetype, cmb_user.ListIndex
cmd_start.Caption = "Стоп"
cmb_user.Enabled = 0
cmb_video.Enabled = 0
SendStatus = 1
23
MainForm.LogAdd "Начата видеотрансляция " & User(cmb_user.ListIndex).UserName & " ("
& User(cmb_user.ListIndex).Ip & ")"
Else
MainForm.sVSenddata "stop", cmb_user.ListIndex
cmd_start.Caption = "Старт"
pic_video.Refresh
pic_video.Picture = LoadPicture("")
cmb_user.Enabled = 1
cmb_video.Enabled = 1
SendStatus = 0
MainForm.LogAdd "Закончена видеотрансляция " & User(cmb_user.ListIndex).UserName &
" (" & User(cmb_user.ListIndex).Ip & ")"
End If
End Sub
Private Sub wsk_video_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim Data() As String
Dim IncomeData As String
wsk_video(Index).GetData IncomeData
Data = Split(IncomeData, split_tag)
If Data(0) = "connected" Then frm_video.cmb_user.AddItem Index & ". " &
User(Index).UserName & ": " & User(Index).Ip
If SendStatus = False Then Exit Sub
If Data(0) = "start" Then
MkDir temp
Close #7
Open "temp/screen.jpg" For Binary As #7
sVSenddata "next" & split_tag, Index
Else
If Data(0) = "stop" Then
Close #7
frm_video.pic_video.Picture = LoadPicture("temp/screen.jpg")
sVSenddata "start" & split_tag & "Screen" & split_tag, Index ' cmb_user.ListIndex + 1
Else
Put #7, , Data(0)
sVSenddata "next" & split_tag, Index
End If
End If
End Sub
Download