Программирование
Веб программирование

Winsock vb

 
 

Winsock нужен для связи двух компов, его очень часто используют для локалок ил для создания троянов(об этом потом :-)). В этом шаге мы сделаем простую программу типо Клиент - Сервер.
Клиент - это программа которая посылает сигналы серверу, а сервер ждет сигналов клиента(ну ты меня понял?). Начнемс...
Для начала сделаем Сервер, он будет ждать сигнала клиента, и когда клиент выйдет на связь, можно будет посылать сигналы от сервера к клиенту, и наоборот. Короче будет что то типо чата.
Войди в VB(Standart Exe), подключи компонент МелкоСофт Winsock Контрол 6.0, на понели инструментов появится объект Winsock, закинь его на форму. На форму кинь еще 2 текстовых поля(1ое - отправка сообщений, 2ое - прием сообщений). Вот код:

Private Sub Form_Load()
Winsock1.LocalPort = 101 ' Указываем порт который будет слушать Сервер
Winsock1.Listen ' Начинаем Слушать порт
Form1.Caption = "Сервер" 
End Sub 

Private Sub Text1_Change() ' При изменении текста в текстовом поле:
Winsock1.SendData Text1.Text ' Посылаем клиенту текст который введен в текстовое поле
End Sub 

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close ' Если сервер не закрыт, то закрываем его(подробнее смотри ниже)
Winsock1.Accept requestID ' Принимаем запрос
End Sub 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Если Клиент посылает текст то:
Dim D As String ' Объявляем переменную для работы со строками
Winsock1.GetData D ' Записываем в переменную текст, который был послан Клиентом
Text2.Text = D ' Здесь все понятно, скажу только что нельзя напрямую писать Winsock1.GetData Text1.Text, надо обязательно через переменную
End Sub 

Ну усе, сервер готов, теперь надо сделать Клиент. Ой... чуть не забыл... короче вот таблица:

 

Константа Описание
sckClosed Такое значение стоит при запуске программы или когда порт закрыт
sckOpen Порт открыт
sckListening Порт прослушивается
sckConnectionPending Ожидание связи
sckConnecting Подключение к хосту
sckConnected Связь установлена
sckClosing Связь закрывается...
sckError Ошибка

Вот про это я и говорил, в строке If Winsock1.State <> sckClosed Then, вместо sckClosed ты можешь вписать любую константу из таблицы.
Теперь мы сделаем клиент, на форму опять кинь контрол Winsock, 2 тектовых поля, вот код:

Private Sub Form_Load()
Winsock1.RemoteHost = "127.0.0.1" ' Указываем IP компа, на котором запущен сервер(В место IP`a можно указать имя компа(Мой Компьютер>>Панель управления>>Сеть>>Индефикация(Winsock1.RemoteHost = "Komp")))(если ты сейчас не в сети(ил в локалке), то твой IP всегда будет 127.0.0.1)
Winsock1.RemotePort = 101 ' Указываем порт сервера
Winsock1.Connect ' Подключаемся
Form1.Caption = "Клиент"
End Sub


Private Sub Text1_Change() ' При изменении текста:
Winsock1.SendData Text1.Text ' Отправляем текст
End Sub 

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Если сервер посылает текст то:
Dim DD As String ' Объявляем переменную для работы со строками
Winsock1.GetData DD ' Записываем в переменную текст, который был послан Сервером
Text2.Text = DD
End Sub 

Все, теперь запусти Сервер, а потом Клиент. Впиши в Текстовое поле текст, и он появится в другом текстовом поле(если текст вписан в сервер, то он появится в клиенте, и наоборот).
Исходник


Есть вопросы? Спроси на нашем форуме!!
Начинающий [16.04.2010 23:10]

Если стоит модем, влияет ли он на IP? И чей IP надо указывать компа или модема?

Опять я [16.04.2010 23:25]

Извините, тупой вопрос был, можете не отвечать.
Ответьте лучше на этот: У меня 2 текста надо передать на сервер, а как это сделать когда подключаю 2 винсока то ошибка а когда 1 то текст предыдущего сбрасывается, что делать?

Опять я [17.04.2010 11:58]

Извините, тупой вопрос был, можете не отвечать.
Ответьте лучше на этот: У меня 2 текста надо передать на сервер, а как это сделать когда подключаю 2 винсока то ошибка а когда 1 то текст предыдущего сбрасывается, что делать?

Слава богу не ты... [22.02.2011 18:23]

тупой...качай исходник тогда раз сам жжешь..

я [22.02.2011 22:25]

If Winsock1.State <> sckClosed Then Winsock1.Close ' Если сервер не закрыт, то закрываем его(подробнее смотри ниже)
а зачем закрывать сервер?

и почему если клиент отключится и снова включит клиент то сообщения не доходят?

Заколебал... [27.03.2011 01:46]

Качай исходник и не тупи...

Ламер [10.04.2011 19:24]

А как всё это в exe???

мойдодыр [08.05.2011 12:58]

у меня получилось, и ничего здесь нету сложного, автор рулит!!!

цук Я [09.06.2011 12:13]

круто так можно чото типа аськи сделать

r@d-eagle [15.06.2011 10:27]

у меня выдало ошибку run-time-error
я поменял порт на 1001 и все заработало
в чем тут прикол с портами?

Серж [20.09.2011 20:23]

If Winsock1.State <> sckClosed Then ' Если сервер не закрыт, то закрываем его(подробнее смотри ниже)
' Принимаем запрос

Объясните, пожалуста, зачем сначала закрывать соединение(Winsock1.Close), а потом принимать запрос(Winsock1.Accept requestID)?

Да [24.03.2012 17:32]

мне тоже это непонятно

Чувак [25.04.2012 17:51]

Я все сделал открыл на компе и сервер и клиент, вписал текст, а он не отправился!
Нажал enter - не отправился! В чем моя ошибка?

алексей [25.04.2012 19:10]

чувак зайди в чат поговорим
я помогу

Студент [05.05.2012 21:51]

Круто. Слов нет. Автору премию!

новичек [12.05.2012 20:38]

а вот вопрос, как сделать так, что бы к серверу могло подключаться несколько клиентов?

алексей(alex13sh) [13.05.2012 13:12]

всем привет. Вижу тут много людей страдающей логикой (не вобиду) но в програмирование логика занимает 60-70% .
я сам догадался до соеденение несколько клиетов к серверу. вот пример:
dim s1 as integer, s as integer
Private Sub FormLoad()
w1(0).LocalPort = 1000: w1(0).Listen
End sub
Private Sub w1
ConnectionRequest(index As Integer, ByVal requestID As Long)
Label1 = index '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' потом уберу''''''''''''''''''''''''''''''''''''''
If w1(index).State <> sckClosed Then w1(index).Close
w1(index).Accept requestID
s1 = -1
For i1 = 0 To s Step 1
DoEvents: If w1(i1).State <> sckConnected Then s1 = i1: Call ext(i1): Exit For
Next i1
If s1 = -1 Then s = s + 1: s1 = s: Load w1(s1)
w1(s1).Close: w1(s1).LocalPort = 1000: w1(s1).Listen
End Sub
САМОЕ ГЛАВНОЕ w1 это и есть винсок и винсок должен быть масивный!!

Этот код можно улучшить то есть ускорить. но вам это не нужно для мелких серваков

Samou4120 [20.03.2013 11:20]

Отлично!

alex13sh300 [22.03.2013 13:37]

zm200360, И в чём проблема?
объект винсок массивный?
если да то в чём проблема свойство LocalPort и всё

pskov-igor170 [02.05.2013 17:23]

Не получаеться((( клиентку сделал. Она мне ip и порт показывает, а сервак по этим данным входить не хочет. Что делать?? Если можно то в почту pskov251097@yandex.com Код там дам дам.

alex13sh300 [02.05.2013 19:53]

pskov-igor, не сервак к клиенту подключается а на обород

zabir10 [22.11.2013 11:59]

нужна помощь! помогите пожалуйста, при добавление элемента WINSOCK выскакивает ошибка "Сбой при импорте элемента управление ActiveX. Убедитесь в том, что он правильно зарегистрирован" как быть? как правильно зарегистрировать

Stertor370 [22.11.2013 16:10]

Это значит, что *.ocx компонент, который ты используешь не зарегистрирован в системе и сервер не существует. Подумай теперь сам, имеет ли смысл писать троян на бейсике - у 99% юзеров *.ocx-компоненты, нужные для работы программ на бейсике, разрегистрированы, их просто словно бы и нет в системе. Вообще, написав прогу каждый раз стремитесь проверить ее работу на разных компах, т.к. бейсик часто предоставляет компоненты, которых может не быть в других компах - это обязательно вызовет крах вашей программы, если вы запустите ее на другом компе, на котором не устанвлен бейсик.

Регистируют же библиотеки с помощью команды regsvr32 -i



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.