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

Поиск:

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


Новичок



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

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



короче я проверил и отследил такое: клиент посылает данные на сервер - тут все норм. проблема оказалась в другом - сервер неправильно отсылает данные клиенту, отсылая их только одному клиенту. к примеру, подключено три клиента и он трижды шлет одному из них данные (тобишь неправильно распределяет).

Код

For i = 1 To iNumb
    W(i).SendData  txtPack.Text
Next


в этом случае поче му то получает данные только последний.

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


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


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

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



Цитата(manson @  15.11.2008,  19:00 Найти цитируемый пост)
подключено три клиента и он трижды шлет одному из них данные (тобишь неправильно распределяет).

А где ты закрываешь сеанс связи с первым клиентом??? 


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

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


Опытный
**


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

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



Код

Private Sub Command1_Click()
For i = 1 To 2
    W(i).SendData "Работает"
Next
End Sub


И у меня этот код работает. Не знаю, что там у тебя.
Повторяю коды:
Код

'сервер
Public s As Integer

Private Sub Command1_Click()
For i = 1 To 2
    W(i).SendData "Работает"
Next
End Sub

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
Text1 = ComeData
End Sub


Добавлено через 1 минуту и 53 секунды
Код

For i = 1 To 2
    W(i).SendData "Работает"
Next


Где 2, это кол-во подключённых клиентов.
PM MAIL WWW ICQ Skype   Вверх
XOXOJI
Дата 16.11.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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
тут немного не эргономично сделано... если кто-то из клиентов отконектился... то контрол будет пустовать, а при подсоединении нового будет грузиться еще один контрол...

у меня в примере это предусмотрено
PM MAIL   Вверх
manson
Дата 16.11.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Акина, я нигде связь не закрываю! А зачем это нужно делать?
neic, везет тебе. У меня почему то шлет все последнему. По твоему коду это 2 винсок.

PM MAIL   Вверх
neic
Дата 16.11.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(XOXOJI @  16.11.2008,  11:26 Найти цитируемый пост)
тут немного не эргономично сделано... если кто-то из клиентов отконектился... то контрол будет пустовать, а при подсоединении нового будет грузиться еще один контрол...

у меня в примере это предусмотрено 

Я писал и не такие клиенты. Для примера достаточно того, что я написал. Если автор хочет чтобы сделали за него, то за $ можно и весь проект написать.

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


Новичок



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

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



Автор не хочет! Сам не тупой и умею загружать, выгружать и находить не занятые. Проблема в том, что почему то инфа шлется только на один из винсоков, хотя код у меня правильный.
PM MAIL   Вверх
Akina
Дата 16.11.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(manson @  16.11.2008,  13:12 Найти цитируемый пост)
я нигде связь не закрываю! А зачем это нужно делать?

Вот именно затем и следует закрывать сеанс, чтобы ответ получал нужный клиент, а не первый из незакрытых.


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

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


Новичок



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

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



Акина, тогда скажи, пожалуйста, в каком месте надо закрывать (на стороне сервера или клиента) и каким способом.
Код

For i = 1 To iNumb
    W(i).SendData  txtPack.Text : W(i).Close
Next


Примерно так?
PM MAIL   Вверх
Akina
Дата 16.11.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Конечно... Ты открыл сокет и слушаешь. Как только пришел запрос на соединение - ты формируешь сокет для работы по этому запросу, отправляешь параметры для работы (номер порта) и закрываешь соединение, продолжая слушать, не постучится ли кто-нить ещё.
Кстати, неплохо бы от клиента получать какие-нить его данные (например SID текущей учётной записи) - чтобы ... впрочем, придумай сам и тогда уж реши, надо оно тебе или нет.


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

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


Опытный
**


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

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



Цитата(Akina @  16.11.2008,  23:21 Найти цитируемый пост)
Кстати, неплохо бы от клиента получать какие-нить его данные (например SID текущей учётной записи)

Я так понял, чтобы вести лог событий...т.е. заданые настройки, сохранённая инфа и т.д.?

Интересно. Тогда можно будет закрывать каждый клиент => освободит от нужд пинговать клиент, чтобы проверить "живы" ли клиенты.

Т.е. 1запрос=1винскосу, который после посылки сообщения отключается, но при этом каждый раз придётся подключаться к серверу.

или я что-то не так понял.

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


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


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

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



Цитата(neic @  17.11.2008,  01:06 Найти цитируемый пост)
освободит от нужд пинговать клиент, чтобы проверить "живы" ли клиенты.

Серверу должно быть глубоко плевать, живы клиенты или нет. Это ИХ забота сообщать серверу что они живы.
Цитата(neic @  17.11.2008,  01:06 Найти цитируемый пост)
Т.е. 1запрос=1винскосу, который после посылки сообщения отключается, но при этом каждый раз придётся подключаться к серверу.

Что за ...? Не путай начальное подключение для получения параметров соединения (с нулевым сокеном) и сеанс связи с переданным на клиента сокетом.


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

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


Шустрый
*


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

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



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

Option Explicit
Public s As Integer

Private Sub Command1_Click()
Dim i As Integer
For i = 1 To s
  w(i).SendData "Работает"
Next i
End Sub

Private Sub Form_Load()
w(0).LocalPort = 7777
w(0).Listen
End Sub

Private Sub w_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
  w(0).Accept requestID
  w(0).SendData "номер нового порта"
  w(0).Close
  w(0).Listen
  s = s + 1
  Load w(s)
  w(s).LocalPort = 7778 ' номер нового порта
Else
  w(Index).Accept requestID
End If
End Sub

клиент
Код

Private Sub Command1_Click()
W.RemoteHostIP = "ip"
W.RemotePort = 7777
W.Connect
End Sub

Private Sub W_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Dim port_num As Integer
W.GetData data, bytesTotal
If Left$(data, 3) = "IP=" Then
  port_num = Val(Right$(data, Len(data) - 3))
  W.Close
  W.RemotePort = port_num
  W.Connect
End If

End Sub

PM MAIL   Вверх
neic
Дата 17.11.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(XOXOJI @  17.11.2008,  05:25 Найти цитируемый пост)
Private Sub w_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
  w(0).Accept requestID
  w(0).SendData "номер нового порта"
  w(0).Close
  w(0).Listen
  s = s + 1
  Load w(s)
  w(s).LocalPort = 7778 ' номер нового порта
Else
  w(Index).Accept requestID
End If
End Sub

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

Учитывая что строчка:
Код

w(0).Listen


стоит в событии:
Код

ConnectionRequest


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

Мы уже с акиной разобрали, что порты тут не причём.

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


Шустрый
*


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

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



гдето я утра с просони за тупил, сорри  smile 
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

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

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

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

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


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

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


 




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


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

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