Winsock Problem...

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

Winsock Problem...

Сообщение Evo0s » 31.10.2012 (Ср) 20:00

Решил написать софт для передачи файлов по сети, но та часть программы которая доложная принимать файл принимает только 8 кб хотя та часть которая отправляет, отправляет файл частями (по 3,5 кб). Пересмотрел кучу форумов, сайтов, исходников гору везде принцип одинаковый а у меня не работает. Подскажите что не так?!?!? Мучаюсь хз знает сколько!
P.S в гугл не отправлять был там не одну сотню раз...
Вот код
Отправляющий
Код: Выделить всё

Private Sub Form_Load()
fsend.Connect 127.0.0.1, 55
End Sub

Private Sub fsend_Connect()
Dim dt As String
Open "C:\Имя файла.exe" For Binary As #1
Do While Not EOF(1)
dt = Input(3500, #1)
fsend.SendData dt
dt = ""
Loop
Close #1
End Sub


Принимающий:

Код: Выделить всё
Private Sub fget_DataArrival(ByVal bytesTotal As Long)
fget.GetData dataz, vbString
Open "downloads\имя_файла.exe" For Binary As #1
Put #1, , dataz
Close #1
dataz = ""
End Sub


Отправляет норм, по 3.5 кб, тут всё оки. Но вот принимает только максимум 8 кб.

Очень жду помощи!!!!

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

Re: Winsock Problem...

Сообщение Хакер » 31.10.2012 (Ср) 21:28

1) Срам. Отсутствие Option Explicit. Чревато трудноотлавливаемыми глюками.
2) Срам. Использование для промежуточного буфера String-переменной (и при отправке, и при получении). Это неописуемо плохо. Ты должен использовать байтовый массив.
3) Глупость. Каждый раз внутри DataArrival ты записываешь принятый кусок в начало файла.

Ну, в общем, код очень плох как по стилю, так и по отражению твоего подхода к процессу обдумывания логики работы программы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Evo0s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 31.10.2012 (Ср) 19:48

Re: Winsock Problem...

Сообщение Evo0s » 31.10.2012 (Ср) 22:48

1) Ну хочется сказать что Option Explicit отвечает за то что бы обязательно обьявлять переменны(или же наооборот).
2) Во всех исходник что я видел используется String и там всё работает. Я попробовал... проблема не решилась!
3) Это всё временно, и я знаю что пишется в начало файла. Потом бы я всё это исправил бы.

Вообщем проблема не решаилась. Ждё ещё ответов!
P.S и давайте без этого "Срам" ... "Срам"... это как то не истетично что ли :) и вообще я не дипломированный программист, а учюсь сам и просто пытаюсь разобраться что к чему.

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

Re: Winsock Problem...

Сообщение Хакер » 31.10.2012 (Ср) 22:52

Evo0s писал(а):1) Ну хочется сказать что Option Explicit отвечает за то что бы обязательно обьявлять переменны(или же наооборот).

Ну и? Скажи себе это.

Evo0s писал(а):2) Во всех исходник что я видел используется String и там всё работает. Я попробовал... проблема не решилась!

Проблема планеты в том, что идиотов слишком много. И очень много их в том числе среди людей, формирующих «источники».


Evo0s писал(а):3) Это всё временно, и я знаю что пишется в начало файла. Потом бы я всё это исправил бы.

Что значит «и я знаю». Ты жалуешься, что приходят только 3.5 килобайт вместо 8. Но скорее всего вероятно, что целевой файл имеет размер 3.5 килобайт вместо восьми. А приходят все восемь исправно, но в файл попадают только последние присланные три с половиной.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Evo0s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 31.10.2012 (Ср) 19:48

Re: Winsock Problem...

Сообщение Evo0s » 31.10.2012 (Ср) 23:12

Нашёл причину. Я испольую вместо стандартного Winsock'a одну из его API реализаций, дак вот оказалась проблема в нём (так как со стандарт. винсоком всё ок). Вопрос в следуйщем, может кто нибудь подкинет хороший аналог Winsock, только не Csocket а то он палится АВ.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 31.10.2012 (Ср) 23:19

Хакер писал(а):Что значит «и я знаю». Ты жалуешься, что приходят только 3.5 килобайт вместо 8.

Насколько я понял, приходят как раз 8, а сколько должно непонятно.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Winsock Problem...

Сообщение FireFenix » 31.10.2012 (Ср) 23:35

Evo0s писал(а):Вопрос в следуйщем, может кто нибудь подкинет хороший аналог Winsock

Зачем? Напрямую с WinApi не феншуй? http://msdn.microsoft.com/en-us/library/ms742212%28v=VS.85%29.aspx
Простой поиск по гуглу сразу выдаст кусок на VB6, при должном терпении и умении можно найти и рабочие реализации. Осталось понять как работает и допилить под свои нужды с учётом доков на msdn
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Gasparini
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.09.2012 (Чт) 14:42

Re: Winsock Problem...

Сообщение Gasparini » 01.11.2012 (Чт) 11:27

Хакер писал(а):2) Срам. Использование для промежуточного буфера String-переменной (и при отправке, и при получении). Это неописуемо плохо. Ты должен использовать байтовый массив.

Хакер, пардон, а можно чуть подробнее про это?
Любопытны причины ужаса String в качестве буфера.

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

Re: Winsock Problem...

Сообщение Хакер » 01.11.2012 (Чт) 11:59

Программа-максимум:
http://russian.joelonsoftware.com/Artic ... asics.html
http://www.gnuman.ru/joel/Absoljutnyj_M ... o_Unicode/

Программа-минимум:
viewtopic.php?f=44&t=26149


Как следствия:
  • Если вы используете строку, и при этом у вас каждый символ строки отождествляет каждый исходный байт — то у вас перерасход памяти ровно в два раза.
  • Если вы используете стркоу, и при этом у вас каждый байт строки отождетствляет каждый байт исходных данных — то у вас количество байтов должно быть всегда чётным, плюс образуются потенциально некорректные юникод-символы.
  • При этом вы скорее всего не учитываете постоянные перекодировки ANSI←→Unicode, и в конце-концов не видите тех мест и ситуаций, где ваши данные, упакованные в строку могут исказить.

Может доходить до смешного — файл, передаваемый по сути с одного компьютера на другой, будет искажаться, если на компьютерах для неюникодных программ установлена различный чарсет-по-умолчанию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Evo0s
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 31.10.2012 (Ср) 19:48

Re: Winsock Problem...

Сообщение Evo0s » 01.11.2012 (Чт) 15:04

Qwertiy писал(а):Насколько я понял, приходят как раз 8, а сколько должно непонятно.
именно, приходит максимум 8.
Хакер писал(а):Ну и? Скажи себе это.
я это к тому что Option Explicit не влияет ни на какие глюки как ты вырожаешся.
Хакер писал(а):Что значит «и я знаю». Ты жалуешься, что приходят только 3.5 килобайт вместо 8. Но скорее всего вероятно, что целевой файл имеет размер 3.5 килобайт вместо восьми. А приходят все восемь исправно, но в файл попадают только последние присланные три с половиной.
мне не надо что бы приходило 8, мне надо что бы приходило сколько нужно! И проверить сколько приходит можно обычным MsgBox
FireFenix писал(а):Зачем? Напрямую с WinApi не феншуй? http://msdn.microsoft.com/en-us/library ... 85%29.aspxПростой поиск по гуглу сразу выдаст кусок на VB6, при должном терпении и умении можно найти и рабочие реализации. Осталось понять как работает и допилить под свои нужды с учёт
мне нужен не просто API а весь готовый контролл (User Controll) т.к времени писать контролы у меня нет, вот и прошу может кто нибудь подкинет.

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

Re: Winsock Problem...

Сообщение Хакер » 01.11.2012 (Чт) 16:41

Evo0s писал(а):я это к тому что Option Explicit не влияет ни на какие глюки как ты вырожаешся.

Ох. Мы уже тысячу раз это проходили и видели. Людей, которые только изучают программирование и пока только учатся, с их же слов. И они все ведут себя одинаково. Вряд ли они представляют, насколько одинаково, но уж нам то это заметно хорошо.

И в частности есть две вещи, которые входят в тысячу придурей начинающего программиста.

Первая придурь — убеждённость в том, что код пишется для того, чтобы программа по нему выполнялась. Соответственно, выполнение программы и её поведение считается первичным (по значимости), а код, который привёл к такому поведению — вторичным. Из этой придури вырастает самая страшная уже не придури, а дурь начинающих программистов: программист считает, что если программа работает именно так, как было задумано, то значит код этой программы объявляется годным (рабочим, пригодным, допустимым, хорошим, в конце-концов). В случае, если код написан, а программа не работает — код всегда считается плохим. А в случае если программа работает, и даже работает хорошо и быстро — код считается как минимум хорошим. Это самое опасное заблуждение, ибо мудрый программист холоден в своём мышлении и вообще мало выводов делает о коде. По крайней мере, точно не делает выводов на основании того, как отработала программа по обсуждающемуся коду. Ибо может быть хороший код, безумно хороший код, который здесь и сейчас не работает в силу каких-то третьих причин (зависящих от окружения). И точно также может быть дико отвратительный код, который вдруг оказывается рабочим, но только здесь и сейчас, потому что в своей работе такой код полагается всецело на удачу и на случайные факторы, которые должны сложиться единственным подходящим образом, чтобы такой код хоть как-то смог работать. Поэтому нормальный программист судит о том, хороший код или плохой только на основании самоличного прочтения и анализа кода.

Можно легко вычислить первую придури задав программисту простой вопрос: для чего пишется код? Или «для кого пишется код». Программист, мозг которого поражён придурью первого типа (благо, с опытом в большинстве случаев всё это проходит) искренне убеждён, что код он пишется в буквальном смысле для компилятора, а в широком смысле — для того, чтобы программа работала. Это самое большое заблуждение об исходном коде.

Отношение к коду должно быть ни как к инструкции для компьютера, ни как к инструкции для компилятора. Отношение к коду должно быть как к документу из конструкторской документации. Конструкторская документация делается не для станков, а для людей. В конце-концов, она делается даже только для тех людей, которые по ней будут изготавливать детали и изделия, но и для самих конструкторов, которые будут работать со своей же документацией дальше, развивая идею.

Глупые же программисты пишут код не для себя, не для других программистов, а для компилятора. Отношение к коду как к документации, как к документу (пусть и техническому) у них никогда нет. Поэтому в их коде нельзя встретить комментарии: поскольку комментарии в коде не приводят ни к каким полезным действиям со стороны компьютера, поскольку они не влияют на поведение программы, поскольку компилятор их игнорируют — такие программисты искренне считают, что комментарии не нужны. Они недоумевают: зачем их писать, тратить на них время? Поэтому комментариев в их коде обычно нет.

В моём коде комментарии могут занимать долю в 80 процентов. Я пишу в них даже очевидные для себя на момент написания код вещи, потому что всегда рассчитываю на то, что код будет читать совершенно посторонний человек, даже если твёрдо знаю, что никто больше его читать не будет. Я не самоуверенный, а глупые программисты — чертовски сомоуверенные. Я знаю только то, что я ничего не знаю. Поэтому в коде я отмечаю все моменты, которые должны быть отмечены, даже если есть какая-то уверенность, что я их не забуду.

Это касается и имён переменных, и комментариев, и самого принципа построения кода. Это касается отсутствия магических констант, кстати, да.

Вторая придурь состоит в том, что в то время как компилятор является вашим лучшим другом, люди считают его своим врагом. Эта придурь тесно связана с первой: ибо люди убеждены, что код призван для того, чтобы определять поведение будущей программы, а ведь немаловажная роль кода — контроль логической непротиворечивости замыслов программиста. Вот я точно знаю, что во всей цепчке я, — человек, — самое ненадёжное звено. И поэтому я могу накосячить. И я обязательно накосячу. И поэтому мне жизненно необходим инструмент, который высветит мне все мои косяки. Они обязательно будут, no doubt. Поэтому компилятор мой лучший друг, потому что он строг ко мне, и он как сито просеивает всю мою человеческую глупость и ненадёжность. Нет ничего более радостного, чем ситуация, когда компилятор жалуется на ошибку в вашем коде и открывается его компилировать. Потому что жалуясь, он указывает на плохое место в коде, а если бы он этого не делал, проблема бы обязательно вылезла потом, а найти её было бы целым подвигом. Но дурные программисты в лучших традициях парадокса Даннига—Крюгера убеждены, что они-то намного умнее бездушной машины, и все крики со стороны компилятора воспринимаются не более, чем раздражающими.

Это хорошо видно: достаточно поискать, сколько людей идут в поиск по фразе, а так же сколько людей создают топики на формах, содеражащие фразы «как избавиться от ошибки тра-ля-ля-я» — видно из постановки вопроса. Люди написали код, и теперь они не хотят ни о чём думать и не хотят ничего видеть, кроме успешно работающего собственного кода. Поэтому они хотят избавиться от ошибки; компилятор для них — настырная, мешающая работать (а не помогающая!) сущность.
Сколько людей спрашивают, как избавиться от ошибки? А при этом сколько людей спрашивают, в чём причина и глубинный смысл этой ошибки? Доходит до смешного: даже на этот форум пачками приходили люди, вываливали свой код (который, естественно, не работает — иначе бы не приходили, даже если бы код был отвратительным) и говорили: «ох и ай, у меня ничего не получается, выскакивает ошибка». При этом в 99 случаях из ста эти люди не писали, какая именно ошибка. Всё правильно — люди воспринимают ошибку не как великую помощь им же, а как великую преграду им же. Люди спрашивают, как избавитсья от сообщения об ошибки, а не в чём природа допущенной ими ошибки. Для них написание кода и избавление от сообщения об ошибке — это процесс попадания в сакральный набор требований, нечто вроде соблазнения женщины — им надо попасть в нужную волну, любыми способами, пусть даже случайно, лишь бы сработало. До обдумывания правильности методологии собственных действий и собственного подхода к работе — дело не доходит.


Так вот.
Evo0s писал(а):я это к тому что Option Explicit не влияет ни на какие глюки как ты вырожаешся.

Option Explicit, конечно же, не влияет на глюки. На глюки влияеют ошибки в твоём коде. А Option Explicit влияет на то, будет ли компилятор (как истинный помощник и друг) указывать на ошибки, или он будет (как настоящий предатель) о них умалчивать. Кем надо быть, а вернее, как надо смотреть на мир, чтобы не понимать этой простой вещи — я не знаю.

Ну и по первому: приведённый код просто ужасен. В беспорядочном коде сложно найти ошибки, потому что даже правильные вещи выглядят как неправильные.

Кроме этого, в приведённом коде есть ошибка: каждый полученный кусок пишется в начало файла. Это значит, что если файл отправленный одним куском придёт на другой конец в виде десяти кусков, они будут последовательно перезаписаны в начало целевого файла, и целевой файл будет в 10 раз меньше, чем нужно, и будет содержать последний (в хронологическом порядке) полученный кусок.

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

Тогда причина, по которой ты считаешь, что приходит меньше, чем надо — понятна (это ошибка в твоём коде).

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

Ведь очень часто дело не в коде, а в неверном представлении вопрошающего о том, как оно всё действительно должно быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList