Сложности с индексированными сокетами

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vfedorov
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 28.07.2005 (Чт) 13:41

Сложности с индексированными сокетами

Сообщение vfedorov » 05.12.2005 (Пн) 2:56

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

Заранее спасибо

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 3:00

Кинь хоть процедуру, в которой ты шлешь данные сразу нескольким клиентам, а то как-то неугадывается ничего :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

vfedorov
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 28.07.2005 (Чт) 13:41

Сообщение vfedorov » 05.12.2005 (Пн) 12:50

Сейчас попытаюсь обьяснить
Есть 2 сокета wsServer и wsClients, причём wsClients - индексированный


Код: Выделить всё
Private Enum ClientConnectStates
  ccsNotConnect = 0
  ccsConnect = 1
End Enum

Private Type WinSockInfo
  ConnectState As ClientConnectStates
  sName As String
End Type

Private m_ws(1 To 8) As WinSockInfo

Private Sub m_wsServer_ConnectionRequest(ByVal requestID As Long)
    MakeNewConnection requestID, m_wsServer.RemoteHostIP, m_wsServer.RemotePort
End Sub

Private Sub MakeNewConnection(ByVal requestID As Long, Optional ByVal RemoteHostIP As String, Optional ByVal RemotePort As Long)
    Dim iSockNum As Long
    iSockNum = GetFreeSocket()
   
    Load wsClients(iSockNum)
    wsClients(iSockNum).accept requestID
    m_ws(iSockNum).ConnectState = ccsConnect
End Sub

Private Function GetFreeSocket()
    GetFreeSocket = 0
    Dim iNum As Long
    For iNum = 1 To 8
        If m_ws(iNum).ConnectState = ccsNotConnect Then Exit For
    Next iNum
   
    If iNum > 8 Then iNum = 0
    GetFreeSocket = iNum
End Function



Так подключается новый клиент


Код: Выделить всё
privete syb SendMessageToAll(sMessage as string)
    dim iClientNum as integer
    for iClientNum = 1 to 8
        if m_ws.ConnectState = cssConnect then wsClients(iClientNum).SendData sMessage
    Next iClientNum
end sub


Так я рассылаю данные всем клиентам, и при этом получает их только последний

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.12.2005 (Пн) 14:29

Что-то это мне напоминает...
Lasciate ogni speranza, voi ch'entrate.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.12.2005 (Пн) 15:08

Код: Выделить всё
if m_ws.ConnectState = cssConnect then wsClients(iClientNum).SendData sMessage
А ты попробуй
Код: Выделить всё
else debug.print m_ws.ConnectState
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Сложности с индексированными сокетами

Сообщение tyomitch » 05.12.2005 (Пн) 22:03

vfedorov писал(а):Проблема такая: использую на сервере индексрованный сокет для подключения клиентов. Если слать информацию клиентам по отдельности - все нормально, а если в одной процедуре сразу нескольким - то получает данные только последний.
Подскажите - в чём тут проблема

Заранее спасибо

Как ни странно, похоже на баг в винсоке :-)
Попробуй поставить на VS сервиспак поновее.
Изображение

skord
Китаец
Китаец
 
Сообщения: 572
Зарегистрирован: 14.10.2004 (Чт) 15:36
Откуда: Иркутск

Сообщение skord » 06.12.2005 (Вт) 14:48

Вот, может поможет
http://bbs.vbstreets.ru/viewtopic.php?t=19698

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 14:52

Тут DaSharm выкладывал где-то свой аналог Винсока(ТЯГА-Сервер) ,там всё проще было.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Сообщение JohnK » 06.12.2005 (Вт) 16:20

Да это определенно глюк! И помогает небольшая задержка после отправки каждому клиенту, синхронизация типа "посылка-подтверждение" помогает вылечиться от этой болезни и подавно 8)
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 186

    TopList