'Склеивание отсылаемых сообщений WinSocket'

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

'Склеивание отсылаемых сообщений WinSocket'

Сообщение visualman » 28.10.2005 (Пт) 9:03

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

Код: Выделить всё

Private Sub SendJobs(ByVal Request As String, ByVal DataType As Integer, ByVal sckIndex As Integer)
    Dim Rs As ADODB.Recordset
    Dim SQL As String
    Dim i As Integer
    Dim CurrentAbonent As UserInfo
   
    Set Rs = New ADODB.Recordset
   
    Select Case DataType
        Case 0
            If Request = "" Then
                SQL = "Select * from PhoneBase"
            Else
                SQL = "Select * from PhoneBase WHERE Address LIKE '%" & Request & "%' or Podrazdelenie LIKE '%" & Request & "%' or Slujba LIKE '%" & Request & "%' or Otdel LIKE '%" & Request & "%' or Sector LIKE '%" & Request & "%' or Doljnost LIKE '%" & Request & "%' or Abonent LIKE '%" & Request & "%' or SLO LIKE '%" & Request & "%' or GorTel LIKE '%" & Request & "%' or Vnutrenni LIKE '%" & Request & "%'"
            End If
        Case 1: SQL = "Select * from PhoneBase WHERE Address LIKE '%" & Request & "%'"
        Case 2: SQL = "Select * from PhoneBase WHERE Podrazdelenie LIKE '%" & Request & "%'"
        Case 3: SQL = "Select * from PhoneBase WHERE Slujba LIKE '%" & Request & "%'"
        Case 4: SQL = "Select * from PhoneBase WHERE Otdel LIKE '%" & Request & "%'"
        Case 5: SQL = "Select * from PhoneBase WHERE Sector LIKE '%" & Request & "%'"
        Case 6: SQL = "Select * from PhoneBase WHERE Doljnost LIKE '%" & Request & "%'"
        Case 7: SQL = "Select * from PhoneBase WHERE Abonent LIKE '%" & Request & "%'"
        Case 8: SQL = "Select * from PhoneBase WHERE SLO LIKE '%" & Request & "%'"
        Case 9: SQL = "Select * from PhoneBase WHERE GorTel LIKE '%" & Request & "%'"
        Case 10: SQL = "Select * from PhoneBase WHERE Vnutrenni LIKE '%" & Request & "%'"
    End Select

    Rs.Open SQL, CN, adOpenKeyset, adLockReadOnly
   
    sckServer(sckIndex).SendData "Items|" & Rs.RecordCount
    DoEvents
   
    For i = 1 To Rs.RecordCount
         With CurrentAbonent
             .Address = Rs!Address & DataSep
             .Podrazdelenie = Rs!Podrazdelenie & DataSep
             .Slujba = Rs!Slujba & DataSep
             .Otdel = Rs!Otdel & DataSep
             .Sector = Rs!Sector & DataSep
             .Doljnost = Rs!Doljnost & DataSep
             .Abonent = Rs!Abonent & DataSep
             .SLO = Rs!SLO & DataSep
             .GorTel = Rs!GorTel & DataSep
             .Vnutrenni = Rs!Vnutrenni
             
            sckServer(sckIndex).SendData "Joblst" & .Address & .Podrazdelenie & .Slujba & .Otdel & .Sector & .Doljnost & .Abonent & .SLO & .GorTel & .Vnutrenni
            DoEvents
            Rs.MoveNext
        End With
    Next i

   Rs.Close
   Set Rs = Nothing
End Sub


Строка : sckServer(sckIndex).SendData "Joblst" & .Address & .Podrazdelenie & .Slujba & .Otdel & .Sector & .Doljnost & .Abonent & .SLO & .GorTel & .Vnutrenni

отсылает готовую строку клиенту. sckServer(sckIndex) - массив соккетов.

Из кода видно, что посылка сообщений производится для каждой строки рекордсета, НО !!! Сообщения слепляются и отправляются все разом нарушая структуру строки и клиентское приложение не правильно бъёт строки функцией Split

Вот пример получаемых клиентом данных:

JoblstËàâðóøèíñêèé ïåðåóëîê|Äèñïåò÷åðñêèå|Äèñïåò÷åðñêàÿ èíæåíåðíîãî êîðïóñà|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|120|953-54-86; 957-07-10|710JoblstËàâðóøèíñêèé ïåðåóëîê|Äèñïåò÷åðñêèå|Äèñïåò÷åðñêàÿ ïîæàðîòóøåíèÿ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|118|ÍÅ ÇÀÄÀÍÎ|ÍÅÒJoblstËàâðóøèíñêèé ïåðåóëîê|Äèñïåò÷åðñêèå|Äèñïåò÷åðñêàÿ àâòîìàòèêè êëèìàòà, ðàäèîïîèñêà|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|123|957-07-07|707JoblstËàâðóøèíñêèé ïåðåóëîê|Äèñïåò÷åðñêèå|Äèñïåò÷åðñêàÿ äåïîçèòàðèÿ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|ÍÅ ÇÀÄÀÍÎ|410|957-07-90|790

(за шрифт sorry, чё то он не становится нормальным)

DataSep - это переменная, хранящая делимитер '|'

Фишка в чём: каждое сообщение начинается с 'Joblst' и если присмотреться к возвращённому значению, то видно, что 'Joblst' присутствует и в других местах строки, хотя соккет должен был отправлять каждую строку отдельным потоком. Функфия DoEvents иногда спасает (сам не понимаю, почему)

ПОЧЕМУ СКЛЕИВАЮТСЯ СООБЩЕНИЯ?????
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 9:35

ПОЧЕМУ СКЛЕИВАЮТСЯ СООБЩЕНИЯ?????

Потому что после отправки блока данных нужно дожидаться события Winsock1_SendComplete(), а потом отправлять следующий.
А вообще, твой способ отправки довольно громоздок и крив. Не проще ли отправить сам рекордсет:

Код: Выделить всё
Dim st As New ADODB.Stream
st.Type = adTypeBinary
Rs.Save st, adPersistADTG
st.Position = 0
sckServer(sckIndex).SendData st.Read
st.Close
Лучший способ понять что-то самому — объяснить это другому.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 28.10.2005 (Пт) 9:51

нормальный способ. Струкруру CurrentAbonent в расчёт не бери, она временная
Последний раз редактировалось visualman 28.10.2005 (Пт) 9:54, всего редактировалось 1 раз.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 9:53

А траффик и страдающее быстродействие?
Лучший способ понять что-то самому — объяснить это другому.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 28.10.2005 (Пт) 9:55

тут гигабитная сеть, за трафик мы не паримся ))

Софтина дальше нашей организации не уйдёт
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 10:23

А зачем тогда извращаться с винсоком? Можно открывать рекордсеты клиентом.
Лучший способ понять что-то самому — объяснить это другому.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 28.10.2005 (Пт) 10:45

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 10:58

Вобщем, хозяин - барин. Разрешите откланяться, надеюсь, что помог.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение tyomitch » 28.10.2005 (Пт) 15:47

Antonariy писал(а):
ПОЧЕМУ СКЛЕИВАЮТСЯ СООБЩЕНИЯ?????

Потому что после отправки блока данных нужно дожидаться события Winsock1_SendComplete(), а потом отправлять следующий.

А проще и быстрее эти блоки чем-нибудь разделять, а в получателе дробить.
Изображение

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 31.10.2005 (Пн) 9:51

ГЫ ))) Видимо ты плохо топик читал )) Они и так разделяются

DataSep - это переменная, хранящая делимитер '|'
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

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

Сообщение tyomitch » 31.10.2005 (Пн) 10:04

Сокет не посылает каждое сообщение отдельным потоком. Он посылает все сообщения одним потоком.

А дробить принимаемые данные тебе надо не по "|", а по "'Joblst", раз разделитель сообщений у тебя такой.
Изображение


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

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

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

    TopList