Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Еще раз про Winsock Добавлено: 05.07.02 11:14  

Автор вопроса:  Petrovich

Вот и пришлось познакомится с этим зверем. Первые шаги. Сделал по примеру http://vbrussian.com/Winsock.asp Клиент и Сервер - приложения. Благо на рабочем месте 2 машины стоят рядом. Текстовые поля и там и там.  Запускаю Сервер. Запускаю Клиент. Жму кнопку "коннект". Пишу текст. Чудо! На другой машине где запущен Сервер вижу текст. Испытываю радость папуаса, нашедшего баночку с Колой.

Но! Сервер остается висеть. Закрываю Клиент. Запускаю Клиент еще раз. Жму "коннект". Пишу текст. Чуда нет. Возникает ошибка 400006. (Wrong protocol or connection state for the requested transaction or request). Помогите побороть, пожалуйста.

И заодно вопрос: мне нужно не текст из текстового поля передавать, а файлы. Как это реализовать? Я полагаю как массив символов? Примерно так

nIn = FreeFile: Open sInFileName For Binary As #nIn
lLenFile = LOF(nIn)
ReDim Buffer(1 To lLenFile) As Byte
'читаем все в массив
Get #nIn, , Buffer()
И что теперь? Как передавать? Или это в корне неверно и смешно?

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

Номер ответа: 1
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #1 Добавлено: 05.07.02 11:29

Про передачу файлов через инет посредством винсока ходят легенды. каждый изврощается и ухитряется в меру своей испор... то есть образованности и опыта. Иван написал статейку, которая уже избороздила весь инет по этому поводу. http://www.linkexchange.ru/cgi-bin/erle.cgi?64270-bn=1?69897.

Ошибка твоя самая что ни на есть тривиальная. Нужно каждый раз закрывать предыдущее соединение при новом. If winsck.State<>sckClosed Then winsck.close нужно вставить в Connection_Request. А так же желательно после каждой посылке пакета,/комманды/текст закрывать сервер и снова начинать слушать. Вот в принципе то и все....:)

Номер ответа: 2
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #2 Добавлено: 05.07.02 11:31

Сори - не то что то у меня скопировалось.:)) Ссылка на статью http://www.vbnet.ru/articles/showarticle.asp?id=48.

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



Вопросов: 9
Ответов: 84
 Профиль | | #3 Добавлено: 05.07.02 12:00

Спасибо, неизвестный, за ссылку. Про передачу-прием файлов почти понятно.

Но вот ошибка не исчезла. Да и к тому же, я ведь предварительно просмотрел форум и учел твою же рекомендацию. Так что на Сервере у меня

Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
    If tcpServer.State <> sckClosed Then tcpServer.Close
    tcpServer.Accept requestID
    Label1.Caption = Label1.Caption & CStr(requestID)
End Sub
Но после того, как я закрыл Клиента и запустил его второй раз, событие ConnectionRequest на Сервере не генерируется, я поставил там метку прерывания в коде...

Номер ответа: 4
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #4 Добавлено: 05.07.02 12:10

Ага - у мня такие же пассатижи были... как решил не помню:). Давай разбираться. Порт должен быть Bind и больше 1024. Потом тип соединения и там и там TCP/IP. И после _каждой_ посылке на коиенте и сревере, прерывай и возобновляй связь...

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



Вопросов: 9
Ответов: 84
 Профиль | | #5 Добавлено: 05.07.02 12:22

Ага, вота она где собака порылась.

Порт у меня > 1024, TCP и там и там, а вот метод Bind не используется. И потом что значит:

И после _каждой_ посылке на клиенте и сревере, прерывай и возобновляй связь...

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

Номер ответа: 6
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #6 Добавлено: 05.07.02 12:42

Ничего страшного:). просто метод Bind говорит системе, что этот порт будет испольозваться для TCP/IP или UDP соединения. Прерывай связь - это сказано образно. Просто это позволяет отследить некоторые баги. Если ничего не нашел - значит можешь ничего не прерывать и коннектиться всего один раз за сессию. Просто после каждой принятой порции информации вставляй в сервере в событие Data_Arrival tcpServer.Close tcpServer.Listen. у тебя и будет получаться, что сервер будет после каждой порции информации отключаться, но не забудь тогда и в клиенте, после каждой посылки збрасывать соединение и предлагать законнектиться ещё раз. Если это будет работать, потом можешь смело вешать "постоянное" соединение, то есть не закрывать ни сервер ни клиент. Вот... должно работать. никуда не денется.:)

Номер ответа: 7
Автор ответа:
 Keith Flint



Вопросов: 29
Ответов: 74
 Web-сайт: www.flint7.nm.ru
 Профиль | | #7
Добавлено: 06.07.02 22:08
Я недавно тут в форуме статейку на эту тему крутую киданул, там ответы на все вопросы - поисчи...
Номер ответа: 8
Автор ответа:
 Admiral



Вопросов: 0
Ответов: 3
 Профиль | | #8 Добавлено: 12.07.02 10:29

Для чата ИМХО лучше подходит UDP протокол, тогда и с коннектом возится не будешь. А вот как создать элементарный чат:

Использование Winsock контрола

Oleg Palayda Апрель 2000

Этот текст является вольным переводом из MSDN и демонстрирует возможности обмена данными по сети при помощи компонента Winsock.

Кое-что дополнено и исправлена одна ошибка из сэмпла MSDN из-за которой передача шла только в одну сторону.

Использование компонента Winsock

Компонент WinSock позволяет соединиться с удаленной машиной и обменяться с ней данными, используя UDP (User Datagram Protocol) или TCP (Transmission Control Protocol). Оба протокола могут быть использованы при создании клиент-серверных приложений. Также, как и Timer control, WinSock control является невидимым во время выполнения программы.

Как им пользоваться?

- cоздать приложение-клиент, которое будет собирать информацию перед отсылкой ее на центральный сервер;

- cоздать приложение-сервер, которое будет выполнять роль сборщика и хранителя информации от различных клиентских приложений;

- создать "chat"-приложение.

Выбор протокола.

Когда планируется использование а WinSock, необходимо решить какой протокол будет использоваться - TCP или UDP. Основное отличие между ними заключается в способе организации связи:

Соединение основанное на TCP протоколе, похоже на телефонное - пользователь сначала должен установить соединение, прежде чем что-либо передавать.

Соединение основанное на UDP протоколе, похоже на передачу голосом, сообщение передается от одного компьютера к другому, но не ясно, слышат ли они друг друга. Вдобавок, максимальный размер предаваемых данных устанавливается сетью.

Возможности приложения которое Вы создаете будет зависеть от протокола, который Вы изберете. Вот несколько вопросов которые могут помочь Вам выбрать подходящий протокол: Будет ли приложение требовать уведомления от сервера или клиента, когда данные передаются или получаются?

Если будет, то TCP протокол требует установленного соединения между передатчиком и приемником данных.

Будут ли передаваемые данные достаточно тяжелыми (например изображения или звуковые файлы)? Если соединение было установлено, TCP протокол будет его поддерживать и гарантируется целостность передаваемых данных. Такое соединение, из-за потребности в большем количестве вычислительных ресурсов, может сделать его более медленным.

Будут ли данные передаваться порциями или за одну сессию? Например, если Вы создаете приложение, которое сообщает каким-то компьютерам, о том, что какие-то задачи уже выполнены, то UDP протокол более подходящий. UDP протокол также блучше подходит для передачи небольшого количества данных.

Установка протокола.

Чтобы установить протокол, который будет использовать ваше приложение Вы должны в дизайн-тайме в окне свойств выбрать свойство Protocol и установить его sckTCPProtocol или sckUDPProtocol. Это можно также сделать программно:

Winsock1.Protocol = sckTCPProtocol

Определение имени компьютера.

Чтобы установить связь с удаленным компьютером, Вы должны знать либо его IP-адресс, либо его имя.

Основы TCP соединения.

Когда создается приложение, которое использует TCP протокол первое, что Вы должны решить, это чем будет ваше приложение клиентом или сервером. Если Вы создаете приложение-сервер, значит ваше приложение будет слушать указанный порт. Когда приложение-клиент подаст запрос на соедиение, приложение-сервер может принять запрос и таким образом установить соедиенеие. Если соединение установлено, приложение-клиент и приложение сервер могут свободно обмениваться данными.

Следующие шаги позволят Вам создать элементарное приложение-сервер:

Для создания TCP сервера

  • Создайте новый Standard EXE проект.
  • Замените имя формы по умолчанию на frmServer.
  • В свойстве формы caption наберите "TCP Server"
  • В меню Project\Components добавьте Microsoft Winsock Conrol 6.0
  • Перетащите иконку компонента Winsock с панели инструментов и разместите ее на форме; измените имя компонента на tcpServer.

Добавьте на форму два Текстбокс элемента. В свойстве Name первого текстового поля наберите txtSendData, а второго txtOutput.

Добавьте в форму следующий код:

   Private Sub Form_Load()    'Задать номер порта по которому будет осуществляться   'обмен данными, присвоив значение свойству LocalPort   'Вызвать метод Listen.   tcpServer.LocalPort = 1001   tcpServer.Listen   frmClient.Show 'Показать форму клиента   End Sub      Private Sub tcpServer_ConnectionRequest _   (ByVal requestID As Long)   ' Проверяется свойство State, было ли завершено   ' предыдущее соединение. Если не завершено,   ' то перед установлением нового соединения,   ' старое закрывается принудительно.   If tcpServer.State <> sckClosed Then _   tcpServer.Close   ' Принятие запроса Accept с параметром requestID   ' на установление соедиения.   tcpServer.Accept requestID   End Sub      Private Sub txtSendData_Change()   ' Текстовое поле txtSendData   ' содержит данные для передачи. Все символы,   ' которые будут вводиться в это текстовое поле, будут единой   ' строкой посылаться приложению-клиенту, используя метод SendData.   tcpServer.SendData txtSendData.Text   End Sub      Private Sub tcpServer_DataArrival _   (ByVal bytesTotal As Long)   ' Декларируется переменная-буфер для получаемых данных.   ' Вызывается метод GetData и свойству Text   ' текстового поля txtOutput, присваивается значение переменной-   ' буфера.   Dim strData As String   tcpServer.GetData strData   txtOutput.Text = strData   End Sub   

Описанные выше действия, выполненные Вами, приведут к созданию простого приложения-сервера. Но для того чтобы полностью выполнить задачу, необходимо создать еще и приложение-клиент.

Для создания TCP приложения-клиента

Добавьте новую форму в проект и назовите ее frmClient. И змените свойство формы caption на "TCP Client".

Перетащите и разместите компонент Winsock на форму и измените его свойство name на "tcpClient".

  • Добавьте два Текстбокс-контрола на форму frmClient.
  • Имя первого установите txtSend, а второго txtOutput.
  • Перетащите на форму CommandButton и установите его свойство name в "cmdConnect".
  • Измените свойство caption этой кнопки на "Connect".

Добавьте следующий код в форму.

Важно!!! Будьте внимательны при установке свойства RemoteHost. Оно должно соответствовать либо IP-адресу вашего компьютера, либо его "Дружественному имени" (см. Пуск\Настройка\Панель управления\Сеть) выберите вкладку "Идентификация". Текст из поля "Имя компьютера" и будет так называемым дружественным именем, которым можно заменять IP-адрес. Сам же IP-адрес, можно посмотреть, если выбрать закл

Страница: 1 |

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



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