Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Winsock spaja poslate pakete

[es] :: Visual Basic 6 :: Winsock spaja poslate pakete

[ Pregleda: 2519 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Winsock spaja poslate pakete07.01.2010. u 14:58 - pre 146 meseci
Kako da resim ovo?

Ako nesto saljem na sledeci nacin
Code:

for i=1 to 10
     winsock1.senddata "Poruka"
next i

Na prijemu cu dobiti sledeci sadrzaj:

PorukaPorukaPorukaPorukaPorukaPorukaPorukaPorukaPorukaPoruka

Umesto da dobijem:

Poruka
Poruka
Poruka
Poruka
Poruka
Poruka
Poruka
Poruka
Poruka
Poruka

Tj. on je spojio 10 odvojenih poruka u jednu. Moze li se to resiti?

Treba mi metod po kome cu server naterati da posalje 10 razlicitih poruka a ne metod kojim cu na prijemu te poruke da rastavljam jer sam primetio da je rezultat sa istim programom, na razlicitim racunarima razlicit. Ne znam zasto to nastaje ali ako na prijemu rastavljam poruku na podporuke to u sustini radi ali dok se ne desi slucaj da saljem neku dugacku poruku. Ako je poruka predugacka, tj ako cela ne moze da stane u jednom nizu u jednom redu u Notepad vec se tamo mora podeliti u 2 reda onda neki racunari ne shvataju da je to jedna celina vec ga gledaju kao 2 razlicite poruke.

Uf, ne znam da li sam se dobro izrazio a nisam. Hajde ovako. Na prijemu dobijam jednu dugacku poruku. Neka ona bude u promenjivoj Data. Tu se poruka nalazi u celini primljena i to je ok. Ako tako primljenu poruku probam snimiti npr u datoteku, zbog njene duzine ona ce biti snimljena u 2 reda umesto u jednom. Neki racunari svhvataju da je to sve celina a drugi ne shvataju. Ako prodjem kroz zapis Data npr naredbom left$(Data,x) i promenjivu x pomeram od 1 to kraja poruke neki racunari je nece izlistati do kraja nego ce izlistavalje prekinuti na onom delu gde ce poruka biti prekinuta kada bih je ubacio u notepad ili neku datoteku. Ostatak poruke koji je napisan u novom redu u datoteci se ne vidi. Ovo sam samo spomenuo jer sam to shvatio, inace u praksi ne zapisujem tu poruku ni u kakvu datoteku vec je direktno citam.

Znaci izgleda je nemoguce koristiti rastavljanje dugacke poruke na vise malih nego mi je potreban nacin da nateram winsock da posalje 10 razlicitih poruku ako sam mu vec dao 10 komandi za slanje a ne da ih spoji nesretno u jednu. Do tog spajanja ne dolazi u debug modu, ako se ide linija po linija poslace 10 razlicitih poruka a ako nije u debug modu i brzo prodje kroz petlju onda ce sve to da skarabudzi u jednu poruku. Takodje pokusao sam da napravim sleep izmedju slanja ali nista se ne desi.

Molim vas za pomoc.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 18:07 - pre 146 meseci
Da dodam jos ovo. Probao sam da na kraju svakog .SendData napisem DoEvents i mislio sam da sam resio problem. Avaj nisam. Na mom racunaru je sve bilo ok i nikako nisam uspeo da izazovem spajanje 2 poruke ali na nekom drugom racunaru dolazilo je do spajanja kao da te naredbe ni nema. Nista mi vise nije jasno do cega je to. Program na nekim racunarima radi UVEK bez greske a na nekim drugim UVEK sa greskom. Da li je to do podesavanja necega u Windows-u ili hardvera?
 
Odgovor na temu

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 19:06 - pre 146 meseci
A kako bi bilo da definiras jednu promjenjivu koja ce napraviti prijelaz u slijedeći red npr.

Code:

Dim Wrap as String

Wrap =Chr(13) + Chr(10)


for i=1 to 10
     winsock1.senddata "Poruka" & Wrap
next i



steve585
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 19:23 - pre 146 meseci
Nije problem u tome i znak za novi red je novi karakter, a ako je cela poruka predugacka opet ce se negde naci prekid. Zamisli da trebas npr nekome iz baze da isporucis 3000 zapisa. Prvo sam ih strpao u jednu poruku, negde je radilo a negde ne. Kada sam shvatio u cemu je problem onda sam podelio to u npr 30 razlicitih poruka kroz for petlju.

Prvo posaljem prvih x elemenata, pa u drugom prolazu drugih x elemenata i tako do kraja. Kada je kraj samo posaljem "Kraj prenosa" i to je to ali i tako ako je vreme izmedju slanja 2 poruke prekratko on sve poveze u jednu poruku a ako prolazim kroz program u debug modu onda radi perfektno. Ako ubacin novi red necu dobiti 30 razlicitih poruka nego opet jednu dugacku koja ce u sebi imati oznaku za novi red i nista vise.
 
Odgovor na temu

steve585
Stevan Stanić
Project Manager
Zagreb

Član broj: 131815
Poruke: 281
*.xnet.hr.



+1 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 19:36 - pre 146 meseci
Ne znam da li sam te dobro skontao, ali ako jesam zar ne bi mogao na kraju svake poruke imati identifikator po kojem bi u kodu kasnije mogao odrediti kada je kraj poruke i potom poceti slanje nove poruke
steve585
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 20:25 - pre 146 meseci
Nisi me razumeo. Imam ja identifikatore kraja poruke i na prijemu rastavljam poruke na delove bez problema i to radi u svim slucajevima osim kada saljem veliku kolicinu podataka. Ta jedna velika poruka je ustvari sastavljena od 30 manjih poruka ali ih na slanju winsock spoji u jednu veliku a sa tom velikom neki racunari ne umeju da se izbore, ne znam zbog cega. Na nekim racunarima sve radi perfektno a isi taj program na drugom racunaru ne radi dobro jer zaboravi jedan deo poruke kako sam gore napisao.

Evo jos jednom.

for i=1 to 3
winsock1.senddata "Lista|poratak1|poratak2|....PodatakN"
next i

On ovo ne posalje kao 3 odojene poruke kako bi trebalo u prvom prolazu petlje posalje jedan deo pa u drugom drugi deo itd. nego sva 3 dela strpa u jednu poruku i sa tim neki racunari ne umeju da se izbore zbog ko zna cega. Jel razumes? Citava ceremonija je samo oko toga kako naterati Winsock da istom korisniku posalje 3 odvojene poruke tj da ih ne spoji u jednu.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 20:59 - pre 146 meseci
Davno sam radio sa Winsockom, ali se sećam da sam i ja imao sličnih problema zbog prepunjavanja bafera. Stvar je u tome što Winsock radi asinhrono, što znači da ne zaustavlja izvođenje procedure dok čeka rezultat, nego napuni bafer za slanje i teraj dalje, pa kad se pošalje, te se u nekim slučajevima desi da je petlja brža od slanja i prirodno se nove poruke nadodaju na postojeću. Probaj neko od sledeća dva rešenja

Prvo rešenje... zatvaraj i otvaraj konekciju pre svakog pojedinačnog slanja. Ovo bi, nadam se, trebalo da očisti bafer pre sledećeg slanja. Dakle (naravno podrazumeva se da si server, port i ostalo setovao ranije)
Code:
Private Sub Posalji()
    If Winsock1.State = 1 Then Winsock1.Close 'ako je otvoren, zatvori ga :)    
    
        Do Until Winsock1.State = 0 'vrti dok se ne zatvori
            DoEvents
        Loop

    Winsock1.Connect
            
        Do Until Winsock1.State = 7 'vrti dok se ne konektujemo na server
            DoEvents
        Loop
        
        Winsock1.SendData "Proba"
End Sub

Private Sub PosaljiSve()
Dim I As Long

    For I = 1 to 10
        Call Posalji
    Next I
End Sub


State property Winsocka je inače koristan zbog toga što se može ostvariti bolja kontrola procesa s obzirom da ta kontrola radi asinhrono.

Druga varijanta je još jednostavnija, a možda i delotvornija. Ubaci pauzu posle svakog slanja. Dovoljno je par milisekundi, al ti stavi 100 da budeš siguran. Dakle, ovako nešto
Code:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub PosaljiSve()
Dim I As Long

    For I = 1 to 10
        Winsock1.SendData "Proba"
        DoEvents
        Sleep 100
    Next I
End Sub


Sad naravno, ako imaš da pošalješ 10.000 ili 100.000 poruka, ova pauza od 100 milisekundi može debelo da oduži proces, ali ako se radi o desetak poruka... trajaće sekundu duže nego što bi trebalo, što i nije strašno. No, uvek možeš da staviš ovaj interval da bude kraći. Teoretski, u većini slučajeva bi i 1 milisekunda pomogla, ali to nećeš znati dok ne testiraš sa više intervala na različitim mašinama.

Ajd pa javi da li je nešto od toga pomoglo :)
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 21:17 - pre 146 meseci
Evo ovako, prekidanje konekcije ne dolazi u obzir, tj dolazi ali samo u nekom extremnom slucaju kada bas nema izlaza. Bilo bi vrlo nemastovito u ovom slucaju a za sleep sam probao i pre ali nista se ne desi jer on valjda tada zaustavi ceo program pa i samo slanje. Probao sam ovo. Isto je poprilicno trapavo resenje ali ako stavim slanje u timer i stavim ga na 1 milisekundu on sve odradi ok. A ako stavim beskonacnu petlju da ga malo opteretim i gledam sta se desava onda s vremenom polako pucinje da duplira poruke jer valjda ne stize da ih obradi. Morao bih probati sa experimentisanjem oko duzine okidanja timera ali i to moze biti problem jer u isto vreme taj zahtev moze da zatrazi 50 ljudi sto bi bilo neekonomicno i verovatno traljavo i dugo. Prosto ne mogu da verujem kako su winsock kontrolu napravili trapavo.
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: Winsock spaja poslate pakete07.01.2010. u 21:45 - pre 146 meseci
Pa ako radiš sa više korisnika, onda bolje učitavaj novu instancu Winsock-a za svakog korisnika, inače ćeš svakako imati problem sa kontrolom podataka. Uostalom, možda ne bi bilo loše da napišeš nešto više o tome što pokušavaš da napraviš i po mogućstvu malo veći deo koda nego što je ta jedna petlja, pa da vidimo da li možemo da nađemo šta zapravo pravi problem oko tih poruka.,
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-1.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete08.01.2010. u 05:28 - pre 146 meseci
Ima vise konekcija u isto vreme preko vise winsockova i u jednom trenutku su na serveru oko 100 korisnika.
Nema potrebe za vecim kodom jer to se desava kada saljem u testu i jednu rec kroz petlju 3x, na prijemu ne dobijem 3 brze poruke vec jednu spojenu. Ako ga nateam da posalje 3x proba iz ovoga

for i=1 to 3
winsock(10).senddata "Proba"
next i

to bi bilo resenje problema. Razumes? Znaci u isto vreme ima puno konekcija ali opet nebitan je njihov broj jer to se desava kada saljes isrom korisniku vise poruka u kratkom vremenu a ako saljem razlicitim korisnicima onda nema problema i svako dobije svoju poruku. Znaci problem je u sustini vrlo prost i u odnosu je 1:1 i jedne obicne for petlje.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4890
212.200.65.*

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Winsock spaja poslate pakete08.01.2010. u 07:41 - pre 146 meseci
Odmah da kazem, ne programiram u VB-u i ne znam kako je implementiran socket (Winsock) u njemu. Tako da ovaj post shvati samo kao neki lagani offtopic, koji ce ti ipak mozda nesto razjasniti da sam dodjes do optimalnog resenja, ili dok ti neko ne ponudi prihvatljivo resenje.

Na osnovu ovoga:
Citat:

Treba mi metod po kome cu server naterati da posalje 10 razlicitih poruka a ne metod kojim cu na prijemu te poruke da rastavljam jer sam primetio da je rezultat sa istim programom, na razlicitim racunarima razlicit. Ne znam zasto to nastaje ali ako na prijemu rastavljam poruku na podporuke to u sustini radi ali dok se ne desi slucaj da saljem neku dugacku poruku. Ako je poruka predugacka, tj ako cela ne moze da stane u jednom nizu u jednom redu u Notepad vec se tamo mora podeliti u 2 reda onda neki racunari ne shvataju da je to jedna celina vec ga gledaju kao 2 razlicite poruke.

... zakljucujem da postoji nesto sto je priroda TCP/IP protokola, a ne uzima se u obzir u "send" i "get" metodama koje koristis.

Recimo, kada se kaze "send SADRZAJ" (uopsteno kod socketa, nevezano za VB), korisnik obicno ocekuje da ce CEO taj sadrzaj biti ODJENOM primljen sa nekim tamo "get" u nekom eventu. Sto je najgore, takvi primeri (obicno kopirani iz Examples foldera ili Weba) uvek rade u laboratorijskim slucajevima, na jednom racunaru - i tako dovode u zabludu korisnika da se na taj nacin moze slati sve i svasta, po volji korisnika.

Zavisno od prirode wrappera oko "get" metode u VB, mozda tako delimicno i jeste, ali cini mi se da nije sasvim, cim pominjes probleme kod vecih poruka i da isti program radi razlicito u raznim okolnostima.


Evo par TCP/IP cinjenica, mozda ce ti iskristalisati neke detalje:

1. TCP/IP protokol ne garantuje da ce SEND proslediti mrezi CEO zeljeni Buffer, tj string (jer mreza nije bila sposobna da primi ceo buffer)
2. jedan SEND ce mozda ispaliti vise GET dogadjaja na prijemu (jer mreza nije mogla odjednom da isporuci sve)
3. vise SEND-ova na vec uspostavljenoj konekciji moze rezultirati JEDNIM GET, ako su poruke krace (mislim da je ovo slucaj o kome govoris u naslovu teme)


(1) ovo se resava tako sto se:
- pokusa slanje celog buffera (ili nekog konstantnog, max 8192 bajta kod IPv4)
- procita povratna vrednost send-a i sledece slanje nastavi bas odatle (jer povratna vrednost obicno kaze koliko je mreza primila iz tog pokusaja)
- ovo se ponavlja dok se ceo buffer ne posalje

E sad, prvo sto sam pogledao na netu je povratna vrednost SedData u VB:
http://msdn.microsoft.com/en-us/library/aa228112(VS.60).aspx
...koje na moje iznenadjenje ne postoji (void). To mi govori da (valjda) Wrapper oko SendData u VB garantuje da ce poslati sve do zadnjeg bajta, tj. da interno radi ovaj iterativni postupak i korisniku olaksava posao.


(2) ovo se obicno resava tako sto se:
- pre slanja konkretnih podataka (SEND Buffer) posalje velicina tog Buffera: SEND Length(Buffer), pa tek onda podaci: SEND Buffer
- na prijemu se prvo procita ocekivana velicina Buffera, koji ce u optimalnom slucaju stici odjednom, a mozda i nece, pa ga treba SPAJATI dok se DOGOVORENA i PRIMLJENA duzina ne poklope.

Mislim da je bas ovo problem kod tebe kada saljes vece buffere i ono sto proizvodi razlike u razlicitim situacijama (isti kod, razlicit rezultat).



(3) Vise SEND-ova koji rezultuju JEDNIM get je prirodno ponasanje, i zaista ne znam da li se bez raskidanja konekcije moze resiti.

Svakako, ohrabrujem te da kad budes imao vremena pokusas sa onim:
--- KLIJENT ---
SEND Length(Buffer)
SEND Buffer (zakljucih da VB garantuje da ce buffer biti u celosti isporucen, pa otuda i samo jedan SEND)

--- SERVER ---
GET Length
GET BufferDeo1
GET BufferDeo2
GET BufferDeo3 (sve dok SPOJENI(BufferDeo1, BufferDeo2, BufferDeo3) ne budu jednaki Length(Buffer), tada resetujes brojac i cekas dalje da neko posalje duzinu buffera za prijem).

Prouci i ovo, mozda ti parametar maxLen bude od nekog znacaja:
http://msdn.microsoft.com/en-us/library/aa228098(VS.60).aspx

Ovo sa spajanjem je regularan pristup i u socket wrapperima u C/C++ jezicima, a da sam na tvom mestu potrazio bih neke reprezentativne VB primere o svemu ovome.



Mozda ces ovde naci nesto u vezi brojanja bajtova:
http://www.vbforums.com/showthread.php?t=377648

Attached Files: SendFileWinsock.zip
Prikačeni fajlovi
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Winsock spaja poslate pakete08.01.2010. u 11:44 - pre 146 meseci
Slazem se sa X Files-om u vezi implementacije WinSock-a u VB
Bila je jedna tema http://www.elitesecurity.org/t...anje-aplikacija-putem-Internet u kojoj je bilo reci o ovome.
Mada ne na ovom nivou nego onako pocetnicki.
Iz iskustva u VB-u mogu da ti kazem:
Koliko god Send da imas u jednoj svojoj funkciji sve ce se poslati spojeno.
Isto, ponekad se slanje ne izvrsi odma.
Probaj sa DoEvents posle send u slucajevima kad nesto ne radi kako bi trebalo jer verovatno u VB implementaciji nesto u vezi buffera ili kad se sock koristi i za prijem i za slanje istovremeno nije dobro uradjeno i eventi se ne okidaju onako kako bi ocekivali.
Znaci probaj u for petlji gde imas SendData da posle SendData stavis DoEvents.
Ja ovo nisam nikad testirao ali izgleda logicno.


 
Odgovor na temu

Daniel Mauric
Software Architect
Novi Sad

Član broj: 3279
Poruke: 30
*.adsl-a-1.sezampro.yu.



+17 Profil

icon Re: Winsock spaja poslate pakete08.01.2010. u 17:04 - pre 146 meseci
Ni ja ne koristim VB, ali to i nije bitno, Winsock je Winsock. Kao sto su i drugi rekli kad koristis TCP ti ne odlucujes niti imas kontrolu oko toga kad ce se i koliko bajtova poslati. UDP garantuje da ce ti cela poruka stici u jednom komadu, ali ima druge mane.

Postoje 2 resenje za ovaj problem:

1. Dodaj header na sve poruke koje saljes, i u njemu odredi druzinu poruke. Kod primanja parse-uj header, i citaj samo toliko bajtova.

2. Koristi 1 ili vise bajtova za EOM (End of message), pa pri primanju citas dok ne naletis na tako oznacen kraj.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 835
*.adsl-3.sezampro.yu.



+322 Profil

icon Re: Winsock spaja poslate pakete08.01.2010. u 18:18 - pre 146 meseci
Eurora, nisam siguran ali mislim da sam negde to vec napisao ali bilo kako bilo probao sam da stavljam DoEvents ali nije se desilo nista znacajno tj opet zavino od racunara. Na mom racunaru je bio delio poruke i mislio sam ok, to je to. A onda sam probao na drugim racunarima i shvatio da su oni opet dobili kao jednu poruku.

@X files pokusacu nesto na ovaj nacin, ako nista drugo palo mi je na pamet da te zapise iz baze predstavim kao neki txt ili neki drugi fajl i onda da samo prenesem ceo fajl tamo (to uvek radi), onda klijent otvori fajl i analizira ga i pokupi sta mu treba. Seljacki jeste ali sluzice svrsi, mada mislim da bi moglo uspeti slanje odredjivanjem velicine poslatog paketa ali za to mi sada treba malo vise vremena jer ga trenutno nemam vise od pola sata na dan. Ocekivao sam da je moguce to resiti mnogo jednostavnije a ovo ipak zahteva vece izmene. U svakom slucaju hvala i pokusacu pa kako ispadne. Hvala i za primere, bas si se potrudio.
 
Odgovor na temu

[es] :: Visual Basic 6 :: Winsock spaja poslate pakete

[ Pregleda: 2519 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.