Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinSock в Visual Basic 6.0, утрата соединения 
:(
    Опции темы
manson
Дата 13.11.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



Краткое описание:

На сервере имеется массив винсоков. Первый елемент массива всегда активен, так как отслеживыет новые запросы на соединения. 

На стороне сервера:

Код

Private Sub Form_Load()
W(0).LocalPort = 1777
W(0).Listen           
End Sub


Код

Private Sub W_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Static CnctInd As Long
CnctInd = CnctInd + 1
W(CnctInd).LocalPort = 1777
W(CnctInd).Accept requestID
End Sub


На стороне клиента:

Код

Private Sub Form_Load()
W.RemoteHost = "10.8.136.74"
W.RemotePort = 1777
W.Connect
End Sub


Описание проблемы: 

Запускаю сервер. Подключается клиент №1 - все нормально, связь с сервером установлена. Затем удачно подключается клиент №2, в ходе чего, почему то отключается №1. Если отключить №2, то №1 снова восстанавливает связь с сервером сам.  Таким образом последний подключившийся глушит связь всех предыдущих, пока сам находица в работе.
PM MAIL   Вверх
neic
Дата 13.11.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Попробуй записать это в глобальную переменную.
Код

Static CnctInd As Long


Ещё можно попробовать давать клиенту не порт 1777, а порт 1778.
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 13.11.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



У тебя пересечение по портам, winsock видимо не умеет это обрабатывать...
Попробуй испольбзовать нулевой экземпляр для получения параметров соединения, в которых передавать номер порта для установления рабочего коннекта, а саму работу вести на порте, отличном от 1777...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neic
Дата 14.11.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Akina, как раз то что я писал выше =)
Тут наверн как ICQ делает, все подключаются к 5190, а при подключении он выдаёт адрес и порт куда коннектится.
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 14.11.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neic @  14.11.2008,  01:48 Найти цитируемый пост)
Тут наверн как ICQ делает, все подключаются к 5190, а при подключении он выдаёт адрес и порт куда коннектится.

Во-первых, ICQ выдает только адрес, а порт как был, так и остается 5190 или что ты поставишь в настройках (у меня 443 выставлен, например).
Во-вторых, я говорю немного о другом, всё-таки.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
XOXOJI
Дата 14.11.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 20.9.2008

Репутация: 2
Всего: 2



поступить лучше так...

кидаю кусок кода из своей проги

пояснения... max_online-количество пользователей, которые были когда либо подключены за период работы проги (она глобальная!!!)
Код

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
  For i = 1 To max_online    ' тут проверка на пустые винсоки, с которых отконектились когда-либо и не были заняты
    With Winsock1(i)
      If .State = sckClosed Then 'если свободет, то конектим к нему
        .Accept requestID
        Exit For
      End If
    End With
  Next i
  If i > max_online Then 'это если все заняты, то грузим новый и конектим к нему
    Load Winsock1(max_online + 1)
    With Winsock1(max_online + 1)
      .Protocol = sckTCPProtocol 
      .LocalPort = wsk_port ' тут порт указываешь на который конектиться
      .Accept requestID
    End With
    max_online = max_online + 1
  End If
End If
End Sub


Это сообщение отредактировал(а) XOXOJI - 14.11.2008, 11:11
PM MAIL   Вверх
manson
Дата 14.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



Акина, я примерно понел. Клиент посылает запрос на соединение. На сервере его принемает нулевой елемент массива и в ответ отправляет свободный порт. Получается клиент должен повторно реконектица когда получает инфу с новым портом. Я правильно понел?


PM MAIL   Вверх
Akina
Дата 14.11.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Совершенно верно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
manson
Дата 14.11.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



Акина, я знаю как єто реализовать на стороне клиента. Но вот на стороне сервера возникают непонятки с последовательностью обработки запросов. Как сервер будет различать, пришол ли это первый запрос или запрос уже на соединение по новому порту? Подскажите, пожалуйста, как дополнить мой вышезазначеный код со стороны сервера. Заранее спасибо!

Это сообщение отредактировал(а) manson - 14.11.2008, 14:37
PM MAIL   Вверх
Akina
Дата 14.11.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(manson @  14.11.2008,  15:37 Найти цитируемый пост)
Как сервер будет различать, пришол ли это первый запрос или запрос уже на соединение по новому порту?

А зачем ему это? Пришел запрос на соединение - сервер загружает экземпляр винсока на новый порт и сообщает его клиенту (или сообщает, что пока свободных портов нет, можно курить)... если винсок в течение заданного времени (скажем 5 минут или там полчаса) не получил ни одного запроса, или получил сигнал о завершении сеанса - он самоликвидируется.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
manson
Дата 14.11.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



А да, точно! Спасибо за помощь smile 
PM MAIL   Вверх
manson
Дата 14.11.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



Блин, всеравно не выходит  smile 
сервер загружает экземпляр винсока на новый порт 

Код

Private Sub W_ConnectionRequest(Index As Integer, ByVal requestID As Long) 
    Static CnctInd As Long
    CnctInd = CnctInd + 1
    W(CnctInd).LocalPort = iPort
    W(CnctInd).Listen
    W(0).SendData "PORT" & iPort
    iPort = iPort + 1
End Sub


Где ошибка?
PM MAIL   Вверх
manson
Дата 14.11.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 21.5.2007

Репутация: нет
Всего: нет



И вообще какая разница между LocalPort и RemotePort?
PM MAIL   Вверх
neic
Дата 14.11.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Отредактировано читай ниже

Это сообщение отредактировал(а) neic - 14.11.2008, 23:26
PM MAIL WWW ICQ Skype   Вверх
neic
Дата 14.11.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 839
Регистрация: 28.1.2007

Репутация: нет
Всего: 7



Такс =) ТЫ меня заинтриговал и я сам решил написать сервер-клиент

Вот код сервера:
Код

Public s As Integer
Private Sub Form_Load()
W(0).LocalPort = "7777"
W(0).Listen
End Sub

Private Sub W_ConnectionRequest(Index As Integer, ByVal requestID As Long)
s = s + 1
Load W(s)
W(s).Close
W(s).Accept requestID
W(s).SendData "Привет" & s
End Sub

Private Sub W_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim ComeData As String
W(Index).GetData ComeData
MsgBox ComeData & "---" & Index
End Sub


вот код клиента:
Код

Private Sub Command1_Click()
WS.SendData Text1
End Sub

Private Sub Form_Load()
WS.Close
WS.Connect "localhost", 7777
End Sub

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Dim ComeData As String
WS.GetData ComeData
MsgBox ComeData & "---" & Index
End Sub


Это сообщение отредактировал(а) neic - 14.11.2008, 23:30
PM MAIL WWW ICQ Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.