Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 1 | 2 |

 

  Вопрос: Тяга Server Добавлено: 27.01.04 14:17  

Автор вопроса:  NeForm@t | Web-сайт: g--k.newmail.ru | ICQ: 252999255 

Вот DaSharm накодил новую версию Тяги - Тяга-Сервер

Ссылка для загрузки:http://www.g--k.newmail.ru/ts.rar ~66kb

Особенности:

Свойства:

 

-----------
AlertMode
Эсли это свойство установить в false, то не будет вылетать ни одна ошибка контрола
Пример: S1.AlertMode = False
-----------

-----------
LocalIP
Из свойства можно получить свой локальный IP адрес
Пример: MsgBox S1.LocalIP
-----------

-----------
LocalName
Свойство содержит сетевое имя локального компьютера
Пример: MsgBox S1.LocalName
-----------

-----------
State
По свойству можно судить о состоянии контрола
Пример: If S1.State = sended then MsgBox "Данные отосланы"
Примечание: свойство доступно из любой точки програмы (как вы и просии)
-----------

 

События (процедуры при событиях):

 

-----------
accepting
Выглядит так:
Private Sub S1_accepting(id As Long, IP As String)

End Sub
Событие происходит всегда, когда кто-то старается подключиться к серверу.
В параметрах передается уникальный номер соединения id и айпи адрес пользователя IP.
Пример:
Private Sub S1_accepting(id As Long, IP As String)
Print "Пользователь с номером " & id & " и айпи адресом " & IP & " подключен"
End Sub
-----------

-----------
DataArrival
Выглядит так:
Private Sub S1_DataArrival(id As Long, Data As String)

End Sub
Событие происходит всегда, когда поступают какие-то данные.
В параметрах передается уникальный номер соединения id и сами данные от этого
пользователя.
Пример:
Private Sub S1_DataArrival(id As Long, Data As String)
Print "Пользователь с номером " & id & " говорит " & Data
End Sub
-----------

-----------
error
Выглядит так:
Private Sub S1_error(error As ErVars)

End Sub
Событие происходит всегда, когда происходит ошибка.
В параметрах передается один из вариантов ошибки.
Пример:
Private Sub S1_error(error As ErVars)
If error = ConnectFailed Then MsgBox "Подключиться не удалось"
End Sub
-----------

-----------
UserClosed
Выглядит так:
Private Sub S1_UserClosed(id As Long)

End Sub
Событие происходит всегда, когда один из пользователей розрывает соединение.
В параметрах передается уникальный номер розорваного соединения, этот номер
можно теперь считать свободным, и, когда подключится новый пользователь, то
наверняка он "возьмет" этот номер себе.
Пример:
Private Sub S1_UserClosed(id As Long)
MsgBox "Пользователь с номером: " & id & " отключился"
End Sub
-----------

 

Методы

 

-----------
CloseThis
Синтаксис: CloseThis [номер соединения]
Вот так можно закрыть соединение с любым из пользователей.
Пример:
MsgBox "Пользователь номер 5 плохо вел себя в чате, мы его закроем"
S1.CloseThis 5
-----------

-----------
SendData
Синтаксис: SendData [номер соединения] , [данные]
А так передаем данные любому пользователю.
Пример:
SendData 5 , "Ты плохо вел себя в чате, тебе конец!"
-----------

-----------
SendForAll
Синтаксис:  SendForAll [Данные] , [номер соединения но который не слать данные (эсли хочешь)]
Метод пересылает данные всем подключеным пользователям, эсли хочешь,
то можно указать пользователя, которому не пересылать данные (бывает нужно).
Пример:
S1.SendForAll "Привет, с нами пользователь 2, не будем ему говорить..." , 2
S1.SendForAll "Привет всем"
-----------

-----------
Listen
Синтаксис: Listen [порт]
Элементарно, слушаем порт (читай, стартуем сервер).
пример:
S1.Listen 22
-----------

-----------
Connect
Синтаксис: Connect [Имя или айпи адрес компьютера],[порт]
Ну это я чисто для чатов сделал, и долго не хотел додавать этого метода
(у нас же сервер а не клиент). В чатах будет клево этим пользоватся, типа,
можно быть или сервером или клиентом (и все на одном контроле).
Что за Connect я думаю вы уже знаете, этот метод используется для установления
связи с удаленным компьютером (хотя можно и с локальным).
! Я настоятельно рекомендую использовать этот метод только в чатах, для троянов и
иных похожих клиент-серверных приложений ЛУЧШЕ использовать "Тягу 1.5" !
Пример:
S1.Connect "127.0.0.1",22
-----------

-----------


Мои примечания:


1.Меня на форуме спрашивали: как сначала посмотреть АЙПИ адрес пользователя, а потом
  уж позволить ему подключиться?
  Отвечаю: АЙПИ адрес до коннекта посмотреть невозможно, но, в "Тяга-сервер" эсть обход.
  Этот пример смотрит на АЙПИ адрес пользователя, и, эсли он совпадает с "127.0.0.1" - отключает его.
  Выходит, юзер с АЙПИ адресом "127.0.0.1" не сможет подключиться к серверу.
  Private Sub S1_accepting(id As Long, IP As String)
   if IP = "127.0.0.1" then S1.CloseThis id
  End Sub

2. Надеюсь, тебе (Вам) понравиться мой контрол. Следующие мои цели: контрол для работы с ICQ и движок Socks4.
   Эсли ты(Вы) найдешь(найдете) баг, то прошу сообщить мне на эл. ящик dasharm@mail.ru.

Ответить

  Ответы Всего ответов: 20  

Номер ответа: 1
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #1 Добавлено: 27.01.04 17:14

Пасиб!!

Ответить

Номер ответа: 2
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #2 Добавлено: 17.08.05 10:03

вот только столкнулся с продлемой - как остановить сервер?

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 17.08.05 12:41
Private Function GetFreeID() As Long
(токо чё она приват - х.з. мож он ошибся...)

Public Sub CloseThis(id As Long)

Ответить

Номер ответа: 4
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #4 Добавлено: 17.08.05 17:51

я имею в виду полную остановку (чтоб и порт прослушки освободился)

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 17.08.05 20:23
юзай лучше эту...


'
' VBSocket - новое имя контролов под старым названием "Тяга"
' VBSocket - максимально облегченный контрол, исправлены все глюки
' "Тяга 1.5" и "Тяга 2В" (последний официально не вышел).
' Наконец-то додана асинхронность в коннекте. Надеюсь, это последний
' мой контрол для работы с сокетами
'
' По всем вопросам обращатся к разработчику, т. е. ко мне:
'                                                            ;DaSharm
'                                                            dasharm@mail.ru
'                                                            www.localhost.co.nr
'                                                            ICQ 2068093
' Ukraine, Ternopol (100% Український продукт!)
Private Type WSAData
    wVersion       As Integer
    wHighVersion   As Integer
    szDescription  As String * 257
    szSystemStatus As String * 129
    iMaxSockets    As Integer
    iMaxUdpDg      As Integer
    lpVendorInfo   As Long
End Type
Private Type sockaddr_in
    sin_family       As Integer
    sin_port         As Integer
    sin_addr         As Long
    sin_zero(1 To 8) As Byte
End Type
Public Enum AlertVars
 Yes = 0
 No = 1
End Enum
Public Enum StateVars
 Connecting = 0
 Connected = 1
 Sending = 2
 Sended = 3
 Recving = 4
 Listening = 5
 Accepted = 6
End Enum
Event DataArrival(Data As String)
Event Accepted(IP As String)
Event Connected(IP As String, port As Long)
Event ConnectError()
Private Declare Function gethostname Lib "ws2_32.dll" (ByVal host_name As String, ByVal namelen As Long) As Long
Private Declare Function getpeername Lib "ws2_32.dll" (ByVal so As Long, ByRef stru As sockaddr_in, ByRef strulen As Long) As Long
Private Declare Function gethostbyname Lib "wsock32" (ByVal hostname As String) As Long
Private Declare Function inet_ntoa Lib "ws2_32.dll" (ByVal inn As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (xDest As Any, xSource As Any, ByVal nbytes As Long)
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (lpString As Any) As Long
Private Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
Private Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVR As Long, lpWSAD As WSAData) As Long
Private Declare Function WSACleanup Lib "ws2_32.dll" () As Long
Private Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Private Declare Function htonl Lib "ws2_32.dll" (ByVal hostlong As Long) As Long
Private Declare Function Socket Lib "ws2_32.dll" Alias "socket" (ByVal afi As Long, ByVal s_type As Long, ByVal protocol As Long) As Long
Private Declare Function Con Lib "ws2_32.dll" Alias "connect" (ByVal S As Long, ByRef name As sockaddr_in, ByVal namelen As Long) As Long
Private Declare Function send Lib "ws2_32.dll" (ByVal S As Long, ByRef buf As Any, ByVal BufLen As Long, ByVal flags As Long) As Long
Private Declare Function Lis Lib "ws2_32.dll" Alias "listen" (ByVal S As Long, ByVal backlog As Long) As Long
Private Declare Function VBind Lib "ws2_32.dll" Alias "bind" (ByVal S As Long, ByRef name As sockaddr_in, ByRef namelen As Long) As Long
Private Declare Function WSAAsyncSelect Lib "ws2_32.dll" (ByVal S As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long
Private Declare Function accept Lib "ws2_32.dll" (ByVal S As Long, addr As sockaddr_in, addrlen As Long) As Long
Private Declare Function recv Lib "ws2_32.dll" (ByVal S As Long, ByVal buf As Any, ByVal BufLen As Long, ByVal flags As Long) As Long
Private Declare Function closesocket Lib "ws2_32.dll" (ByVal S As Long) As Long
Private Const MAXCONN = &H7FFFFFFF
Private Const FD_READ = &H1
Private Const FD_ACCEPT = &H8
Private Const FD_CONNECT = &H10
Private Const FD_CLOSE = &H20
Public AlertMode As AlertVars
Public LocalIP As String
Public LocalName As String
Public State As StateVars
Public ConnectedRemoteIP As String
Dim NewSocket As Long
Dim IncSocket As Long
Dim aSocket As Long
Dim imClient As Boolean
Dim tmppIP As String
Dim tmppPort As Long
Public Function Connect(Host As String, port As Long)
 Dim IP As String
 tmppIP = Host
 tmppPort = port
 Dim cStruct As sockaddr_in
 Dim retV As Long
 If Left(Host, 1) <> 1 Or Left(Host, 1) <> 2 Then IP = GetIPFromHostName(Host)
 cStruct.sin_addr = inet_addr(IP)
 cStruct.sin_family = 2
 cStruct.sin_port = htons(port)
 State = Connecting
 closesocket NewSocket
 closesocket aSocket
 NewSocket = Socket(2, 1, 6)
 WSAAsyncSelect NewSocket, inCON.hWnd, &H202, FD_CONNECT
 retV = Con(NewSocket, cStruct, Len(cStruct))
 aSocket = NewSocket
End Function
Public Function SendData(Data As String) As Boolean
If Data = "" Then Exit Function
 Dim sB() As Byte
 Dim sBytes As Long
 Dim LensB As Long
  LensB = Len(Data)
  sB() = StrConv(Data, vbFromUnicode)
  sBytes = send(aSocket, sB(0), LensB, 0&;)
   If sBytes = -1 Then
    If AlertMode = Yes Then MsgBox "Невозможно передать данные хосту", vbCritical, "Ошибка"
    SendData = False
   Else
    SendData = True
    State = Sended
   End If
End Function
Public Function Listen(port As Long) As Boolean
  closesocket aSocket
 Dim sST As sockaddr_in
 Dim tRe
  sST.sin_addr = &H0
  sST.sin_family = 2
  sST.sin_port = htons(port)
   IncSocket = Socket(2, 1, 6)
   tRe = VBind(IncSocket, sST, LenB(sST))
  If tRe = -1 Then
   If AlertMode = Yes Then MsgBox "Невозможно слушать порт, наверное он занят", vbCritical, "Ошибка"
   Listen = False
  Else
   Listen = True
   State = Listening
  End If
 tRe = Lis(IncSocket, MAXCONN)
 tRe = WSAAsyncSelect(IncSocket, inC.hWnd, &H202, FD_CONNECT Or FD_ACCEPT)
End Function
Public Sub CloseConnection()
 closesocket NewSocket
 closesocket IncSocket
 closesocket aSocket
End Sub
Private Sub inC_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
 Dim ns As sockaddr_in
 Dim vRE As Long
  aSocket = accept(IncSocket, ns, Len(ns))
  ConnectedRemoteIP = Convert(inet_ntoa(ns.sin_addr))
  RaiseEvent Accepted(ConnectedRemoteIP)
  WSAAsyncSelect aSocket, inD.hWnd, &H202, FD_READ Or FD_CLOSE
End Sub
Private Sub inCON_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
 Dim nst As sockaddr_in
 Dim rVal As Long
 rVal = getpeername(aSocket, nst, Len(nst))
 If rVal = -1 Then
 closesocket NewSocket
 closesocket aSocket
 If AlertMode = Yes Then MsgBox "Невозможно установить коннект к хосту " & Host, vbCritical, "Ошибка"
 RaiseEvent ConnectError
 Exit Sub
 End If
 State = Connected
 imClient = True
 RaiseEvent Connected(tmppIP, tmppPort)
 WSAAsyncSelect aSocket, inD.hWnd, &H202, FD_READ Or FD_CLOSE
End Sub
Private Sub inD_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
 On Error Resume Next
 Dim incData As String
 incData = GetData
 If incData = "" Then
   If imClient = True Then Exit Sub
   WSAAsyncSelect IncSocket, inC.hWnd, &H202, FD_CONNECT Or FD_ACCEPT
 Else
   RaiseEvent DataArrival(incData)
 End If
End Sub
Private Function GetData() As String
 Dim bytes As Long
 Dim RB As String * 16384
 Dim Data As String
 bytes = recv(aSocket, RB, 16384, 0)
  If bytes > 0 Then
   ;Data = Left$(RB, bytes)
   GetData = Data
  Else
   GetData = ""
  End If
End Function

Private Sub Label1_Click()

End Sub

Private Sub UserControl_Initialize()
 Dim ws As WSAData
  WSAStartup &H202, ws
 Dim MyName As String * 255
  gethostname MyName, 255
  LocalName = MyName
  LocalIP = GetIPFromHostName(MyName)
End Sub
Private Function GetIPFromHostName(ByVal sHostName As String) As String
   Dim nbytes As Long
   Dim ptrHosent As Long
   Dim ptrName As Long
   Dim ptrAddress As Long
   Dim ptrIPAddress As Long
   Dim sAddress As String
   sAddress = Space$(4)
   ptrHosent = gethostbyname(sHostName & vbNullChar)
   If ptrHosent <> 0 Then
      ptrAddress = ptrHosent + 12
      CopyMemory ptrAddress, ByVal ptrAddress, 4
      CopyMemory ptrIPAddress, ByVal ptrAddress, 4
      CopyMemory ByVal sAddress, ByVal ptrIPAddress, 4
      GetIPFromHostName = IPToText(sAddress)
   End If
End Function
Private Function IPToText(ByVal IPAddress As String) As String
   IPToText = CStr(Asc(IPAddress)) & "." & _
              CStr(Asc(Mid$(IPAddress, 2, 1))) & "." & _
              CStr(Asc(Mid$(IPAddress, 3, 1))) & "." & _
              CStr(Asc(Mid$(IPAddress, 4, 1)))
End Function
Private Function Convert(ByVal Inp As Long) As String
    Dim pr As String
    Dim re As Long
    pr = String$(lstrlen(ByVal Inp), 0)
    re = lstrcpy(ByVal pr, ByVal Inp)
    If re Then Convert = pr
End Function
Private Sub UserControl_Resize()
 Width = 465
 Height = 390
End Sub

Private Sub UserControl_Terminate()
 closesocket NewSocket
 closesocket IncSocket
 closesocket aSocket
End Sub




тут есть CloseConnection

Ответить

Номер ответа: 6
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #6 Добавлено: 18.08.05 09:13
да но он не пригоден для чата, в описании VBSocket это сказано

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 18.08.05 21:28
Непонял, почему это он не пригоден для чата? Данные успешно и принимает и отправляет, что собственно ещё чато нужно? И покажи мне это описание...

Ответить

Номер ответа: 8
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #8 Добавлено: 19.08.05 14:29
в хелпе по VBSocket написано:


Как сделать так, чтобы к серверу одновременно могли быть подключены несколько клиентов?
 
Несколько клиентов одновременно - это задача, которая не решается с помощью "VBSocket1A". Для этого существует сокетный движок "Тяга-сервер", который идеально подходит для создания многопользовательских чатов, простых ВЕБ серверов и т. п.

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 19.08.05 19:15
мда, точно, несколько клиентов же .... лана, промахнулся. Ну а с тягой чё там, есть же вроде


-----------
UserClosed
Выглядит так:
Private Sub S1_UserClosed(id As Long)

End Sub
Событие происходит всегда, когда один из пользователей розрывает соединение.
В параметрах передается уникальный номер розорваного соединения, этот номер
можно теперь считать свободным, и, когда подключится новый пользователь, то
наверняка он "возьмет" этот номер себе.
Пример:
Private Sub S1_UserClosed(id As Long)
MsgBox "Пользователь с номером: " & id & " отключился"
End Sub
-----------

 

Методы

 

-----------
CloseThis
Синтаксис: CloseThis [номер соединения]
Вот так можно закрыть соединение с любым из пользователей.
Пример:
MsgBox "Пользователь номер 5 плохо вел себя в чате, мы его закроем"
S1.CloseThis 5
-----------



разве это не закрывает?

П.С. Если через CloseThis закрыть всех по очереди порт освободится, попробуй.

Ответить

Номер ответа: 10
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #10 Добавлено: 19.08.05 20:04
ok попробую...

Ответить

Номер ответа: 11
Автор ответа:
 nicolai



ICQ: 197368786 

Вопросов: 6
Ответов: 91
 Профиль | | #11 Добавлено: 20.08.05 10:36
нет не получается порт освободить (сделал как проедложено - подключил несколько клиентов 1,2,3,4 потос закрыл их s1.closethis 1 , s1.closethis 2 , ... ) ничего порт все еще открыт сервером

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 20.08.05 16:15
мда, действительно не закрывает. У меня получилось закрыть кривым способом, вообщем всё просто, достаточно Unload Me в той форме на которой размещён s1 т.е. типа...


Private Sub Command2_Click()
Form2.Show
Unload Form1
End Sub


На Form1 был S1, мы показали Form2, Form1 выгрузили, при этом s1 освободил порт.

Ответить

Номер ответа: 13
Автор ответа:
 bonapart



Вопросов: 2
Ответов: 5
 Профиль | | #13 Добавлено: 18.09.06 20:45
помогите с русским языком в этом контроле
т.е. браузер отсылает %20 вместо пробела и руских символов аналогично

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 19.09.06 01:21
а причем здесь контрол к браузеру? Или ты контрол в качестве прокси используешь?

%20

msgbox ( asc(val("&H20";)) )

таким макаром циклом можно востановить символы...

Но зачем?

Ответить

Номер ответа: 15
Автор ответа:
 bonapart



Вопросов: 2
Ответов: 5
 Профиль | | #15 Добавлено: 19.09.06 17:23
я его использую для проверки сайта по локальной сетке т.е. без интернета а тут ошибки
и обясни мне что выделять похожие комбинации и делать что надо к примеру
documents&20and%20settings а если руские с англискими
напиши тогда парсер или его принцып

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам