Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Отправка данных Добавлено: 11.02.04 17:50  

Автор вопроса:  KAM | ICQ: 190197618 

Вот сталкиваюсь с такой проблемой: нужно отправить строку клиенту (или серверу, не важно), затем отправить следующу, т.е. соблюдать порядок. Когда я делаю так:

ws.SendData "Раз" 'Использую винсок

ws.SendData "Два"

То через раз получаю "РазДва".

Как этого избежать?

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #1 Добавлено: 11.02.04 18:49

Попробовал как ты. Действительно соединяет строки. Но ты между SendDataми постави Doevent и всё в поряде.

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 12.02.04 19:15

Сокет - вещь потоковая и если хочешь, чтобы он не отправлял строки в пакете слитно, разделяй их сам (например chr(0)). Как программно вызвать конец пакета, я не знаю, но, наверно, можно закрыть, а потом снова открыть сокет.

Ответить

Номер ответа: 3
Автор ответа:
 KAM



ICQ: 190197618 

Вопросов: 25
Ответов: 97
 Профиль | | #3 Добавлено: 12.02.04 19:45

2Dimm: Это как? Приведи пример, плиз

Ответить

Номер ответа: 4
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #4
Добавлено: 12.02.04 20:20

По моему, проблемка в буфере приема при юзании recv. Дело в том, что данные приходят практически одновременно, и recv читает уже всех их из сокета (на сервере). Выходит, вы не там баг ищите, нужно в сервере искать. Проблема не решена, я не могу её решить тоже. Кстати, истинность моего мнения доказывает то, что когда кучу раз отсылать таким способом, то все же приходит время, когда строки приходят в первоначальном виде (типа, розрыв пакета).

Ответить

Номер ответа: 5
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #5 Добавлено: 13.02.04 01:18

По-моему дело не в этом...

Дело в том, что протокол TCP гарантирует доставление данных и сохранение их последовательности, но НЕ ГАРАНТИРУЕТ сохранение целостности пакетов...

Вот UDP гарантирует, что пакеты не сольются... НО не гарантирует доставку данных и сохранение последовательности пакетов...

Если пишешь, используюя UDP, надо передавать номер пакета самостоятельно и при приеме проверять последовательность пакетов, если пакет не дошел - запросить его снова...

При программировании TCP просто надо использовать разделители, например, как это сделано в pop3 и smtp, в конце каждого блока данных стоит CRLF... А сервер при приеме данных все скапливает в буфер и потом разбивает данные на определенные куски...

Ответить

Номер ответа: 6
Автор ответа:
 KAM



ICQ: 190197618 

Вопросов: 25
Ответов: 97
 Профиль | | #6 Добавлено: 13.02.04 20:02

2Dimm:

Просто ставить DoEvents не помогает.

2All:

Я вроде подобрал альтернативный способ (походу страшно примитивный, но мне помогает) для "тяги" (может и для винскоа)

Public sndState As Boolean 'Два состояния: отправлено (True) и отправляется (Flase)

Public Sub SendSomething()

'Отправляю содержимое листбокса:

For i=0 to Drive1.ListCount - 1

T1.SendData Drive1.List(i)

Do While sndState = False

DoEvents

Loop

Next i

End Sub

Private Sub Form_Load()

sndState = False

End Sub

Private Sub T1_StateChange(state As StateVars)

ElseIf state = DataSendComplete Then

sndState = True

ElseIf state = DataSending Then

sndState = False

End If

End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам