winsock-пакеты

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

winsock-пакеты

Сообщение noob4ever » 11.09.2007 (Вт) 14:23

В общем пытаюсь отправить пакеты:
Server(IntMax).SendData "100"
Server(IntMax).SendData "200"


в клиенте принимаются:
tcpclient.GetData getdatapocket
if getdatapocket="100" then ...
if getdatapocket="200" then ...

На клиент приходит сразу 2 пакета одновременно "100200"
Без понятия как сделать чтобы они прихадили поочереди?

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

Сообщение tyomitch » 11.09.2007 (Вт) 14:42

Придумать протокол и использовать его.
TCP передаёт поток байтов, а не пакеты.
Нужны пакеты, юзай UDP. Тогда потеряется гарантия доставки.
Выбирай.
Изображение

Dimon007
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 17
Зарегистрирован: 13.06.2007 (Ср) 21:38

Сообщение Dimon007 » 11.09.2007 (Вт) 18:05

Поставить паузу.
Код: Выделить всё
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Pause(PauseTime As Long)
    Dim TM As Long
    TM = GetTickCount
    Do
     If GetTickCount - TM > PauseTime Then
        Exit Do
     End If
    Sleep 2
    DoEvents
Loop
End Sub

private sub command1_click()
    winsock1.senddata ssss
    call pause(150)
    winsock1.senddata ssss
end sub
У каждой хорошей статьи дохода есть свой плохой номер в УК

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 11.09.2007 (Вт) 18:33

Dimon007 писал(а):Поставить паузу.
Код: Выделить всё
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Pause(PauseTime As Long)
    Dim TM As Long
    TM = GetTickCount
    Do
     If GetTickCount - TM > PauseTime Then
        Exit Do
     End If
    Sleep 2
    DoEvents
Loop
End Sub

private sub command1_click()
    winsock1.senddata ssss
    call pause(150)
    winsock1.senddata ssss
end sub

Сомневаюсь, что это правильно решение.
Правильное подсказал tyomitch
label:
cli
jmp label

Dimon007
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 17
Зарегистрирован: 13.06.2007 (Ср) 21:38

Сообщение Dimon007 » 11.09.2007 (Вт) 19:29

Зато не придётся выбирать между "тем" и "тем", и всё работает
У каждой хорошей статьи дохода есть свой плохой номер в УК

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 11.09.2007 (Вт) 20:49

Dimon007 писал(а):Зато не придётся выбирать между "тем" и "тем", и всё работает
Это "все работает" ровно до тех пор, пока на клиентской машине параллельно с прогой-клиентом не запустят какое-либо ресурсоемкой приложение, которое не даст клиенту вовремя отработать первый пакет, в результате чего в буфере окажется опять "100200".

Тёмыч подсказал написать протокол. Наиболее простым вариантом будет перемежение данных какими-либо "служебными" символами.
При этом клиент все приходящие данные скидывает в некий буфер, и просматривает его на наличие этих "служебных" символов. Данные "от звонка до звонка" рассматриваются как пакет.
Символ, естественно нужно выбирать из числа тех, что никогда не встретятся в самих данных..
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.09.2007 (Вт) 21:23

iGrok
Да что ж вам всем охота символ-делитель делать, и искать его в данных, вместо того чтобы явно указать длину данных? :roll:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

noob4ever
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 117
Зарегистрирован: 05.01.2006 (Чт) 0:58

Сообщение noob4ever » 12.09.2007 (Ср) 10:29

спасиба.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 13.09.2007 (Чт) 22:37

Хакер писал(а):iGrok
Да что ж вам всем охота символ-делитель делать, и искать его в данных, вместо того чтобы явно указать длину данных? :roll:

Хм.. Сделать фиксированную "длину пакета"? Тоже вариант..
Причем в данном случае даже лучше.

Просто я такую гадость писал, когда развлекался с чем-то типа мессенджера.. В итоге у меня тудым-судым кидались строки, а там уж ни о какой фиксированной длине речи не шло...
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 93

    TopList