WinSock без OCX'а (интересный глюк)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

WinSock без OCX'а (интересный глюк)

Сообщение XairOn » 10.11.2004 (Ср) 16:05

Доброго времени суток, обращаюсь я к вам с довольно интересной (на мой взгляд) проблемой. Вобщем однажды передо мной встала
задача: написать прогу использующую все возможности WinSock, но не используя самого контрола, потому что, согласитесь, таскать за собой OCX, который весит 120 кило. когда сама прога занимает не больше 50 кБ не очень-то приятно. Т.е. мне нужно было использовать стандартные функции Windows'а, но к сожалению пока что я не умею ими хорошо пользоваться, поэтому я скачал с инета (не помню откуда именно..., но ссылку на этом форуме получил) готовый исходник - это простенький чат, который содержит в себе один Модуль и один Модуль Класса (Class Module), запускаю этот чат - всё работает отлично, но... есть одно "но", сокет реализованный в данной проге, почему-то отправляет только данные типа String, а мне нужно к примеру Byte передавать, вобщем, что-то я уже расписался тут, кому не лень и кoму интересно посмотрите этот сорс. Я его для наглядности чуть-чуть изменил, но изменения коснулись лишь формы, модули я вообще не трогал. Короче глюк заключается в том, что когда пытаешься передать от клиента серверу число 3 или любое другое, то до сервера доходит что-то типа 103 или 45 вобщем что угодно, кроме переданного числа (рандомайзер своеобразный получается :-) ). Вобщем качайте, запускайте и следите за окошком Immediate (обратите особое внимание на строки А=... и В=..., число А-это число которое мы передаем, а число В-это ты что мы получаем). На последок одна просьба: не предлагайте пожалуйста передавать числа, как строки, так не пойдет.
Вложения
source.rar
Заметьте - глюк на строковый типа почему-то не распространяется... интересно :-)
(21.69 Кб) Скачиваний: 32

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: WinSock без OCX'а (интересный глюк)

Сообщение codemaster » 10.11.2004 (Ср) 17:48

XairOn писал(а):, но... есть одно "но", сокет реализованный в данной проге, почему-то отправляет только данные типа String, а мне нужно к примеру Byte передавать,.



Помоему что то ты не так делаеш!

для начала Какая OS на компе?

Посмотри внимательно
Sub SendData(Data As Variant) CSocketMaster
он вполне нормально понимает Byte.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 10.11.2004 (Ср) 18:46

OS Win XP SP1... но я думаю дело не в этом, да я согласен он Byte и другие типы понимает, но при передачи что-то не то с ними делает, в первый раз когда пытаешься передать число, всё срабатывает нормально - это всегда а вот потом, как получится раз на раз не приходится, вобщем что-бы ошибку заметить нужно несколько раз разные числа попробовать отправлять и примерно на 5-7 (а может и раньше) ошибчка даст о себе знать.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.11.2004 (Ср) 18:47

Формируй вручную CRC32 и проверяй целостность пакетов. Хотя... уж лучше бы ты с собой OCX таскал :)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 10.11.2004 (Ср) 21:00

Если тебе Byte слать .... переводи через CHR$ и шли, что тебе мешает:)

И вот что бывает менее геморойно тоскать контрол, если это у тебя прога для сети, то юзеру будет приятнее если у него инфа всёже полностью передаваться будет а не огрызками:)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 11.11.2004 (Чт) 13:51

SSecurity писал(а):Если тебе Byte слать .... переводи через CHR$ и шли, что тебе мешает:)


Понимаешь, через CHR$ я не хочу потому, что мне нужно передавать несколько переменных одни из которых числа, а другие строки, так вот не знаю как в других языках, но в VB строки передаются всегда как одна строка, т.е. если я попытаюсь передать число переделанное в строку, а птом ещё одно число, а потом нужную мне строку, то получится, что всё в одной строке отправится. а это не есть гуд...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 11.11.2004 (Чт) 15:42

Введи разделители какие-нить, что-то вроде:
"10|30|&HF|Какая-то строка|"
Потом парсь их и все :wink:..

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 11.11.2004 (Чт) 19:42

Это тоже не канает, я об этом думал, дело в том, что заранее не известно сколько переменных будет принято, т.е. иногда их будет 2, а иногда 5 так, что... нужен другой способ :-(

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 11.11.2004 (Чт) 21:09

Я бы ... в таком случае обратился к потусторонней силе -
И после разделителя втыкнул бы системный символ например
"|:Число1|:Число2| Какая-то строка|..."
(пустой символ там где не числа...)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 11.11.2004 (Чт) 21:20

На тебя не угодишь :lol:..

Вариант первый:
ты первым делом посылаешь кол-во переменных, а потом сами переменные (например, вот так: "5|A|Cxcvsd|&H31|123|456")

Вариант второй (и последний):
Ты берешь мноюписную ActiveX DLL из аттача, пользуешься ей, но никому не говоришь, что она у тебя есть, я ее для фирмы писал :lol:

ЗЫ: Вариант третий (да, 2-ой был не совсем последним):
Забиваешь на все это, и идешь гулять :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Попытка #4 8)

Сообщение xenomorph » 13.11.2004 (Сб) 0:55

Вариант четвёртый и ИМХО наиболее оптимальный 8].

Любой пакет передаёться формулой: [длинна пакета х 10 байт + сколько надо Space-ов] + [сам пакет]

Если надо - бери 100 байт для заголовка - это пакетик в пару террабайт, навскидку ;).

в оригинале:
ws_Main.SendData Left(Trim(Str(Len(s_Data)) + 10) & " ", 10) & s_Data

Реверс функция сложнее:

'===== покусано =============================
'Getting Data
Public Sub DataArrival()

Dim l_PSize As Long
Dim s_Output As String

ws_Main.PeekData s_MainBuf

Start:

'Exiting if it is less than a header size
If Len(s_MainBuf) < l_PHSize Then Exit Sub

'Getting Packet Size out of the Header
l_PSize = CLng(Trim(Left(s_MainBuf, l_PHSize)))

Select Case Len(s_MainBuf)

Case Is >= l_PSize 'Packet is less than Data in Buffer

'Getting Packet Data
s_Output = Mid(s_MainBuf, l_PHSize + 1, l_PSize - l_PHSize)

'Clearing Data in Main Buffer
s_MainBuf = Right(s_MainBuf, Len(s_MainBuf) - l_PSize) ' 'Mid(s_MainBuf, l_PSize, Len(s_MainBuf) - l_PSize)

'Parcing Data
RaiseEvent GotPacket(s_Output)

'Recursing
GoTo Start

Case Is > l_PSize

Exit Sub 'Waiting for the rest of the Packet

End Select

End Sub
'===== покусано =============================

И оооочень внимательно рассматривай КАК в классе вырезаються такие пакеты 8).

Этот класс хватает инстансы при инициализации:

'===== погрызено ============================
Option Explicit

Dim ws_Main As Winsock
Dim s_MainBuf As String

Private Const l_PHSize = 10 'Packet Header Size

Public Event GotPacket(s_PData As String)

'Parcing Instance
Public Sub Inst(ByRef ws_Socket As Winsock)

Set ws_Main = ws_Socket

End Sub
'===== погрызено ============================

Но это не обязательно, делай так:

ByRef WS As WinAPISocket ' 8)))

Класс PacketDeployment приложен.

Он разделит твои переменные 8).

Он с ивентом. Как только к тебе прийдёт один пакет -
сработает ивент 8). В какчестве параметра - будут чистые данные.

Зная что сделано под винсок. Просто замени на соотв. фун=Х=цию
по приёму и передаче данных.

(Я не говорил что будет легко 8) !)

--
Когда я в форуме вижу "Вот мене вп?*:о таскать за собой ОСХ !!!"
В голову лезут по очереди:

Гомер,
Парнокопытные лошади,
Дерево,
Одиссей приколист,
Спаленая город,
Маленький размер,
и всякое подобное неподобство 8))).

Удачи!
Вложения
cls_PD.rar
(770 байт) Скачиваний: 19
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 13.11.2004 (Сб) 6:49

xenomorph, Спасибо большое - конструктивное предложение :-)
xolod, тебе за ДЛЛку тоже спасибо... не переживай никому не скажу, что она у меня есть :-) :-) :-)


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

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

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

    TopList