/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Multiple send/modtag på 1 Winsock control
Fra : Steen Gellett


Dato : 07-01-05 03:37

Jeg har lavet et lille server / client program som skal kunne tage x antal
clienter og connecte til 1 server.............på UDP protokolllen !
Det virker meget (!!) fint..........alle clienter connecter fint til min
server og de
for min "SERVERID" tilsendt ( min pc's navn ) efterhånden som de connecter,
og de bliver listet i en list1 med IP nummer........og en list 2 med deres
pc navn, det virker også perfekt. Alle der connecter kan sende tekst
beskeder til mig, men når jeg vælger en IP adresse fra min liste af
connections ( list1 ) så er det kun den sidste der har connected til
serveren som jeg kan sende til...........hvorfor det ??

Er det mig der helt har misforstået noget mht til winsock og UDP

Her er serveren :

Private Sub Form_Load()
Winsock1.LocalPort = "8767"
Winsock1.Bind
End Sub

Private Sub cmdSend_Click()
Winsock1.RemoteHost = List1.Text ' List1 er liste over connectede
pc'ere
Winsock1.SendData Text1.Text ' Til beskeder til client (er !! )
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Ind As String, IP As String
Winsock1.GetData Ind
If InStr(1, Ind, "CLIENTID:", 0) Then
List1.AddItem Winsock1.RemoteHostIP
List2.AddItem Right(Ind, Len(Ind) - 9)
Winsock1.RemoteHost = Winsock1.RemoteHostIP
Winsock1.SendData "SERVERID:" & Winsock1.LocalHostName
End If
List2.AddItem Ind ' alt der kommer ind til mig listes i list2..+ remote
pc
End Sub




 
 
Tomas Christiansen (07-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 07-01-05 23:24

Steen Gellett skrev:
> Jeg har lavet et lille server / client program som skal kunne tage x antal
> clienter og connecte til 1 server.............på UDP protokolllen !

Der er noget som du helt har misforstået!

Man kan _ikke_ "connecte" ved hjælp af UDP-protokollen. UDP-protokollen er
"connectionless".
UDP svarer lidt til at råbe ud i skoven - du ved ikke helt hvem der lytter
med, og du aner ikke om modtageren hører dig halvt, helt eller dobbelt på
grund af ekko.

Hvis du vil lave forbindelser, så må du bruge TCP-protokollen, som til
gengæld sikrer dig at dine beskeder kommer frem, kommer hele frem og kommer
frem i den rigtige rækkefølge!


> Winsock1.LocalPort = "8767"
> Winsock1.Bind

OK, du vil altså lytte på port 8767 og du reserverer den, så andre
programmer ikke kan komme og snuppe den for næsen af dig - godt!
Du har vel forhåbentlig andet steds angivet at du vil bruge UDP? Jeg ville
måske nok have angivet det her for dokumentationens skyld.

> Private Sub cmdSend_Click()
> Winsock1.RemoteHost = List1.Text ' List1 er liste over connectede
> pc'ere2
> Winsock1.SendData Text1.Text ' Til beskeder til client (er !! )
> End Sub

Jeg forstår ikke helt. Forventer du at Winsock kontrollen på "magisk" vis
skal sende til en hel liste af modtagere?
Denne property hedder RemoteHost og ikke RemoteHosts, så den går ikke! Du er
nødt til selv at sørge for at sende til hver enkelt klient.

Du bør også angive den korrekte værdi for RemotePort for at være sikker til
den rigtige port!

> If InStr(1, Ind, "CLIENTID:", 0) Then

Lige et par tricks:
Ingen (okay, klæbehjerner kan måske) kan huske hvad værdien 0 som 4.
argument til InStr betyder. Det er meget lettere at forstå hvis man bruger
VB's indbyggede konstant til dette formål: vbBinaryCompare.
Hvis du bruger Option Compare Binary (eller ikke angiver Option Compare -
idet Binary er default), så kan du undlade at skrive 1. og 4. argument, men
slet og ret nøjes med: If InStr(Ind, "CLIENTID:") Then

> Winsock1.RemoteHost = Winsock1.RemoteHostIP
> Winsock1.SendData "SERVERID:" & Winsock1.LocalHostName

Er det mon egentlig nødvendigt at sætte RemoteHost til værdien i
RemoteHostIP eller vil disse to properties mon altid have samme værdi her?
Noget tyder på at RemotePort automatisk bliver sat (på samme måde som
dokumentationen beskriver sker med RemoteHostIP) ved modtagelsen af en
UDP-pakke.

-------
Tomas


Steen Gellett (07-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 07-01-05 23:48


"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:crn27h$15jm$1@news.cybercity.dk...
> Steen Gellett skrev:
>> Jeg har lavet et lille server / client program som skal kunne tage x
>> antal
>> clienter og connecte til 1 server.............på UDP protokolllen !
>
> Der er noget som du helt har misforstået!
>
> Man kan _ikke_ "connecte" ved hjælp af UDP-protokollen. UDP-protokollen er
> "connectionless".

Det er jeg udemærket klar over, men når min server får en "kontakt" fra min
klient
og de 2 "taler" sammen, ja så kalder jeg det at "connecte"

> UDP svarer lidt til at råbe ud i skoven - du ved ikke helt hvem der lytter
> med, og du aner ikke om modtageren hører dig halvt, helt eller dobbelt på
> grund af ekko.

Det ved jeg................ikke en skid kontrol med noget som helst, men det
er jo heller ikke
det er der mit spørgsmål !!!


>
> Hvis du vil lave forbindelser, så må du bruge TCP-protokollen, som til
> gengæld sikrer dig at dine beskeder kommer frem, kommer hele frem og
> kommer
> frem i den rigtige rækkefølge!

Ja du har kontrol over afsendelse, men den modtager alt i en stor
pærevælling .....laver
du 100 send "ABCDEFGH" i, så modtages hele lortet i en stor pærevælling
fordi man ikke
har styr over modtagelse...............den modtager måske højst 3 gange og
så ser det sådan her ud
ABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGH...osv osv osv


>
>
>> Winsock1.LocalPort = "8767"
>> Winsock1.Bind
>
> OK, du vil altså lytte på port 8767 og du reserverer den, så andre
> programmer ikke kan komme og snuppe den for næsen af dig - godt!
> Du har vel forhåbentlig andet steds angivet at du vil bruge UDP? Jeg ville
> måske nok have angivet det her for dokumentationens skyld.

LÆS NR 2 LINIE I MIT SPØRGSMÅL....de 3 sidste ord !!!!

>
>> Private Sub cmdSend_Click()
>> Winsock1.RemoteHost = List1.Text ' List1 er liste over connectede
>> pc'ere2
>> Winsock1.SendData Text1.Text ' Til beskeder til client (er !! )
>> End Sub
>
> Jeg forstår ikke helt. Forventer du at Winsock kontrollen på "magisk" vis
> skal sende til en hel liste af modtagere?
> Denne property hedder RemoteHost og ikke RemoteHosts, så den går ikke! Du
> er
> nødt til selv at sørge for at sende til hver enkelt klient.

Jamen det er jo lige det jeg skriver..........jeg vælger en IP adresse på
listen
over de klienter der har "kaldt" mig............så den skal "bare" sende til
den jeg
har valgt............ikke noget med mystik eller voodoo her.........og nu er
det sådan
at alle de klienter der har kaldt mig ( server ) udemærket kan sende til
mig.....???
Så det mystiske forsvinder vel lidt..........eller hvad ???

>
> Du bør også angive den korrekte værdi for RemotePort for at være sikker
> til
> den rigtige port!
>
>> If InStr(1, Ind, "CLIENTID:", 0) Then
>
> Lige et par tricks:
> Ingen (okay, klæbehjerner kan måske) kan huske hvad værdien 0 som 4.
> argument til InStr betyder. Det er meget lettere at forstå hvis man bruger
> VB's indbyggede konstant til dette formål: vbBinaryCompare.
> Hvis du bruger Option Compare Binary (eller ikke angiver Option Compare -
> idet Binary er default), så kan du undlade at skrive 1. og 4. argument,
> men
> slet og ret nøjes med: If InStr(Ind, "CLIENTID:") Then

Der er ikke andre end mig der skal se min kode.............og jeg har ikke
bedt om
belæring i instr kommandoen..............hold dig venligst til mit spørgsmål

>
>> Winsock1.RemoteHost = Winsock1.RemoteHostIP
>> Winsock1.SendData "SERVERID:" & Winsock1.LocalHostName
>
> Er det mon egentlig nødvendigt at sætte RemoteHost til værdien i
> RemoteHostIP eller vil disse to properties mon altid have samme værdi her?
> Noget tyder på at RemotePort automatisk bliver sat (på samme måde som
> dokumentationen beskriver sker med RemoteHostIP) ved modtagelsen af en
> UDP-pakke.
>

Okey du kunne ikke svare mig på hvorfor det ikke virker.......men pyt, jeg
har selv løst
problemet.............



Tomas Christiansen (08-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 08-01-05 01:16

Steen Gellett skrev:
> Det er jeg udemærket klar over..
> Det ved jeg...
> ...og jeg har ikke bedt om belæring i instr kommandoen...
> ...hold dig venligst til mit spørgsmål...

Når jeg ser et indlæg - især i denne gruppe - vurderer jeg altid om der er
tale om en newbie eller en lidt mere erfaren. Eller måske skulle jeg hellere
skrive _forsøger_ at vurdere

Da jeg skimmede din kode igennem begik jeg (mindst) to fejl: Den ene var at
ikke nærlæste dit indlæg grundig nok, og havde i tankerne at List1.Text
returnerer _hele_ listen (og ikke kun det aktuelt valgte element i listen)
og den anden var at jeg troede at du var en helt grøn nybegynder - begrundet
ud fra flere ting i din kode (hvor den ene jo altså var en fejl fra min
side).

Jeg kunne selvfølgelig have undersøgt dit navn lidt nærmere og have fundet
ud af at du har haft gang i flere sager i forskellige nyhedsgrupper, men det
gjorde jeg ikke, og jeg beklager at jeg fejlvurderede dig og dit niveau. Det
var ikke et forsøg på at nedgøre din kompetence eller at gøre nar (men dog
måske at være belærende - indrømmet).

Når jeg kommenterede dit indlæg som jeg gjorde var det altå på grund af
denne fejlvurdering, og det forhold at er min erfaring at mange nybegyndere
ofte springer over nogle helt grundlæggende ting og ender med ikke at kunne
overskue projektet. Derfor er det ofte en godt idé at gå et skridt tilbage
(hvornår gør man egentlig det, mens man sidder på sin kontorstol?) og få det
fundamentale på plads - uanset hvor uendelig kedeligt det end måtte være.
Derefter løser problemerne sig i mange tilfælde "af sig selv" (dermed mener
jeg at personen selv bliver i stand til at løse problemet) og det er jo ikke
en helt dårlig ting!

> Ja du har kontrol over afsendelse, men den modtager alt i en stor
> pærevælling .....laver du 100 send "ABCDEFGH" i, så modtages
> hele lortet i en stor pærevælling fordi man ikke har styr over
> modtagelse...............den modtager måske højst 3 gange og
> så ser det sådan her ud
> ABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGH...osv osv osv

Der har dilemmaet igen. Du skriver noget som gør at man tror at du ved hvad
socket-kommunikation handler om og derefter skriver du noget som gør at man
er klar over at du alligevel ikke rigtig helt har forstået de grundlæggende
ting.

Husk på at hvad du støder på i Microsofts Winsock-kontrol er et meget
minimalt, lille, næsten ubrugeligt, subset af den brede vifte af features
som ligger i TCP/IP protokolsuiten. Hvis du holder dig til kun at bruge MS
Winsock-kontrollen, får du naturligvis ingen glæde af disse features, men
pas på med at tro at når MS Winsock gør sådan, så ER det bare sådan.

> Okey du kunne ikke svare mig på hvorfor det ikke virker.......men pyt, jeg
> har selv løst problemet.............

Efter at have nærlæst dit indlæg igen, kan jeg kun komme i tanke om
problematikken med at du ikke angiver hvilken port du vil sende til hos
klienten, som jeg skrev:

> Du bør også angive den korrekte værdi for RemotePort for at være sikker
til
> den rigtige port!

Lad os lige høre her i gruppen - hvad var problemet/hvad er løsningen?

-------
Tomas


Steen Gellett (08-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 08-01-05 11:47


> Da jeg skimmede din kode igennem begik jeg (mindst) to fejl: Den ene var
> at
> ikke nærlæste dit indlæg grundig nok, og havde i tankerne at List1.Text
> returnerer _hele_ listen (og ikke kun det aktuelt valgte element i listen)
> og den anden var at jeg troede at du var en helt grøn nybegynder -
> begrundet
> ud fra flere ting i din kode (hvor den ene jo altså var en fejl fra min
> side).

Okey, jeg laver også denne fejl ( og jeg mener det er en fejl ) at vurdere
spørgerens
kundskaber........når jeg svarer har jeg lært mig 2 ting.............svare
på spørgsmålet
efter mine evner, og ALDRIG rette på / nedvurdere andres svar på samme
spørgsmål !
Måske det kunne være mig der tager fejl, og de andre der har ret....lidt
pinligt hvis man
har "svinet" de andre til..............med disse 2 ting kommer man langt i
newsgroups !!

>
> Jeg kunne selvfølgelig have undersøgt dit navn lidt nærmere og have fundet
> ud af at du har haft gang i flere sager i forskellige nyhedsgrupper, men
> det
> gjorde jeg ikke, og jeg beklager at jeg fejlvurderede dig og dit niveau.
> Det
> var ikke et forsøg på at nedgøre din kompetence eller at gøre nar (men dog
> måske at være belærende - indrømmet).

Jeps.........men jeg kan godt forstå du har svært ved at vurdere mit niveau,
det har
jeg også selv, men har dog ofte kunne hjælpe andre. Mit problem er at jeg
godt
kan "huske" parameter og hvad de står for, så jeg vil til enhver tid skrive
Instr(1,"String1","String2",0)..................måske en dårlig vane, men
hvad fanden
dem har vi vel alle .........ik'

> Når jeg kommenterede dit indlæg som jeg gjorde var det altå på grund af
> denne fejlvurdering, og det forhold at er min erfaring at mange
> nybegyndere
> ofte springer over nogle helt grundlæggende ting og ender med ikke at
> kunne
> overskue projektet. Derfor er det ofte en godt idé at gå et skridt tilbage
> (hvornår gør man egentlig det, mens man sidder på sin kontorstol?) og få
> det
> fundamentale på plads - uanset hvor uendelig kedeligt det end måtte være.
> Derefter løser problemerne sig i mange tilfælde "af sig selv" (dermed
> mener
> jeg at personen selv bliver i stand til at løse problemet) og det er jo
> ikke
> en helt dårlig ting!

Jeg har tæsket langhalm på winsock kontrollen og ved en del om den, jeg har
bland andet lavet et lille FTP program hvor jeg udnytter winsock på IP
protokollen
og det var sgu ikke nemt, men det virker altså.......!

>
>> Ja du har kontrol over afsendelse, men den modtager alt i en stor
>> pærevælling .....laver du 100 send "ABCDEFGH" i, så modtages
>> hele lortet i en stor pærevælling fordi man ikke har styr over
>> modtagelse...............den modtager måske højst 3 gange og
>> så ser det sådan her ud
>> ABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGH...osv osv osv
>
> Der har dilemmaet igen. Du skriver noget som gør at man tror at du ved
> hvad
> socket-kommunikation handler om og derefter skriver du noget som gør at
> man
> er klar over at du alligevel ikke rigtig helt har forstået de
> grundlæggende
> ting.

Jeg er altid villig til at lære, ellers ville jeg ikke læse disse grupper.
Jeg mener dog stadig ikke
at winsock.ocx (TCP-IP) er helt god mht. at styre det der kommer
ind........hvis du i få ord kan
fortælle mig hvordan ovenstående gøre så den modtager 100 gange den string
som jeg vil sende
så er jeg MEGET lydhør......

>
> Husk på at hvad du støder på i Microsofts Winsock-kontrol er et meget
> minimalt, lille, næsten ubrugeligt, subset af den brede vifte af features
> som ligger i TCP/IP protokolsuiten. Hvis du holder dig til kun at bruge MS
> Winsock-kontrollen, får du naturligvis ingen glæde af disse features, men
> pas på med at tro at når MS Winsock gør sådan, så ER det bare sådan.
>
Jamen det er hele humlen i mit problem, at jeg nu har valgt at bruge
winsock.ocx !
Men hvad søren, når nu jeg har fået det til at spille så pyt

Indrømmet, den er "nærmest" værdiløs, men man tager vel altid mod en
udfording ..


>
> Efter at have nærlæst dit indlæg igen, kan jeg kun komme i tanke om
> problematikken med at du ikke angiver hvilken port du vil sende til hos
> klienten, som jeg skrev:
>
>> Du bør også angive den korrekte værdi for RemotePort for at være sikker
> til
>> den rigtige port!
>
> Lad os lige høre her i gruppen - hvad var problemet/hvad er løsningen?

Løsning på netop mit probem var at tilføje endnu en winsock som "bindes" fra
klientes
side, så der en wskSend og en wskModtag........en på port 8767 (server ) og
en på port
8768 på klienten...........på denne måde virker mit program

Serveren sender ud på 8768 ( der hvor klienten lytter ) og klienten sender
ud på
8767 ( der hvor serveren den lytter )..............og det virker



>
> -------
> Tomas
>



mhabio (09-01-2005)
Kommentar
Fra : mhabio


Dato : 09-01-05 14:30

Det lyder som et problem med din list control så det altid er den sidste IP
adresse der bliver snuppet ??

Prøve evt dette:

Set en DoEvent ind i din kode når du sender, ellers hænger WinSock.

Også tjek at du har den port du regner med på client og server siden. Jeg
har haft mange problemer med at få Winsock-kontrollen til at slippe en port
for så at bruge en anden eller den samme igen. det kunne være derfor det er
den sidste der kun får en besked ?? I en TCP client:server virker det bedst
ved at resette clientens LocalPort = 0.

Mikkel

"Steen Gellett" <HejMedDig@NoSpam.Net> wrote in message
news:41dfba0a$0$282$edfadb0f@dread12.news.tele.dk...
>
>> Da jeg skimmede din kode igennem begik jeg (mindst) to fejl: Den ene var
>> at
>> ikke nærlæste dit indlæg grundig nok, og havde i tankerne at List1.Text
>> returnerer _hele_ listen (og ikke kun det aktuelt valgte element i
>> listen)
>> og den anden var at jeg troede at du var en helt grøn nybegynder -
>> begrundet
>> ud fra flere ting i din kode (hvor den ene jo altså var en fejl fra min
>> side).
>
> Okey, jeg laver også denne fejl ( og jeg mener det er en fejl ) at vurdere
> spørgerens
> kundskaber........når jeg svarer har jeg lært mig 2 ting.............svare
> på spørgsmålet
> efter mine evner, og ALDRIG rette på / nedvurdere andres svar på samme
> spørgsmål !
> Måske det kunne være mig der tager fejl, og de andre der har ret....lidt
> pinligt hvis man
> har "svinet" de andre til..............med disse 2 ting kommer man langt i
> newsgroups !!
>
>>
>> Jeg kunne selvfølgelig have undersøgt dit navn lidt nærmere og have
>> fundet
>> ud af at du har haft gang i flere sager i forskellige nyhedsgrupper, men
>> det
>> gjorde jeg ikke, og jeg beklager at jeg fejlvurderede dig og dit niveau.
>> Det
>> var ikke et forsøg på at nedgøre din kompetence eller at gøre nar (men
>> dog
>> måske at være belærende - indrømmet).
>
> Jeps.........men jeg kan godt forstå du har svært ved at vurdere mit
> niveau, det har
> jeg også selv, men har dog ofte kunne hjælpe andre. Mit problem er at jeg
> godt
> kan "huske" parameter og hvad de står for, så jeg vil til enhver tid
> skrive
> Instr(1,"String1","String2",0)..................måske en dårlig vane, men
> hvad fanden
> dem har vi vel alle .........ik'
>
>> Når jeg kommenterede dit indlæg som jeg gjorde var det altå på grund af
>> denne fejlvurdering, og det forhold at er min erfaring at mange
>> nybegyndere
>> ofte springer over nogle helt grundlæggende ting og ender med ikke at
>> kunne
>> overskue projektet. Derfor er det ofte en godt idé at gå et skridt
>> tilbage
>> (hvornår gør man egentlig det, mens man sidder på sin kontorstol?) og få
>> det
>> fundamentale på plads - uanset hvor uendelig kedeligt det end måtte være.
>> Derefter løser problemerne sig i mange tilfælde "af sig selv" (dermed
>> mener
>> jeg at personen selv bliver i stand til at løse problemet) og det er jo
>> ikke
>> en helt dårlig ting!
>
> Jeg har tæsket langhalm på winsock kontrollen og ved en del om den, jeg
> har
> bland andet lavet et lille FTP program hvor jeg udnytter winsock på IP
> protokollen
> og det var sgu ikke nemt, men det virker altså.......!
>
>>
>>> Ja du har kontrol over afsendelse, men den modtager alt i en stor
>>> pærevælling .....laver du 100 send "ABCDEFGH" i, så modtages
>>> hele lortet i en stor pærevælling fordi man ikke har styr over
>>> modtagelse...............den modtager måske højst 3 gange og
>>> så ser det sådan her ud
>>> ABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGHABCDEFGH...osv osv osv
>>
>> Der har dilemmaet igen. Du skriver noget som gør at man tror at du ved
>> hvad
>> socket-kommunikation handler om og derefter skriver du noget som gør at
>> man
>> er klar over at du alligevel ikke rigtig helt har forstået de
>> grundlæggende
>> ting.
>
> Jeg er altid villig til at lære, ellers ville jeg ikke læse disse grupper.
> Jeg mener dog stadig ikke
> at winsock.ocx (TCP-IP) er helt god mht. at styre det der kommer
> ind........hvis du i få ord kan
> fortælle mig hvordan ovenstående gøre så den modtager 100 gange den string
> som jeg vil sende
> så er jeg MEGET lydhør......
>
>>
>> Husk på at hvad du støder på i Microsofts Winsock-kontrol er et meget
>> minimalt, lille, næsten ubrugeligt, subset af den brede vifte af features
>> som ligger i TCP/IP protokolsuiten. Hvis du holder dig til kun at bruge
>> MS
>> Winsock-kontrollen, får du naturligvis ingen glæde af disse features, men
>> pas på med at tro at når MS Winsock gør sådan, så ER det bare sådan.
>>
> Jamen det er hele humlen i mit problem, at jeg nu har valgt at bruge
> winsock.ocx !
> Men hvad søren, når nu jeg har fået det til at spille så pyt
>
> Indrømmet, den er "nærmest" værdiløs, men man tager vel altid mod en
> udfording ..
>
>
>>
>> Efter at have nærlæst dit indlæg igen, kan jeg kun komme i tanke om
>> problematikken med at du ikke angiver hvilken port du vil sende til hos
>> klienten, som jeg skrev:
>>
>>> Du bør også angive den korrekte værdi for RemotePort for at være sikker
>> til
>>> den rigtige port!
>>
>> Lad os lige høre her i gruppen - hvad var problemet/hvad er løsningen?
>
> Løsning på netop mit probem var at tilføje endnu en winsock som "bindes"
> fra klientes
> side, så der en wskSend og en wskModtag........en på port 8767 (server )
> og en på port
> 8768 på klienten...........på denne måde virker mit program
>
> Serveren sender ud på 8768 ( der hvor klienten lytter ) og klienten sender
> ud på
> 8767 ( der hvor serveren den lytter )..............og det virker
>
>
>
>>
>> -------
>> Tomas
>>
>
>



Steen Gellett (09-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 09-01-05 20:43


"mhabio" <FoxylogicNOT@stofanet.dk> skrev i en meddelelse
news:41e12cbb$0$29433$ba624c82@nntp06.dk.telia.net...
> Det lyder som et problem med din list control så det altid er den sidste
> IP adresse der bliver snuppet ??

Nej det er ikke tilfældet........

>
> Prøve evt dette:
>
> Set en DoEvent ind i din kode når du sender, ellers hænger WinSock.
>
> Også tjek at du har den port du regner med på client og server siden. Jeg
> har haft mange problemer med at få Winsock-kontrollen til at slippe en
> port for så at bruge en anden eller den samme igen. det kunne være derfor
> det er

Det er når du bruger TCP/IP...........jeg bruger UDP, så er der ingen
release
tid overhoved..........på TCP/IP releaser WinXP / Winsock efter 2 minutter

> den sidste der kun får en besked ?? I en TCP client:server virker det
> bedst ved at resette clientens LocalPort = 0.

Som sagt , jeg bruger UDP..................og jeg har løst problemet ved at
give mit program endnu en winsock...........en modtager og en sender !!




Tomas Christiansen (09-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 09-01-05 23:20

Steen Gellett skrev.
> ...så jeg vil til enhver tid skrive Instr(1,"String1","String2",0)
>...måske en dårlig vane, men...

Jeg ville være meget ked af at se ubredt brug af tal-værdier hvor passende
indbyggede konstanter allerede findes, i projekter hvor flere skal arbejde
på samme kode. Hvorfor gøre det svært, når det ikke er sværere at gøre det
let?


> Jeg er altid villig til at lære, ellers ville jeg ikke læse disse grupper.
> Jeg mener dog stadig ikke at winsock.ocx (TCP-IP) er helt god
> mht. at styre det der kommer ind........hvis du i få ord kan
> fortælle mig hvordan ovenstående gøre så den modtager 100
> gange den string som jeg vil sende så er jeg MEGET lydhør......

Jeg er ikke helt sikker på hvad du mener - kan du uddybe det?

Problemet med at bruge MS Winsock er at al styring mht. hvornår noget er
afsendt om det må fragmenteres osv. ligger uden for ens kontrol. Hvis man
selv koder direkte mod low-level DLL'erne eller kan finde en ActiveX kontrol
som giver en mulighed for at styre den slags, så kan man styre VISSE ting i
forbindelse med afsendelse og modtagelse.

Det er dog vigtigt huske på at rent principielt er en socket (som benytter
TCP-protokollen) én lang strøm af af bytes som sendes fra A til B. At disse
bytes deles op i pakker, er et nødvendigt onde, men rent principielt ikke
noget man skal "tage sig af" (selvom man i de rette omgivelser rent faktisk
har visse muligheder for at have indflydelse på det).

> Løsning på netop mit probem var at tilføje endnu en winsock som "bindes"
fra
> klientes side, så der en wskSend og en wskModtag........en på port 8767
(server ) og
> en på port 8768 på klienten...........på denne måde virker mit program

Du har ikke nødvendigvis brug for to Winsock's i hos hver part for at kunne
send og modtage!

Jeg satte mig ned og skrev et lille "Client/Server" program som taler sammen
gennem UDP - måske det kan inspirere dig?

Det er samme program som kan have rollen Client eller Server. Der kan kun
være én Server, men lige så mange Clients som du ønsker.

Kopier nedenstående kode ind i Notepad og gem filen under navnet Main.frm i
et tomt bibliotek.
Dobbeltklik på filen Main.frm og svar OK til VB's "errors during load".
Tryk Ctrl-T og tilføj Microsoft Winsock Control.
Luk VB og gem projektet.i standardnavnet Project1.
Højreklik på filen Project1.vbp og vælg Make.
Start nogle stykker af Project1.exe op og eksperimentér!

--- klip --- klip --- klip --- klip --- klip --- klip --- klip --- klip ---
klip ---
VERSION 5.00
Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
Begin VB.Form frmMain
BorderStyle = 1 'Fixed Single
Caption = "CS-chat"
ClientHeight = 3750
ClientLeft = 45
ClientTop = 330
ClientWidth = 5655
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 3750
ScaleWidth = 5655
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton cmdSend
Caption = "Send"
Enabled = 0 'False
Height = 495
Left = 3720
TabIndex = 3
Top = 120
Width = 1215
End
Begin VB.TextBox txtLog
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 3015
Left = 0
Locked = -1 'True
MultiLine = -1 'True
TabIndex = 2
Top = 720
Width = 5655
End
Begin VB.CommandButton cmdClient
Caption = "Client"
Height = 495
Left = 1680
TabIndex = 1
Top = 120
Width = 1215
End
Begin VB.CommandButton cmdServer
Caption = "Server"
Height = 495
Left = 240
TabIndex = 0
Top = 120
Width = 1215
End
Begin MSWinsockLib.Winsock Sock
Left = 360
Top = 1080
_ExtentX = 741
_ExtentY = 741
_Version = 393216
Protocol = 1
End
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Const SERVER_PORT As Long = 10100
Private Const CLIENT_PORT_BASE As Long = 10200

Private LocalPort As Long
Private Clients As Collection


Private Sub cmdClient_Click()
cmdServer.Enabled = False
cmdClient.Enabled = False
LocalPort = CLIENT_PORT_BASE
Do
On Error Resume Next
Sock.Bind LocalPort
If Err.Number = 0 Then
Log "Klient lytter på port " & LocalPort & "."
cmdSend.Enabled = True
Exit Do
End If
LocalPort = LocalPort + 1
Loop Until LocalPort >= 32700
End Sub

Private Sub cmdSend_Click()
Dim Client As Variant
Dim Text As String
If LocalPort = SERVER_PORT Then
For Each Client In Clients
Sock.RemoteHost = Split(Client, ":")(0)
Sock.RemotePort = Split(Client, ":")(1)
Text = "Server tid er " & Format(Now, "hh:nn:ss") & "."
Log Sock.LocalIP & ":" & Sock.LocalPort & " -> " & Sock.RemoteHost &
":" & Sock.RemotePort & " (" & Len(Text) & ") " & Text
Sock.SendData Text
Next
Else
Sock.RemoteHost = "localhost"
Sock.RemotePort = SERVER_PORT
Text = "Klient tid er " & Format(Now, "hh:nn:ss") & "."
Log Sock.LocalIP & ":" & Sock.LocalPort & " -> " & Sock.RemoteHost & ":"
& Sock.RemotePort & " (" & Len(Text) & ") " & Text
Sock.SendData Text
End If
End Sub

Private Sub cmdServer_Click()
cmdServer.Enabled = False
cmdClient.Enabled = False
Set Clients = New Collection
LocalPort = SERVER_PORT
Sock.Bind LocalPort
Log "Server lytter på port " & LocalPort & "."
cmdSend.Enabled = True
End Sub

Private Sub Form_Load()
Randomize
End Sub

Private Sub Sock_DataArrival(ByVal bytesTotal As Long)
Dim Text As String
Sock.GetData Text
If LocalPort = SERVER_PORT Then
UpdateClientlist Sock.RemoteHostIP, Sock.RemotePort
End If
Log Sock.LocalIP & ":" & Sock.LocalPort & " <- " & Sock.RemoteHostIP & ":"
& Sock.RemotePort & " (" & bytesTotal & ") " & Text
End Sub

Private Sub Sock_Error(ByVal Number As Integer, Description As String, ByVal
Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal
HelpContext As Long, CancelDisplay As Boolean)
Log "Error: " & Number & ": " & Description
CancelDisplay = True
End Sub


Private Sub Log(ByVal Text As String)
txtLog.SelStart = Len(txtLog.Text)
txtLog.SelText = vbNewLine & Text
End Sub

Private Sub UpdateClientlist(ByVal IP As String, ByVal Port As Long)
Dim Client As Variant
On Error Resume Next
Client = Clients(IP & ":" & Port)
If Err.Number > 0 Then
Clients.Add IP & ":" & Port, IP & ":" & Port
End If
End Sub
--- klip --- klip --- klip --- klip --- klip --- klip --- klip --- klip ---
klip ---

-------
Tomas


Steen Gellett (10-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 10-01-05 14:57


"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:crsang$1q4p$1@news.cybercity.dk...
> Steen Gellett skrev.
>> ...så jeg vil til enhver tid skrive Instr(1,"String1","String2",0)
>>...måske en dårlig vane, men...
>
> Jeg ville være meget ked af at se ubredt brug af tal-værdier hvor passende
> indbyggede konstanter allerede findes, i projekter hvor flere skal arbejde
> på samme kode. Hvorfor gøre det svært, når det ikke er sværere at gøre det
> let?

Sådan er det med vaner.........

Med fare for at gentage mig selv..........det er kun mig der skal se koden !

>
>
>> gange den string som jeg vil sende så er jeg MEGET lydhør......
>
> Jeg er ikke helt sikker på hvad du mener - kan du uddybe det?

Se lidt længere nede

>
> Problemet med at bruge MS Winsock er at al styring mht. hvornår noget er
> afsendt om det må fragmenteres osv. ligger uden for ens kontrol. Hvis man
> selv koder direkte mod low-level DLL'erne eller kan finde en ActiveX
> kontrol
> som giver en mulighed for at styre den slags, så kan man styre VISSE ting
> i
> forbindelse med afsendelse og modtagelse.

Svar til de 2 forrige afsnit
Der rammer du jo hovedet på sømmet, afsendelse er meget nem at styre,men
modtagelse er fuldstæning umuligt at styre..........hvis jeg kaster 100
snore op
i luften på hver en meters længe, så griber winsock dem som 2-3 stykker snor
på TILSAMMEN 100 meters længe, men hvordan de 2-3 stykker er sat sammen i cm
er IKKE til at hvide...........jeg ville gerne at den også kunne gribe 100
snore på hver 1 meters længe............ Jeg ved godt det kan lade sig gøre
ved at tilføje styrekoder, ( ekstra cm snor med styredata ) men det er ikke
en holdbar løsning......lidt malerisk, men jeg tror du forstår !



>
> Det er dog vigtigt huske på at rent principielt er en socket (som benytter
> TCP-protokollen) én lang strøm af af bytes som sendes fra A til B. At
> disse
> bytes deles op i pakker, er et nødvendigt onde, men rent principielt ikke
> noget man skal "tage sig af" (selvom man i de rette omgivelser rent
> faktisk
> har visse muligheder for at have indflydelse på det).

jeps den er jeg med på..........se ovenstående svar

>
> Jeg satte mig ned og skrev et lille "Client/Server" program som taler
> sammen
> gennem UDP - måske det kan inspirere dig?
>
> Det er samme program som kan have rollen Client eller Server. Der kan kun
> være én Server, men lige så mange Clients som du ønsker.
>

Jeg har måtte redigere lidt i dit udemærket program,da jeg ikke kører VB6.0
men 5.0 Enterprise Edition SP3.......( jeps...lidt oldnordisk, jeg ved det
godt )
Sådan noget som Split kender VB50 ikke. Smart funktion iøvrigt !

Fidusen i dit program er at hver klient får sin egen UDP Local port som den
så lytter på og serveren derefter svarer direkte til den IP / Remoteport,
smart nok. Den er også en måde at løse det på, MEN jeg sidder bag en router
og det gør alle dem jeg kender også, dvs de skal alle åbne en "lang" række
UDP porte i deres router ( de ved jo ikke hvad nr i rækken de er ) og da
der kan være mange clienter bliver det noget skidt !!
Min løsning kræver kun 2 UDP porte åbnet og så kan der være 1000 m.m
clienter som går ind til server...........2 porte er nok !

Men tak fordi du gav dig tid til at lave det lille program, for med fik du
jo faktisk fortalt mig hvorfor min første kode ikke virker............

Det der undrer mig er at :

WSend.RemoteHost = "xxx.xxx.xxx.xxx"
WSend.RemotePort = "8767"
WSend.SendData "CLIENTID:" & "Steen"

ikke er tilstrækkeligt når nu den klient fakstisk findes på den IP og lytter
på den port !.......... IP adressen adskiller jo de forskellige klienter

Hvorimod din kode godt kan have samme IP ( det er den jo når jeg kører 5
instants af din kode på min egen maskine ), men der er det Remoteport der
ændrer sig fra klient til klient ...................og det
virker...........funny ik '









Tomas Christiansen (10-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 10-01-05 22:47

Steen Gellett skrev:
> modtagelse er fuldstæning umuligt at styre..........hvis jeg kaster 100
> snore op i luften på hver en meters længe, så griber winsock dem
> som 2-3 stykker snor på TILSAMMEN 100 meters længe, men
> hvordan de 2-3 stykker er sat sammen i cm er IKKE til at hvide
> ...........jeg ville gerne at den også kunne gribe 100 snore på hver
> 1 meters længe............ Jeg ved godt det kan lade sig gøre ved at
> tilføje styrekoder, ( ekstra cm snor med styredata ) men det er
> ikke en holdbar løsning......

Hvis du bruger TCP og sender 100 pakker, er du ganske sikker på at modtage
de samme 100 pakker i samme rækkefølge som de blev afsendt. Det kan godt
være at Winsock-kontrollen i visse tilfælde giver dig flere pakker på én
gang i samme buffer, men det er jo ikke noget problem, når man fra starten
ved at TCP-kommunikation skal opfattes som en strøm af bytes. Ens eget
protokollag skal naturligvis kunne håndtere dette.

Hvis du bruger UDP og sender 100 pakker, er du ikke ganske sikker på at
modtage de samme 100 pakker og du kan ikke være sikker på at de som
ankommer, kommer i samme rækkefølge som de blev afsendt.

Hvis du i dit eget protokollag sikrer at for hver gang du sender noget, skal
der fra modparten kvitteres for pakken inden der sendes igen, så har du -
uanset om du bruger UDP eller TCP - løst problematikken med flere pakker i
samme modtagebuffer.

Du kan simpelthen bygge et lag mellem Winsock-kontrollen og resten af dit
program, som skal tage sig af sin egen buffering af pakker som skal sendes,
venten på kvitteringer og evt. genfremsendelser i fald du bruger UDP, samt
sikrer at der kvitteres for hver modtagne pakke og at den modtagne pakke
sendes videre til applikationen som ligger ovenpå.

Det lræver selvfølgelig lidt arbejde her og nu, men gør du dit arbejde godt,
vil du kunne genbruge store dele (eller det hele), næste gang du laver en
applikation, som skal kunne håndtere Winsock-kommunikation.

> Fidusen i dit program er at hver klient får sin egen UDP Local port som
den
> så lytter på og serveren derefter svarer direkte til den IP / Remoteport,
> smart nok.

Den eneste grund til at jeg gav hver klient en ny port at lytte på, var at
så kunne man teste flere klienter på samme maskine. Læg mærke til i koden at
klienter startet fra forskellige computere _ikke_ vil få forskellige
portnumre!

> Min løsning kræver kun 2 UDP porte åbnet og så kan der være 1000 m.m
> clienter som går ind til server...........2 porte er nok !

Min løsning kan det samme - blot med én port

> WSend.RemoteHost = "xxx.xxx.xxx.xxx"
> WSend.RemotePort = "8767"
> WSend.SendData "CLIENTID:" & "Steen"
>
> ikke er tilstrækkeligt når nu den klient fakstisk findes på den IP og
lytter
> på den port !.......... IP adressen adskiller jo de forskellige klienter

Der er mindst én ganske alvorlig fejl i Winsock-kontrollen som først blev
rette i sidste eller næstsidste service pack til VB 6/VS 6. Om disse fejl er
rettet i VB 5 ved jeg faktisk ikke!

Så vidt jeg husker går fejlen går fejlen ud på at hvis flere klienter
forbinder sig til en server via TCP, og serveren lytter med én Winsock og
åbner hver ny forbindelse på en ny Winsock (for ikke at blokere "lytte"
Winsock'en) - dette er faktisk standardmåden at kode en server service med
socket-programmering - så "glemte" Winsock-kontrollen vigtige informationer
om de først oprettede forbindelser og ville absolut - og helt uforståeligt -
kun tale over den senest oprettede forbindelse.

Dit problem ligner dog godt nok en del.

Ku' du ikke lige lave en kort stump kode som med sikkerhed viser problemet.
Så kan jeg afprøve det på en VB 6 med service pack 6 på, og konstatere om
det er den omtalte fejl som du er rendt ind i!

-------
Tomas


Steen Gellett (11-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 11-01-05 15:34

> Du kan simpelthen bygge et lag mellem Winsock-kontrollen og resten af dit
> program, som skal tage sig af sin egen buffering af pakker som skal
> sendes,
> venten på kvitteringer og evt. genfremsendelser i fald du bruger UDP, samt
> sikrer at der kvitteres for hver modtagne pakke og at den modtagne pakke
> sendes videre til applikationen som ligger ovenpå.

Jeps....det har jeg brugt i mit filoverførsels program som jeg har lavet, og
den teknik virker, man skal bare holde tungen lige i munden. En forkert
byte, og en exe fil er død efter overførsel.....

> Det lræver selvfølgelig lidt arbejde her og nu, men gør du dit arbejde
> godt,
> vil du kunne genbruge store dele (eller det hele), næste gang du laver en
> applikation, som skal kunne håndtere Winsock-kommunikation.

Enig..........

> Den eneste grund til at jeg gav hver klient en ny port at lytte på, var at
> så kunne man teste flere klienter på samme maskine. Læg mærke til i koden
> at
> klienter startet fra forskellige computere _ikke_ vil få forskellige
> portnumre!

Ups........havde ikke lige set at den inc din LocalPort med 1 hvis den er i
brug........indtil den finder en "ledig" port.......sorry


Min winsock er version 6.0 SP5........og den virker, for jeg har fundet
fejlen i mit program.........hold kæft hvor kan man være blind.........

Du havde ikke mulighed for at gennemskue min brøler, da du aldrig har set
client delen af mit program, men jeg havde ikke sat den til at "lytte" , jeg
troede fejlagtigt at når server havde "modtaget" min CLIENTID: og svaret
tilbage ( hvilket jo alle mine klienter modtog fint ) så var den hellige
grav ok.
Alle klienter modtog jo "SERVERID" efterhånden som de "connectede" og det
vel at mærke uden at de lyttede...........men til sidst er det kun den sidst
ankomne klient som server kunne sende oplysninger til !!

Men nu har jeg sat den til at lytte på port "8768" når den starter
clientdelen og så virker alting............( server lytter jo på min port
8767 )

PS: det er mit første forsøg ud i at udnytte UDP protokollen så hav
tålmighed med mig, men som man siger........man lærer sgu hver dag

PPS. Da du skrev at dit program gav samme UDP port på alle clienter
medmindre det var samme pc, så viste jeg, at så skulle mit program da også
virke...........( med en mindre modificering ..hehe )







>
> -------
> Tomas
>



Steen Gellett (11-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 11-01-05 15:43

Her er koden...........det er kogt sammen til ET program nu........det er
den kode jeg lige har lavet idag for at "knække" hvorfor den andet ikke
virkede


Bemærk at jeg har XXX min ip adresse ud af koden.............det er den ip
adresse som clienter connecter til !


Option Explicit
Dim Server As Boolean
Dim X As Integer
Private Sub cmdClient_Click()
Server = False
WSock.Close
WSock.RemoteHost = "XXX.XXX.XXX.XXX" ' her står min IP adresse
WSock.RemotePort = "8767"
WSock.SendData "CLIENT:"
cmdClient.Enabled = False
cmdServer.Enabled = False
cmdSend.Caption = "Send hilsen til server"
cmdSend.Enabled = True
WSock.Close '
WSock.Bind "8768" ' Det var disse 2 linier jeg IKKE havde med
End Sub

Private Sub cmdSend_Click()
If Server = False Then
WSock.RemotePort = "8767"
WSock.SendData "En hilsen fra din client"
Exit Sub
End If
For X = 0 To ListIP.ListCount - 1
ListIP.ListIndex = X
WSock.RemotePort = "8768"
WSock.RemoteHost = ListIP.Text
WSock.SendData "En hilsen fra din server"
Next
End Sub

Private Sub cmdServer_Click()
Server = True
WSock.Close
WSock.Bind "8767"
cmdClient.Enabled = False
cmdServer.Enabled = False
cmdSend.Caption = "Send hilsen til clienter"
cmdSend.Enabled = True
End Sub

Private Sub WSock_DataArrival(ByVal bytesTotal As Long)
Dim IND As String
WSock.GetData IND
If InStr(1, IND, "CLIENT:", 0) Then
ListIP.AddItem WSock.RemoteHostIP
Exit Sub
End If
listHilsen.AddItem IND
End Sub




Tomas Christiansen (11-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 11-01-05 22:49

Steen Gellett skrev:
> Bemærk at jeg har XXX min ip adresse ud af koden.............det er den ip
> adresse som clienter connecter til !

....og her er koden som jeg ville have skrevet den - sådan ca. ihvertfald

Ændringerne er bl.a:
- portnummer ændret til integer i stedet for string (det skal være
integer).
- Server er et dårligt navn til en Boolsk variabel.
- Klientens lytte-port bindes INDEN den sender til serveren - tænk hvis
serveren har i sinde at svare tilbage med det samme?
- Serveren svarer nu tilbage på klientens første meddelelse - så man ved om
man rent faktisk fik kontakt med serveren.
- Brugen af Exit Sub og Exit Function bør minimeres idet ofte den leder til
dårlig kode, kode som let vil kunne fejle når der senere ændres og kode som
_kan_ være sværere at læse (det er dog ikke altid sådan - f.eks. er den OK
lige før - og måske i - en fejlhåndteringsrutine).
- Strenge som genbruges flere steder og som har betydning for programmets
logik bør _ikke_ håndkodes hver sted, men bør defineres i en konstant.
- Der er ingen grund til at bruge InStr, som er ret "dyr" mht.
CPU-instruktioner - især når strengen ikke findes, på hver eneste indkomne
pakke både hos klient og server. En simpel direkte strengsammenligning
"koster" til gengæld næsten ingenting.

Option Explicit

Private Const CLIENT_ID As String = "::CLIENT::"
Private Const SERVER_ID As String = "::SERVER::"

Private IsServer As Boolean

Private Sub cmdClient_Click()
IsServer = False
WSock.Close
WSock.Bind 8768
WSock.RemoteHost = "localhost"
WSock.RemotePort = 8767
WSock.SendData CLIENT_ID
cmdClient.Enabled = False
cmdServer.Enabled = False
cmdSend.Caption = "Send hilsen til server"
cmdSend.Enabled = True
End Sub

Private Sub cmdSend_Click()
Dim ClientNo As Long
If IsServer Then
For ClientNo = 0 To ListIP.ListCount - 1
WSock.RemoteHost = ListIP.List(ClientNo)
WSock.RemotePort = 8768
WSock.SendData "En hilsen fra din server"
Next
Else
WSock.RemotePort = 8767
WSock.SendData "En hilsen fra din klient"
End If
End Sub

Private Sub cmdServer_Click()
IsServer = True
WSock.Close
WSock.Bind 8767
cmdClient.Enabled = False
cmdServer.Enabled = False
cmdSend.Caption = "Send hilsen til klienter"
cmdSend.Enabled = True
End Sub

Private Sub WSock_DataArrival(ByVal bytesTotal As Long)
Dim InputBuf As String
WSock.GetData InputBuf
If IsServer And InputBuf = CLIENT_ID Then
ListIP.AddItem WSock.RemoteHostIP
WSock.RemotePort = 8768
WSock.SendData SERVER_ID
ElseIf Not IsServer And InputBuf = SERVER_ID Then
listHilsen.AddItem "Er i kontakt med server!"
Else
listHilsen.AddItem InputBuf
End If
End Sub

-------
Tomas


Steen Gellett (12-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 12-01-05 13:12


"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:cs1i8a$206r$1@news.cybercity.dk...
>
> ...og her er koden som jeg ville have skrevet den - sådan ca. ihvertfald
>
>
> - Serveren svarer nu tilbage på klientens første meddelelse - så man ved
> om
> man rent faktisk fik kontakt med serveren.

Den kode er bakset sammen udelukkende til test.......i det rigtige program
sender clienten "CLIENTID:" & localhostname .....derfor kom jeg også til at
bruge instr længere nede i koden.......da en sammenligning ikke duer her da
localhost jo er ukendt....når så min server modtager CLIENTID: sender den
STRAKS en SERVERID: til clienten...........og her modtager clienten faktisk
det der komme fra serveren UDEN AT DEN HAR BIND........det var jo det jeg
skrev i mit forrige svar.........og det var jo det der var HELE humlen i mit
problem at client netop modtag svar.........men bare IKKE når der imellem
tiden var andre der havde connected............. jeg troede jo så at alting
var iorden når den nu havde "modtaget" svar en gang...........


> - Der er ingen grund til at bruge InStr, som er ret "dyr" mht.

se svar længere oppe


> WSock.RemoteHost = "localhost"
> WSock.RemotePort = 8767

Kan du ikke forklare mig denne linie : WSock.remoteHost = "localhost"
Den fatter jeg ikke en brik af............hvordan finder den min pc over
internettet uden at få en ipadresse ???






Tomas Christiansen (12-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 12-01-05 14:55

Steen Gellett skrev:
> Den kode er bakset sammen udelukkende til test.......i det rigtige program
> sender clienten "CLIENTID:" & localhostname .....derfor kom jeg også til
at
> bruge instr længere nede i koden.......da en sammenligning ikke duer her
da
> localhost jo er ukendt....

Hmm? Jeg er ikke sikker på at jeg forstår dig helt!
De første X tegn i bufferen vil jo netop være "CLIENTID:", hvorfor InStr er
unødvendig.

> > WSock.RemoteHost = "localhost"
> > WSock.RemotePort = 8767
>
> Kan du ikke forklare mig denne linie : WSock.remoteHost = "localhost"
> Den fatter jeg ikke en brik af............hvordan finder den min pc over
> internettet uden at få en ipadresse ???

Jeg har sat hostnavnet på _min_ server ind, da du jo ikke vil oplyse din
IP-adresse
(Mon ikke man kunne finde ud af den alligevel ved lidt ihærdigt arbejde...)

Da jeg afvikler server og klient fra samme computer er det letteste da at
bruge "localhost" eller "127.0.0.1" om man vil bruge en IP-adresse. Den
virke hver gang (undtagen efter udvalgte Service Packs eller udvalgte andre
opdatering til udvalgte Windows-versioner ... suk).

-------
Tomas



Steen Gellett (12-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 12-01-05 15:38


"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:cs3a7e$phs$1@news.cybercity.dk...
> Steen Gellett skrev:
>> Den kode er bakset sammen udelukkende til test.......i det rigtige
>> program
>> sender clienten "CLIENTID:" & localhostname .....derfor kom jeg også til
> at
>> bruge instr længere nede i koden.......da en sammenligning ikke duer her
> da
>> localhost jo er ukendt....
>
> Hmm? Jeg er ikke sikker på at jeg forstår dig helt!
> De første X tegn i bufferen vil jo netop være "CLIENTID:", hvorfor InStr
> er
> unødvendig.

Jeg skriver jo netop at mit "rigtige" program vil sende "CLIENTID:SteenXp"
( SteenXP er min pc's navn = localhostname) og du kan jo ikke sammenligne
CLIENTID: med CLIENTID:SteenXP for en match....!!!

Som jeg skriver.........jeg kom til at bruge det i denne stump kode, men i
mit "rigtige" program er jeg jo nødt til at bruge instr............
Jeg har en fornemmelse af at du IKKE læser alt hvad jeg skriver ??


>> > WSock.RemoteHost = "localhost"
>> > WSock.RemotePort = 8767
>>
>> Kan du ikke forklare mig denne linie : WSock.remoteHost = "localhost"
>> Den fatter jeg ikke en brik af............hvordan finder den min pc over
>> internettet uden at få en ipadresse ???
>
> Jeg har sat hostnavnet på _min_ server ind, da du jo ikke vil oplyse din
> IP-adresse
> (Mon ikke man kunne finde ud af den alligevel ved lidt ihærdigt
> arbejde...)

Du er sgu en underlig snegl.............hvad skulle du dog bruge den til ??
Man oplyser aldrig sin IP eller for den sags skyld andres IP i newsgroup !!
Hvorfor dog ikke bare bruge mine "XXX" er................??




Tomas Christiansen (12-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 12-01-05 22:55

Steen Gellett skrev:
> Jeg skriver jo netop at mit "rigtige" program vil sende "CLIENTID:SteenXp"
> ( SteenXP er min pc's navn = localhostname) og du kan jo ikke sammenligne
> CLIENTID: med CLIENTID:SteenXP for en match....!!!

Jo man kan. På flere forskellige måder endda! I min kode er et eksempel på
en meget simpel metode. Jeg kan godt skitsere flere andre metoder hvis du er
interesseret.

> mit "rigtige" program er jeg jo nødt til at bruge instr............

Ud fra de oplysninger du har givet gennem denne nyhedsgruppe er svaret klart
nej. Har du yderligere oplysninger, som kan lede til en anden konklusion, så
host op med dem

> Jeg har en fornemmelse af at du IKKE læser alt hvad jeg skriver ??

Hvorfor dog det? Læste du da det kodeeksempel jeg postede?

> Du er sgu en underlig snegl.............hvad skulle du dog bruge den til
??
> Man oplyser aldrig sin IP eller for den sags skyld andres IP i newsgroup
!!

Jeg skal ikke bruge din IP-adresse til nogetsomhelst, og jeg ønsker ikke at
finde den, men den som måtte ønske det og som måtte have ondt i sinde finder
den nok alligevel. Du bør derfor sikre dig med mere end blot XXX'er i et
indlæg i en nyhedsgruppe. Prøv at læse lidt mellem linierne og tag ikke alt
for pålydende - der er jo ofte en dybere mening også med humor.

> Hvorfor dog ikke bare bruge mine "XXX" er................??

Mener du hvorfor jeg ikke skrev XXX'er i min kode? Tja... hvorfor skulle
jeg?
Jeg præsenterede et kodeeksempel som kan testes på én maskine uden at man
behøver at rette i koden. Hvis man vil sætte det i produktion, skal man
naturligvis rette til "serverens" offentlige IP-adresse.

-------
Tomas


Tomas Christiansen (13-01-2005)
Kommentar
Fra : Tomas Christiansen


Dato : 13-01-05 09:29

Jeg skrev:
> Jo man kan. På flere forskellige måder endda! I min kode er et eksempel på
> en meget simpel metode. Jeg kan godt skitsere flere andre metoder hvis du
er
> interesseret.

Undskyld! Det gik lige op for mig at det rigitg nok står i mit VB-projekt,
men jeg har ikke fået det publiceret ud nyhedgruppen, så jeg kan godt forstå
at du ikke forstår hvorfor jeg ikke forstår at du ikke forstår hvordan man
kan undgår at bruge InStr (måske 3,5 times søvn alligevel er _for_ lidt...).

Lad mig (efter en god nats søvn) derfor komme med et par eksempler:

Private Const CLIENT_ID As String = "CLIENT:"

WSock.GetData InputBuf

If Left(InputBuf, Len(CLIENT_ID)) = CLIENT_ID Then

If InputBuf Like CLIENT_ID & "*" Then

-------
Tomas



Steen Gellett (13-01-2005)
Kommentar
Fra : Steen Gellett


Dato : 13-01-05 10:39

>
> WSock.GetData InputBuf
>
> If Left(InputBuf, Len(CLIENT_ID)) = CLIENT_ID Then
>
> If InputBuf Like CLIENT_ID & "*" Then
>

Tak så foretrækker jeg alligevel Instr................skulle den så bruge
0,00000000000001 % mere CPU ja så tror jeg ikke at jeg sover dårligere om
natten af den grund...............

På dit spørgsmål om jeg læste dit program eksempel ja så må jeg igen sige :
Gad vide om du læser det jeg skriver..........flere steder påpeger jeg at
det var din kode der bragte mit på rette vej; til at finde fejlen i mit
program !!!!!!!!!!!

Dette bliver mit sidste indlæg i denne omgang, tak fordi du "næsten" læste
alt hvad jeg havde på hjertet, og tak fordi du ledte mig på rette
vej......håber mit lille "game" kommer til at virke som det skal

Venlig hilsen Steen

> -------
> Tomas
>
>



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste