[ Blue82 @ 26.09.2010. 19:16 ] @
Trebao bi mi neko iskusan, s obzirom da nisam siguran da cu ovako na papiru ni znati pojasniti problem. Naime, znamo da winsock salje asinhrono pakete podataka tako da su oni na prijemu grupisani i cesto su spojene poruke. Ali, ne znam do cega je to, na nekim racunarima ta poruka se gleda kao jedna celina, koliko god da je dugacka, a neki drugi pak racunari je gledaju kao celinu do odredjene duzine i onda prave novu poruku i prave proizvoljni prekid.

Napravio sam na prijemu da u datoteku zapisujem blok podataka koji dolazi sa servera.
Svaki blok podataka stavljen je pod navodnike. Primeticete da se blok podataka u datoteci ISPRAVNO, nalazi u jednoj celini tj. pod jednim navodnicima (otvorenim i zatvorenim), dok se isti taj blok podataka u datoteci NEISPRAVNO nalazi iscepkan u par zasebnih poruka.

Zbog cega dolazi do toga? DA li je to vezano za podesavanja Windowsa ili je hardwerske prirode?
Napominjem da se uzorak ne menja slucajno vec uvek isti racunari primaju tacan i uvek isti racunari netacan (iseckan) blok podataka.

Ako fajlove pregleate ovako sa es-a bice nepregledni. Predlazem da ih kopirate u notepad i onda ce se mnogo lepse videti u svega 2-3 reda.

Pojednostavljeno receno jedan racunar ce primiti sledecu poruku:

Code:

"Poruka1|Text poruke|Kraj porukePoruka2|Text poruke|Kraj poruke.....
Poruka 100|Text poruke|Kraj poruke"


A racunar na kome ne radi kako treba dobice nesto ovako:

Code:

"Poruka1|Text poruke|Kraj porukePoruka2|Text poruke|Kraj poruke"
"Poruka 100|Text poruke|Kraj poruke"


Posto su obe poruke pod navodnicima to ce biti kao 2 odvojena paketa podataka.
Svaka poruka je odvojena stringom |Kraj poruke a u okviru svake poruke podaci su odvojeni znakom "|".
I sada ako dodje do prekida na nezgodnom mestu ja cu dobiti poruku bez zaglavlja sa kojom program ne zna sta da uradi, ili cu dobiti poruku sa zaglavljem ali bez nekog dela koji odredjuje zaglavlje pa ce to biti nepotpun podatak.


[Ovu poruku je menjao Blue82 dana 26.09.2010. u 21:02 GMT+1]
[ vuchko.vuchko @ 27.09.2010. 17:39 ] @
Ajd' malo objasni nacin slanja? Da li ti saljes ovaj ceo text kao jedan string ili ga saljes iz vise dijelova ili kako vec...

Kakav je CPU od ovog racunara sto je napravio ovu gresku "Neispravno.txt"?
[ Blue82 @ 28.09.2010. 05:24 ] @
U sustini problem sam resio jedino mi nije jasno zasto nastaje. CPU na masini koja prima neispravan tekst je jaci od mog na kome radi normalno a sto se tice slanja, salje se vise kratkih poruka ali ih Winsock spaja u jednu posto je asinhroni tip slanja upitanju. U sustini poruka se uvek ista posalje, jedino se prijem na kraju razlikuje na prijemu na razlicitim racunarima sto mi nema bas neke logike.
[ galahad @ 28.09.2010. 10:22 ] @
Davno sam se igrao sa VB6 i Winsock, ali koliko me sećanje služi, mislim da to ima veze sa MTU, tj. maximum transmission unit, i mislim da zavisi od više faktora, MTU podešen na prijemnom OS, MTU na serverima koji se nalaze između računara koji šalje i koji prima, i slično.

Svojevremeno sam napravio neki IRC klijent, i imao sličan problem, nekad su poruke od servera stizale cele, a nekad iz delova. Fora je u tome da je recimo IRC protokol zamišljen kao takav, da neće uvek cela poruka stići, pa postoje tačno određene sekvence bajtova koje određuju početak, a koje kraj poruke. Kad god imaš neku komunikaciju, moraš da napraviš malo složeniji protokol, recimo da imaš neku malo verovatnu kombinaciju bajtova koja će označavati početak poruke, neku za kraj poruke, i recimo neki checksum pre kraja, da bi mogao da proveriš da li je cela poruka stigla.

A u winsock jednostavno primaš šta stigne, lepiš u jednu promenljivu koja je na nivou forme, klase, ili gde već želiš, a nakon toga obrađuješ sadržaj promenljive. Pa ukoliko imaš celu poruku, obradiš je, a ostatak zadržiš u toj promenljivoj, i nastaviš da lepiš podatke, dok ne dobiješ opet kompletnu poruku.

Primera radi:
Code:

STRTNeka PorukaCHKEND

STRT = Neka sekvenca bajtova, koja označava početak poruke
Neka Poruka = Očigledno šta je :)
CHK = Checksum poruke koje šalješ, BEZ markera za početak i kraj, znači CHK(Neka Poruka)
END = Neka sekvenca bajtova, koja označava kraj poruke

E sad, ovo je super ako dobijaš poruke "ucelo", a ako dobijaš iz delova, može se desiti da dobiješ i malo drugačije podatke, tipa:

Code:

Paket 1: STRTNeka PorukaCHKENDSTRTNeka druga
Paket 2:  porukaCHKENDSTRTNeka treca
itd...

Definišeš dakle neku promenljivu, recimo strPackets, na koju ćeš samo da lepiš šta stigne na winsock, i puštaš u neku proceduru koja će da obrađuje primljene poruke

U slučaju da imaš više paketa, ta procedura treba da izvuče prvu kompletnu poruku koju može. Sadržaj strPackets je
Code:

Poziv posle prijema prvog paketa:
strPackets = "STRTNeka PorukaCHKENDSTRTNeka druga"

Procedura "iseca" poruku STRTNeka PorukaCHKEND

Poziv posle prijema drugog paketa, novi paket je zalepljen na ostatak starog
strPackets = "STRTNeka druga porukaCHKENDSTRTNeka treca"

Opet, procedura "iseca" STRTNeka druga porukaCHKEND, a ostaje STRTNeka treca

I tako u krug.

Valjda je to to što te je mučilo, i valjda sam bio jasan (umem da budem JAKO konfuzan nekad :D)
[ Blue82 @ 29.09.2010. 05:20 ] @
Da, to sam vremenom skapirao pa sam lepio poruke i od tada je uredu, jedino me je bunilo zasto uvej isti racunari dobijaju celu poruku a uvek isti u prekidima, cisto teoretski. Hvala na odgovoru!