При передаче/получении данных через WinSock теряются данные.

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

При передаче/получении данных через WinSock теряются данные.

Сообщение Swift » 29.06.2008 (Вс) 14:51

Доброе время суток.

Необходимо с одной машины на другую отправить файл. Размер файла - 10КБ. Считываю весь текст файла в текстовую переменную

Open "c:\1.txt" For Binary As #1
Ps1 = Input(FileLen(c:\1.txt), #1)
Close #1


После чего передаю её через WinSock на другую машину

SendData Ps1

Public Sub SendData(S$)
On Error Resume Next
Sock.SendData S & Chr(0)
On Error Resume Next
End Sub


И записываю файл

Dim S As String
Sock.GetData S
Open ZPath & "Temp\Users.imp" For Append As #1
Print #1, S;
Close #1


В итоге - имею всего 8КБ. Не хватает.... :(

Есть ли какое-то ограничение на размер посылаемых/принимаемых данных? Или что делать впринципе?

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 29.06.2008 (Вс) 15:48

дело в том что данные передаются так сказать порциями, посему необходимо учитывать это
например собирать всё в переменную, и при получении последнего куска записывать эту переменную в файл

Swift
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 15.11.2007 (Чт) 10:39

Сообщение Swift » 29.06.2008 (Вс) 16:39

Я пытался делать отправку по 2048 байт. И записывал все это в файл в режиме append - но по итогу выяснилось, что начало есть, конец есть, а в середине каких-то сегментов (а может кусков сегментов?) не хватает. Это никуда не годится :(

Как можно решить эту проблемму?

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 29.06.2008 (Вс) 19:01

покажи процедуры записи в файл и событие winsock_dataArvial

зы. не проще ли при получении данных дописывать их в строку и по окончании сеанса писать целую строку? тем более, что файлик маленький

Swift
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 15.11.2007 (Чт) 10:39

Сообщение Swift » 29.06.2008 (Вс) 19:07

Показать весь пример не могу, т.к. там процедура здоровая и не по теме.

Не проще писать в строку. Опять же вопрос - всередине строки могут не оказаться сегменты (потеряются). Файлик на 10КБ - тестовый. Мне вообще-то надо на 300-500КБ передавать. А там - пойди проверь - все дошло или нет :(

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 29.06.2008 (Вс) 19:25

я когда делал так:
разбивал файлик на части, скажем на 2Кб
и посылал вот таким способом: №части, разделитель,инфа

а на другой стороне ловил пакеты и анализировал, и если это последняя часть, то собирал воедино

так кстати, можно "попросить" переслать испорченный пакет еще раз

а вобще процедура у меня была такой:

сервер посылает клиенту кол. частей
клиент начинает в цикле "просить" части, сервер ему их пересылает
в конце клиент завершает сесию

Swift
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 15.11.2007 (Чт) 10:39

Сообщение Swift » 29.06.2008 (Вс) 19:35

Спасибо.
Я в принципе тоже решил так сделать, но начал теряться во всём этом взаимообмене подтверждениями, дубликатами и плюнул. Решил вопрос иначе :(


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

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

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

    TopList  
cron