Network UDP Problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Network UDP Problem

Beitrag von Joshua314 »

Hallo zusammen,

ich will hier eine Anbindung an eine Vorhandene Anwendung schreiben.
Die Verbindung steht wenn ich die Anwendungen regulär aufrufe.
Jetzt mein Problem

Code: Alles auswählen

*mem = AllocateMemory(1000)

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

zweite = OpenNetworkConnection("192.68.20.60",98,#PB_Network_UDP)

For i = 0 To 16
 Read zelle.b
 Debug zelle
 PokeB(*mem+i , zelle)
Next I 
  

  While 1= 1 
   If Zweite 
    senden = SendNetworkData(zweite, *mem, 17)
    Debug senden 
    Delay(200)
   EndIf 
  Wend 
  
End  

DataSection

Data.b 138,132,96,156,158,138,236,136,142,106,154,160,162,97,63,229,126,0


[quote][/quote]
Wenn ich diese hier starte PB4.2
bekomme ich eine Verbindung auf dem Port 1339 nicht wie angegeben auf Port 98. Ich habe zum Test einen PB Server auf dem Gegenrechner laufen lassen. Der läuft laut Quelltext auf dem Port98.

Wenn ich aber den Port abfrage kommt hier auch der Port 1339
das gleiche meldet auch TCPview von Mircosoft
Hier die Empfänger Soft.

Code: Alles auswählen

*mem = AllocateMemory(1000)


If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

zweite = OpenNetworkConnection("192.68.20.4",99,#PB_Network_UDP)


ConnectionID = CreateNetworkServer(0, 98,#PB_Network_UDP)
If ConnectionID
  ;MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  ;Debug ConnectionID 
  While 1= 1 
  
  
  
  help =NetworkServerEvent() 
  If Help = #PB_NetworkEvent_Data      
   ;Debug help 
  ClientID = EventClient()
  IP = GetClientIP(Clientid) 
  Debug IPString(ip)
  Port = GetClientPort(Clientid) 
  Debug port 

  ;Debug ClientID
    Ergebnis = ReceiveNetworkData(ClientID, *mem, 1000)
    Debug ergebnis
    For I = 0 To ergebnis 
     Debug PeekB(*mem+i) &255
     ;Debug Chr((PeekB(*mem+i) &255)/2)
    Next i
  
  
    
    ;Debug zweite 
    ;Debug ergebnis
    ;If Zweite =
     ;PokeB(*mem,PeekB(*mem)+2)
     ;senden = SendNetworkData(zweite, *mem, ergebnis)
     ;Debug senden 
     ;Delay(200)
     ;CloseNetworkConnection(zweite)
      ;EndIf 
  
  
  
    EndIf      
  
     

     
  
  
  
  Wend 
  
  
  
  ;SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
    
  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
  
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
  
End  
Was geht da schief ???? Weil bei der Anwendung auf Port 98 komme ich nicht an ....
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Hallo. Ich habe leider nicht kapiert ob der Code und das mit dem anderen Programm nun klappt oder nicht. Ich vermute du meist es klappt zwar, aber ein "falscher Port" wird genutzt!!? Meinst du das so?

GetClientPort() gibt NICHT den Port am eigenen Rechner an, also da wo man GetClientPort aufruft. Sie gibt den Port an von dem der andere Rechner wählt. Der wird normaler Weise zufällig gewählt. Öfnest du von deinem Clienten mit selben Code gleichzeitig eine zweite Verbindung, dann sollte die noch einen anderen Port nutzen.

Viele denken wenn der Server auf Port 98 empfängt, dann muß der Client auch auf 98 senden. Das stimmt nicht. Sende und Empfangsport müssen nicht übereinstimmen und tun es in der Regel auch nicht.

So habe ich das bisher auf jeden Fall im Hinterkopf.
Gruß
Toshy
[edit:] Nebenbei bemerkt: bei den Networkfunktionen immer an die Firewalls denken. Falls was nicht ankommt die Einstellunge ansehen und notfalls mal die Internetverbindung unterbrechen und dann auf beiden Rechnern die Firewalls abschalten.
Nochetwas. Zum testen kann und sollte man anfangs den Server und Clienten auf dem selben Rechner haben und am besten mit der Loopbackadresse probieren. Da kann man schnelelr Fehler ausschließen.
127.0.0.1 (standart) ist die Adresse des eigenen Rechners. Alle Daten an diese IP gehen ohne über das Netzwerk zu laufen an den eigenen Rechner. Gut zum testen.
1. Win10
PB6.1
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

RE: aber die andere Anwendung sieht es nicht

Beitrag von Joshua314 »

Toshy hat geschrieben:Hallo. Ich habe leider nicht kapiert ob der Code und das mit dem anderen Programm nun klappt oder nicht. Ich vermute du meist es klappt zwar, aber ein "falscher Port" wird genutzt!!? Meinst du das so?
Also mit der Hauptanwendung klappt es leider nicht. Die Haptanwednung macht keine Anstalten was anzunehmen. Firewall ist auszuschliessen, da es zwischen 2x Hauptanwendung klappt bzw. ich auch mal die Firewall abgeschalten habe.
GetClientPort() gibt NICHT den Port am eigenen Rechner an, also da wo man GetClientPort aufruft. Sie gibt den Port an von dem der andere Rechner wählt. Der wird normaler Weise zufällig gewählt. Öfnest du von deinem Clienten mit selben Code gleichzeitig eine zweite Verbindung, dann sollte die noch einen anderen Port nutzen.
Der Port bestimmt meines Wissen den Weg zur Applikation sprich würde sich jeweils einfach einen Port suchen würden die jeweiligen Applikationen nie zueinander finden.
Viele denken wenn der Server auf Port 98 empfängt, dann muß der Client auch auf 98 senden. Das stimmt nicht. Sende und Empfangsport müssen nicht übereinstimmen und tun es in der Regel auch nicht.
ok....
So habe ich das bisher auf jeden Fall im Hinterkopf.
Gruß
Toshy
[edit:] Nebenbei bemerkt: bei den Networkfunktionen immer an die Firewalls denken. Falls was nicht ankommt die Einstellunge ansehen und notfalls mal die Internetverbindung unterbrechen und dann auf beiden Rechnern die Firewalls abschalten.
Nochetwas. Zum testen kann und sollte man anfangs den Server und Clienten auf dem selben Rechner haben und am besten mit der Loopbackadresse probieren. Da kann man schnelelr Fehler ausschließen.
127.0.0.1 (standart) ist die Adresse des eigenen Rechners. Alle Daten an diese IP gehen ohne über das Netzwerk zu laufen an den eigenen Rechner. Gut zum testen.
Das ist klar nur wenn ich zwei Rechner habe nehme ich die auch .
Habs aber mit dem localhost eben auch probiert ---> ging auch nicht
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hi Joshua314,

ich hab deinen code mal ausprobiert, aber der verschluckt sich bei mir gleich mal bei der for - read - next schleife.
jetzt hab ich

Code: Alles auswählen

Read zelle.b
mal durch

Code: Alles auswählen

Read.b zelle
ersetzt und schon scheint alles zu funktionieren.

mfG
tobe
PureBasic 4.40 (Windows - x86)
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Beitrag von Joshua314 »

tobe hat geschrieben:hi Joshua314,

ich hab deinen code mal ausprobiert, aber der verschluckt sich bei mir gleich mal bei der for - read - next schleife.
jetzt hab ich

Code: Alles auswählen

Read zelle.b
mal durch

Code: Alles auswählen

Read.b zelle
ersetzt und schon scheint alles zu funktionieren.

mfG
tobe
Hallo Tobe,

also ja stimmt Version4.2 zu 4.3 da ist es gedreht worden....
ja ich weis, PB zu PB geht nur PB zur Anwendung geht nicht ....
Das ist mein Problem ---- Sprich er kommt nicht auf PORT 98 raus
und meine Anwendung ist auf Port 98

Szenario Amateurfunk PC-Flexnet AXupd port 98
Nur wird das euch wenig sagen .....

Gruß Thomas
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

achso, ja wenn so in PB alles funktioniert dann liegt es wohl eher an der Anwendung, bzw an der kommunikation mit dieser und da kommen wir an den punkt wo man mehr über die Anwendung wissen müsste, aber so spontan hab ich da gleich mal garnix gefunden.
hast du schonmal probiert mit deiner Anwendung auf einen PB server zu verbinden, weil so könnte man testen ob die Anwendung irgendwelche spezielle daten zum kommunikationsaufbau verschickt bzw erwartet.
PureBasic 4.40 (Windows - x86)
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Das ist klar nur wenn ich zwei Rechner habe nehme ich die auch .
Und genau das ist oft ein Fehler.
Meißt sind zwei Rechner ja über einen Router verbunden (wenn auch nicht immer), sei es auch über WLAN, und schon hauen Test oft nicht hin. Wer weiß wo der Router aus Sicherheit blockt (Routerinterne Firewall, Fehleinstellungen........)
Alles außer der Loopbackadresse (nicht localhost) hat mich schon Wochen gekostet. localhost sollte zwar auch gehen, allerdings da der Name aufgelöst werden muß hat man automatisch wieder eine weitere Mögliche Fehlerquelle.

Also man muß erstmal Schritt für Schritt Fehler ausschließen. Gehe an den Rechner wo das externe Programm (der UDP-Server drauf ist, diese Funkding) und teste nur an dem Rechner mit der IP 127.0.0.1. Schalte dort mal alle Firewalls ab und nimm zum testen nur die in der Hilfe mitgelieferten Codes. Einfach den Standartclienten der PBhilfe nehmen, Port auf 98, IP auf 127.0.0.1 setzten, starten und sagen was passiert.
Es ist im Grunde egal, daß dort dann keine korrekten Daten gesendet werden, erstmal schauen was überhaupt passiert.

Gibt dann noch mal die Infos zu dem Testrechner (Betriebssystem, Sicherheitssoftware [Firewall,Defende]) und dann schauen wir weiter.

[edit]
Zitat:

GetClientPort() gibt NICHT den Port am eigenen Rechner an, also da wo man GetClientPort aufruft. Sie gibt den Port an von dem der andere Rechner wählt. Der wird normaler Weise zufällig gewählt. Öfnest du von deinem Clienten mit selben Code gleichzeitig eine zweite Verbindung, dann sollte die noch einen anderen Port nutzen.


Der Port bestimmt meines Wissen den Weg zur Applikation sprich würde sich jeweils einfach einen Port suchen würden die jeweiligen Applikationen nie zueinander finden.
Ja das schon, allerdings gibt man meißt nur den EMpfangsport an. Port 98 bedeutet halt das die Daten AN den Port 98 des anderen Rechners gesendet werden. Der Sendeport ist dabei egal. Der wird wohl nur benötigt, damit "auf selber Verbindung" datein zurück gesendet werden können. Wenn ein Server eine Verbindung annimmt muß man ja nicht mit "opennetworkconnection" eine Verbdinung zum "Clienten" erstellen sondern kann gleich zurück senden. Man nimmt halt die ClientID. Das senden über diese "Verbindung" geht dann automatisch auf den vom Clienten genutzen "Sendeport" und dass kann dann auch Port 1339 oder sonst einer. Die Serverports sind sozusagen nur die erste Anlaufstelle, ein Besuchsdatenblock weiß dann wo er erstmal hin soll und der Sagt dann dem Gastgeberserver wo er selber Wohnt und in welchen Stock es geht ;-)
Ich bin auch ssseeehr lange davon ausgegangen das Sende und Empfangsport der gleich sein müssen, dann ne Weile das der Sendeport IMMER zufällig ist und jetzt glaube ich zu wissen das der Sendeport normaler weise zufällig gewählt wird (was halt frei ist) ABER auch fest vergeben werden kann (allerdings nicht mit PBfunktionen), was aber normal unterlassen werden sollte.
1. Win10
PB6.1
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

re:

Beitrag von Joshua314 »

Hallo Zusammen,

hier nochmals ....

Also firewall schliesse ich komplett aus.....
Denn die Anwendung arbeitet auf beiden Rechner.....
Wenn ich die Anwendungen die Verbindung auf Port 98 herstellen lasse, geht es auch ......
im TCP View schaut das auch so aus...

Proc Protokoll Local Adress Remote Adress
flexctl.exe:2444 UDP 0.0.0.0:98 *:*
also hier funktioniert es

Proc Protokoll Local Adress Remote Adress
PureBasic_Compilation0.exe:2824 UDP 0.0.0.0:2872 *:*
hier geht es nicht

So schaut das Ganze mit Purebasic aus

Code: Alles auswählen

*mem = AllocateMemory(1000)

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

zweite = OpenNetworkConnection("192.68.20.60",98,#PB_Network_UDP)

For i = 0 To 16
 Read zelle.b
 Debug zelle
 PokeB(*mem+i , zelle)
Next I 
  

  While 1= 1 
   If Zweite 
    senden = SendNetworkData(zweite, *mem, 17)
    Debug senden 
    Delay(200)
   EndIf 
  Wend 
  
End  

DataSection

Data.b 138,132,96,156,158,138,236,136,142,106,154,160,162,97,63,229,126,0

Und hier nochmal der Code Dazu........

Also der geht auf Port 2872 raus und nicht auf 98 ....
Das ist mein Problem ......


Gruß Thomas
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Über Localhost, UDP Port 98 funktioniert problemlos, getestet mit PB4.20
und PB4.30. WindowFirewall einmal bestätigt und gut ist. Wenn das geht
und das andere nicht, liegts am Netzwerk, nicht an PB.

PB ändert den Port nicht, meldet höchsten wenn er bereits besetzt ist, beim
Server erstellen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Denke ich auch. Portforwarding oder so.

Also ich kann es nur ein letztes Mal sagen, nimm localhost bzw. am besten "127.0.0.1", also auf dem selben Rechenr testen, schalte die Firewall aus und dann noch mal melden. Die Ausrede mit "Firewall schließe ich aus weil die anderen Programme gehen" ist leider falsch. Die meißten Firewalls kann man ja für eingehende und ausgehende Daten konfigurieren. Und das bedeutet für jede Software auf dem REchner wird was anderes gespeichert. Wenn die "Originalsoftware" nicht geblockt wird, heißt es noch lange nicht das deine Software geht. Denke daran, daß viele oft 3 Firewall bzw. 5 laufen haben. Oft läuft immer die Windowdfirewall (bei zwei REchnern schon mal zwei Stück), dann oft noch jeweils ne externe Firewall und oft im Router. Daher teste ich bei sowas (wenn Fehler auftreten) immer mit der LoopbackIP.

Gerade da der Port laut TCPview wohl wirklich geändert wird scheint es am Portforwarding oder ähnlichem zu liegen zu liegen.

Es kann ja nicht so kompliziert sein, dein PBprogramm mal auf dem Zielrechner (Server) zu starten, die LoopbackIP zu nutzen und dabei die Firewall(s) abzuschalten. Ein Bug in PB ist natürlich immer mal möglich, aber so kann man halt mal Fehler eingrenzen.

Bei den beiden TCPview Angaben von dir, waren beide Clienten (flexctl und PB) auf dem selben Rechner oder hast du auf unterschiedlichen Geräten gestartet?

Ich ärgere mich auch gerde mit einigen NEtzwerk und Threaddingen rum ;-)
1. Win10
PB6.1
Antworten