Gleichzeitig Server UND Client?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Gleichzeitig Server UND Client?

Beitrag von Kiffi »

Hallo,

ich möchte gerne ein Kommunikationssystem schreiben, mit dem die
Kollegen unserer Firma im Intranet kleine Nachrichten austauschen können
(kein Chat!). Hierbei soll es keinen zentralen Server geben, an dem sich die
Clients anmelden können. Es soll vielmehr so sein, dass jeder Client
gleichzeitig auch Server sein soll.

Die Netzwerk-Befehle von PB sind mir insoweit bekannt. Leider fehlt mir noch
das Grundkonzept zum Projekt. Wie z.B. findet ein gerade gestarteter Client
die anderen Clients im Netzwerk?

Danke im voraus & Grüße ... Kiffi
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

Mit PB kann ich da nicht helfen, aber mit Netzwerk schon:

Mit "net view" siehst du alle Computer und mit "net send" kannst du dann quasi ein broadcast an alle senden.

Das wäre auch das Prinzip für dein Prog. Einmal Rundsendung und gucken wer antwortet.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ist alles machbar. Ich hate auch mal ein Code um alle PCs in einem Netzwerk aufzuliste (verdammt habt den verschuselt :( ). ich such den mal ;).
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> ich such den mal ;)

halt! Den habe ich schon ;)

Grüße ... Kiffi
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Zu spät -_-. Hab schon was auf VB gefunden ~_~...
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

MVXA hat geschrieben:Zu spät -_-. Hab schon was auf VB gefunden ~_~...
:)

so, hier mein bisher zusammengeklauter Code:

Code: Alles auswählen

NewList IntranetComputer.s()

Structure SERVER_INFO_101
  dwPlatformId.l
  lpszServerName.l
  dwVersionMajor.l
  dwVersionMinor.l
  dwType.l
  lpszComment.l
EndStructure

#MAX_PREFERRED_LENGTH = -1
#SV_TYPE_ALL          = $FFFFFFFF
#NERR_SUCCESS         = 0
#ERROR_MORE_DATA      = 234


Procedure GetLANList() 
  
  ; by Rings
  
  ClearList(IntranetComputer())
  
  se101.SERVER_INFO_101
  nStructSize = SizeOf(SERVER_INFO_101)
  RetCode = NetServerEnum_(0, 101, @bufptr, #MAX_PREFERRED_LENGTH, @dwEntriesread, @dwTotalentries, #SV_TYPE_ALL, 0, @dwResumehandle)
  
  If RetCode = #NERR_SUCCESS And RetCode <> #ERROR_MORE_DATA 
	  ;Loop through And the Data in the memory
	  For i = 0 To dwEntriesread - 1
      
      CopyMemory( bufptr + (nStructSize * i), @se101, nStructSize)
      Buffer.s=Space(512)
      Result=WideCharToMultiByte_(#CP_ACP ,0 ,se101\lpszServerName, 255, @Buffer.s, 512, 0, 0)
      
      AddElement(IntranetComputer())
      IntranetComputer() = Buffer
      
    Next
  EndIf
  
  NetApiBufferFree_(bufptr)
  
  FirstElement(IntranetComputer())
  
EndProcedure

StartZeit = ElapsedMilliseconds()  

GetLANList()

InitNetwork()

While NextElement(IntranetComputer())

  ConnectionID = OpenNetworkConnection(IntranetComputer(), 1701) 
  
  Debug IntranetComputer() + ": " + Str(ConnectionID)

  If ConnectionID
    CloseNetworkConnection(ConnectionID)
  EndIf
  
Wend

EndeZeit = ElapsedMilliseconds()  

Debug "Ready " + Str(CountList(IntranetComputer())) + " scanned in " + Str(EndeZeit - StartZeit) + " Milliseconds"
Zur Erklärung: Zuerst ermittel ich die im Intranet verfügbaren Rechner
und trage sie dann in eine LinkedList ein. Danach muss ich alle Rechner
'anpingen', um herauszufinden, von welchem ich ein Antwort bekomme
(die Rechner, auf denen mein Programm aktiv).

Gut, das ermitteln der Rechnerliste funktioniert gut und schnell. Leider
verbrät die meiste Zeit beim 'anpingen' (35 Rechner werden in knapp 80
Sekunden durchsucht). Geht das nicht evtl. schneller?

Danke & Grüße ... Kiffi
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Geht das nicht evtl. schneller?
Versuche alle Rechner gleichzeitig anzupingen und nicht nacheinander. So müsste das sehr schnell gehen. Eine Möglichkeit das zu machen, wäre mit Threads zu arbeiten.

Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Versuche alle Rechner gleichzeitig anzupingen und nicht nacheinander.
> So müsste das sehr schnell gehen. Eine Möglichkeit das zu machen,
> wäre mit Threads zu arbeiten.

joh, habe ich in der Zwischenzeit nun auch gemacht. Bin von 80 auf 20
Sekunden gekommen. Bis auf 2 Rechner reagieren alle anderen im
Sekundenbruchteil. Die zwei lahmen Rechner werde ich mit Ausschlussliste
aus dem Ping verbannen.

Danke & Grüße ... Kiffi
Antworten