Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

TSNE_v3 Variablen zwischen 2 Clients austauschen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sveen



Anmeldungsdatum: 31.10.2018
Beiträge: 4

BeitragVerfasst am: 31.10.2018, 20:23    Titel: TSNE_v3 Variablen zwischen 2 Clients austauschen Antworten mit Zitat

Kurz Frage an alle die sich mit TSNE auskennen. Ich wollte fragen ob mir jemand (wenn das schnell möglich ist) einen Beispiel Client / Server programmieren könnte in dem man beim ersten Client was reinschreiben kann und das dann vom Server auf den anderen Client übertragen wird.

Ich bin kein Programmierer und probiere nur ein paar Sachen aus. Das ist der Grund warum ich mit TSNE nicht viel anfangen kann.

Danke schon mal im voraus happy [/b]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 01.11.2018, 01:34    Titel: Antworten mit Zitat

Hallo und willkommen im Forum! lächeln

Für eine maßgeschneiderte Lösung müsstest du etwas konkreter sagen, was du haben möchtest, aber hier als kleines Appetithäppchen eine Server/Client - Paarung, mit der du eine Datei in einem Netzwerk übertragen kannst:

Server:
Code:
#Include Once "TSNE_V3.bi"

Type Client_Type
   V_InUse     As UByte
   V_TSNEID    As UInteger
   V_IPA       As String
   V_Data      As String
End Type

Dim Shared ClientD() As Client_Type
Dim Shared ClientCount As UInteger
Dim Shared ClientMutex As Any Ptr

Dim G_Server_TSNEID As UInteger
Dim RV As Integer
Dim Shared As UInteger globalTSNEID

Function parse(text As String = "", separator As String = "") As String
   Static As String s, t, r
   Static As Integer b, e
      
   If separator = Chr(0) Then 'return the rest of the text
      r = Mid(t, e + 1)
      e = Len(t)
      Return r
   ElseIf Len(separator) Then
      s = separator
   EndIf
   
   If Len(text) Then 'new text
      t = text
      e = 0 'pointer to beginning
   EndIf
         
   b = e + 1 'pointer behind last word
   Do While InStr(s, Mid(t, b, Len(s))) 'seek next beginning of word
      If b >= Len(t) Then
         Return ""
      EndIf
      b += Len(s)
   Loop
   
   e = b
   Do
      'If Mid(t, e, 1) = """" Then 'quotation marks
      '   Do 'seek end of the quoted text
      '      e += 1
      '      If e > Len(t) Then 'text ended
      '         Exit Do, Do
      '      EndIf
      '   Loop Until Mid(t, e, 1) = """"
      'EndIf
            
      e += 1
      If e > Len(t) Then 'text ended
         Exit Do
      EndIf
         
   Loop Until InStr(s, Mid(t, e, Len(s))) 'found separator
   e -= 1 'set pointer in front of separator
      
   r = Mid(t, b, e - b + 1) 'cut text
   
   Return r
         
End Function


Sub TSNE_Disconnected(ByVal V_TSNEID As UInteger)
   Print "[Disconnected] TSNEID: "; V_TSNEID
   MutexLock(ClientMutex)
   For X As UInteger = 1 To ClientCount
      If ClientD(X).V_InUse = 1 Then
         If ClientD(X).V_TSNEID = V_TSNEID Then
            ClientD(X).V_InUse = 0
            Exit For
         End If
      End If
   Next
   MutexUnLock(ClientMutex)
End Sub

Sub TSNE_Connected(ByVal V_TSNEID As UInteger)
   Print "[Connected] TSNEID: "; V_TSNEID
End Sub

Sub TSNE_NewData(ByVal V_TSNEID As UInteger, ByRef V_Data As String)
   Dim As Integer RV, ff
   Dim As String fi, g, request
   
   Print "[NewData] TSNEID: "; V_TSNEID; " Datenlänge: "; Len(V_Data)
      
   request = parse(V_DATA, Chr(13, 10))
      
   Select Case LCase(request)
      Case "sendfile" 'client requests a file
         fi = parse() 'get file name
                  
         ff = FreeFile
         If Open (fi For Binary Access Read As #ff) Then
            RV = TSNE_Data_Send(V_TSNEID, "nosuchfile " & fi & Chr(13,10) & "0 Bytes" & Chr(13,10))
         Else 'send file
            'response header
            RV = TSNE_Data_Send(V_TSNEID, _
                                "requestedfile " & fi & Chr(13,10) & _
                                 Lof(ff) & " Bytes" & Chr(13,10))
            If RV <> TSNE_Const_NoError Then
               Print "[ERROR] " & TSNE_GetGURUCode(RV)
               Close ff
               Exit Sub
            End If
            
            Do Until Eof(ff) 'send file data
               g = Input(1024, ff)
               RV = TSNE_Data_Send(V_TSNEID,  g)
               If RV <> TSNE_Const_NoError Then
                  Print "[ERROR] " & TSNE_GetGURUCode(RV)
                  Close ff
                  Exit Sub
               End If
            Loop
            Close ff
         EndIf
         
   End Select
   
   
End Sub

Sub TSNE_NewConnection(ByVal V_TSNEID As UInteger, ByVal V_RequestID As Socket, ByVal V_IPA As String)
   Dim CIndex As UInteger
   Dim RV As Integer
   Dim NewTSNEID As UInteger
   Dim TCUDT As Client_Type
   
   MutexLock(ClientMutex)
   For X As UInteger = 1 To ClientCount
      If ClientD(X).V_InUse = 0 Then CIndex = X: Exit For
   Next
   
   If CIndex = 0 Then
      If ClientCount = 250 Then
         RV = TSNE_Create_Accept(V_RequestID, NewTSNEID, , 0, 0, 0)
         If NewTSNEID = 0 Then TSNE_Disconnect(NewTSNEID)
         Exit Sub
      End If
      ClientCount += 1
      CIndex = ClientCount
      ReDim Preserve ClientD(ClientCount) As CLient_Type
   End If
   
   ClientD(CIndex) = TCUDT
   RV = TSNE_Create_Accept(V_RequestID, NewTSNEID, , @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
   globalTSNEID = NewTSNEID
   With ClientD(CIndex)
      .V_InUse = 1
      .V_TSNEID = NewTSNEID
      .V_IPA = V_IPA
      If RV <> TSNE_Const_NoError Then
         MutexUnlock(ClientMutex)
         Print "[ACCEPT] [ERROR] " & TSNE_GetGURUCode(RV)
         Exit Sub
      End If
   End With
   MutexUnlock(ClientMutex)
   Print "[ACCEPT] TSNEID: " & NewTSNEID; "  IPA: "; V_IPA
End Sub
'------------------------------------------------------
ClientMutex = MutexCreate

RV = TSNE_Create_Server(G_Server_TSNEID, 1234, 10, @TSNE_NewConnection, 0)
If RV <> TSNE_Const_NoError Then
   Print "[ERROR] " & TSNE_GetGURUCode(RV) & RV
   Sleep 5000
   End
End If

Do Until InKey() = Chr(27)
   Sleep 1, 1
Loop

'disconnect all clients
MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
   If ClientD(X).V_InUse > 0 Then
      If ClientD(X).V_TSNEID > 0 Then
         TSNE_Disconnect(ClientD(X).V_TSNEID)
      End If
   End If
Next
MutexUnlock(ClientMutex)

MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
   If ClientD(X).V_InUse > 0 Then
      If ClientD(X).V_TSNEID > 0 Then
         MutexUnlock(ClientMutex)
         TSNE_WaitClose(ClientD(X).V_TSNEID)
         MutexLock(ClientMutex)
      End If
   End If
Next
MutexUnlock(ClientMutex)

MutexDestroy ClientMutex

End 0


Client:
Code:
#Include Once "TSNE_V3.bi"
Dim G_Client_TSNEID As UInteger
Dim Shared As Integer conn, sff, tofile, disconn, bytes
Dim Shared As String reqfile, savfile

Function parse(text As String = "", separator As String = "") As String
   Static As String s, t, r
   Static As Integer b, e
      
   If separator = Chr(0) Then 'return the rest of the text
      r = Mid(t, e + 1)
      e = Len(t)
      Return r
   ElseIf Len(separator) Then
      s = separator
   EndIf
   
   If Len(text) Then 'new text
      t = text
      e = 0 'pointer to beginning
   EndIf
         
   b = e + 1 'pointer behind last word
   Do While InStr(s, Mid(t, b, Len(s))) 'seek next beginning of word
      If b >= Len(t) Then
         Return ""
      EndIf
      b += Len(s)
   Loop
   
   e = b
   Do
      'If Mid(t, e, 1) = """" Then 'quotation marks
      '   Do 'seek end of the quoted text
      '      e += 1
      '      If e > Len(t) Then 'text ended
      '         Exit Do, Do
      '      EndIf
      '   Loop Until Mid(t, e, 1) = """"
      'EndIf
            
      e += 1
      If e > Len(t) Then 'text ended
         Exit Do
      EndIf
         
   Loop Until InStr(s, Mid(t, e, Len(s))) 'found separator
   e -= 1 'set pointer in front of separator
      
   r = Mid(t, b, e - b + 1) 'cut text
   
   Return r
         
End Function


Sub TSNE_Disconnected(ByVal V_TSNEID As UInteger)
   Close tofile
   tofile = 0
   Print "[Disconnected] TSNEID: "; V_TSNEID
   conn = 0
End Sub


Sub TSNE_Connected(ByVal V_TSNEID As UInteger)

   Print "[Connected] TSNEID: "; V_TSNEID
   conn = 1
      
   Dim RV As Integer
   RV = TSNE_Data_Send(V_TSNEID, "SendFile" & Chr(13, 10) & reqfile & Chr(13, 10))
   If RV <> TSNE_Const_NoError Then
    Print "[ERROR] " & TSNE_GetGURUCode(RV)
    conn = 0
    TSNE_Disconnect(V_TSNEID)
   End If
End Sub


Sub TSNE_NewData(ByVal V_TSNEID As UInteger, ByRef V_Data As String)
   Dim As Integer ff
   Dim As String fi, g, response

   If tofile = 0 Then   
      response = parse(V_DATA, Chr(13,10))
      Print response
      
      Select Case LCase(response)
         Case "requestedfile " & reqfile
            g = parse()
            bytes = Val(g) 'length of the file
            tofile = FreeFile
            Open savfile For Output As #tofile
            Print g
      End Select
   Else
      Print #tofile, V_DATA;
      Print Int(100 * Lof(tofile) / bytes);"%" 'show progress
      Locate CsrLin - 1, 1, 0
      If Lof(tofile) = bytes Then 'transmission done
         Close tofile
         disconn = 1
         Print
      EndIf
   EndIf
End Sub


Dim RV As Integer

reqfile = "g:\#01sb041216.mp2" 'requested file. replace by a file of your own

savfile = "g:\#01sb.mp2" 'file to save to

Do
   Select Case conn
      Case 0
         'IP address 127.0.0.1 means "localhost" = server and client are running on the same
         ' computer. replace by appropriate IP if required
         RV = TSNE_Create_Client(G_Client_TSNEID, "127.0.0.1", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
         If RV <> TSNE_Const_NoError Then
          Print "[ERROR] " & RV & " " & TSNE_GetGURUCode(RV)
            Sleep 1000
            End
         End If
         
      Case 1
         Sleep 1
   End Select
   

Loop Until (InKey() = Chr(27)) Or (disconn = 1)
   
Print "Disconnect"
TSNE_Disconnect(G_Client_TSNEID)   
Print "WaitClose"   
TSNE_WaitClose(G_Client_TSNEID)
Sleep 3000


Ersetze "reqfile" (im Client - Code) durch den Namen der Datei, die übertragen werden soll und "savfile" durch den gewünschten Namen der Zieldatei (Achtung: Die Zieldatei wird ohne Rückfrage überschrieben!).

Wenn Server und Client auf zwei verschiedenen Rechnern laufen, muß in der Zeile
Code:
RV = TSNE_Create_Client(G_Client_TSNEID, "127.0.0.1", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
die localhost - Adresse "127.0.0.1" durch die IP - Adresse oder die URL des Servers ersetzt werden.

Die Include - Datei "TSNE_V3.bi" findest du hier.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sveen



Anmeldungsdatum: 31.10.2018
Beiträge: 4

BeitragVerfasst am: 02.11.2018, 16:28    Titel: Antworten mit Zitat

Zuerst mal vielen Dank für diesen Aufwand den du betrieben hast um mir ein Beispiel zu programmieren. Ich musste bis jetzt irgentwie immer alles alleine herausfinden und dachte bei diesem Problem könnte ich ja mal andere Leute fragen. Aber ich hätte nie gedacht das ich so schnell eine Antwort kriege.

Was du hier geschrieben hast werde ich sicher mal genauer anschauen aber es ist nicht so wie ich es mir vorgestellt habe. (das liegt an meiner schwachen Beschreibung)

Einfach kurz damit du weisst was ich eigentlich gemeint habe

Client 1:
Hat eine Variable (Integer X1 (zb 20))
vvv
Diese Variable möchte ich dann auf denn Server übertragen.
Client 1 > (X1) > Server
vvv
und der Server sendet dann die Variable an Client 2
vvv
Client 2:
Und Client 2 setzt dann diese X1(20) in X2 und somit habe ich dann zb die X Koordianten vom anderen Client.

Falls es dich wundert ich probiere ein simples Multiplayer Spiel zu machen und da ich programmieren ja nicht beruflich mache, war die erst beste Idee genau das, einfach die x/y Koordinaten auszutausch zwischen den 2 Clients

So das ist noch alles was ich dazu sagen wollte.

Und noch mals vielen Dank für den anderen Code ich werde sicher eine Verwendung dafür finden grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 02.11.2018, 16:56    Titel: Antworten mit Zitat

SERVER:
Code:
'##############################################################################################################
'TEST-SERVER für TSNE Version 3
'##############################################################################################################



'##############################################################################################################
#define TSNE_DEF_REUSER
#include once "TSNE_V3.bi"                     'Die TCP Netzwerkbibliotek integrieren



'##############################################################################################################
Dim Shared G_Server      as UInteger               'Eine Variable für den Server-Handel erstellen



'##############################################################################################################
Type Client_Type                           'Ein UDT welches die einzelnen Verbindungen und deren Parameter hält
   V_InUse            as UByte               'Wird verwendet um zu überprüfen ob der Eintrag belegt ist
   V_TSNEID         as UInteger               'Speicher die TSNEID der Verbindung
End Type
Dim Shared ClientD()   as Client_Type            'Das UDT-Array für die Clienten
Dim Shared ClientC      as UShort               'Hier reicht ein Short aus, da mehr als 65535 Verbindugnen sowieso nicht möglich sind (Portbegrenzung).
Dim Shared ClientMutex   as Any Ptr               'Wir erstellen ein MUTEX welches verhindert das mehrere verbindugen gleichzeitg auf das UDT zugreifen



'##############################################################################################################
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger)   'Empfänger für das Disconnect Signal (Verbindung beendet)
MutexLock(ClientMutex)                        'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC               'Wir gehen alle Array-Elemente durch
   If ClientD(X).V_InUse = 1 Then               'Wird das Element verwendet?
      If ClientD(X).V_TSNEID = V_TSNEID Then      'Ist das Element das gesuchte?
         ClientD(X).V_InUse = 0               'Da dieses Element nun nicht mehr gebraucht wird können wir dieses als 'Nicht in nutzung' markieren
         Print "[CLIENT] Disconnected >" & V_TSNEID & "<"   'und ausgeben das wir die verbindung beendet haben
         MutexUnLock(ClientMutex)            'Mutex Sperre kann jetz taufgehoben werden, da es sonst zu einem MUTEX Leak kommt wenn wir die Sub direkt verlassen
         Exit Sub                        'Sub direkt verlassen
      End If
   End If
Next
MutexUnLock(ClientMutex)                     'Mutex Sperren aufheben
Print "[CLIENT] [ERROR] TSNEID Not found in Client-Array"   'Wir haben kein passendes Element gefunden udn geben das aus.
End Sub



'##############################################################################################################
Sub TSNE_Connected(ByVal V_TSNEID as UInteger)      'Empfänger für das Connect Signal (Verbindung besteht)
MutexLock(ClientMutex)                        'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC               'Wir gehen alle Array-Elemente durch
   If ClientD(X).V_InUse = 1 Then               'Wird das Element verwendet?
      If ClientD(X).V_TSNEID = V_TSNEID Then      'Ist das Element das gesuchte?
         Print "[CLIENT] Connected >" & V_TSNEID & "<"   'und ausgeben das die client-verbindung vollständig hergestellt wurde
         MutexUnLock(ClientMutex)            'Mutex Sperre kann jetz taufgehoben werden, da es sonst zu einem MUTEX Leak kommt wenn wir die Sub direkt verlassen
         Exit Sub                        'Sub direkt verlassen
      End If
   End If
Next
MutexUnLock(ClientMutex)                     'Mutex Sperren aufheben
Print "[CLIENT] [ERROR] TSNEID Not found in Client-Array"   'Wir haben kein passendes Element gefunden und geben das aus.
End Sub



'##############################################################################################################
Sub TSNE_NewData(ByVal V_TSNEID as UInteger, ByRef V_Data as String)   'Empfänger für neue Daten
Print "[CLIENT] Data >" & V_TSNEID & "<___>" & V_Data & "<"   'und ausgeben das die client-verbindung vollständig hergestellt wurde
MutexLock(ClientMutex)                        'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC               'Wir gehen alle Array-Elemente (Clienten) durch
   If ClientD(X).V_InUse = 1 Then               'Wird das Element verwendet?
      If ClientD(X).V_TSNEID <> V_TSNEID Then      'Ist der Client NICHT der gleiche wie der Sender?
         Print "[CLIENT] SEND >" & ClientD(X).V_TSNEID & "<___>" & V_Data & "<"   'und ausgeben das die client-verbindung vollständig hergestellt wurde
         TSNE_Data_Send(ClientD(X).V_TSNEID, V_Data)   'Wir senden die eingehenden Daten an den Clienten
      End If
   End If
Next
MutexUnLock(ClientMutex)                     'Mutex Sperren aufheben
End Sub



'##############################################################################################################
Sub TSNE_NewConnection(ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String)      'Empfänger für das NewConnection Signal (Neue Verbindung)
Dim TNewTSNEID as UInteger                     'Eine Variable welche die Neue TSNEID beinhaltet
Dim TReturnIPA as String                     'Eine Variable welche die IP-Adresse des clienten beinhaltet
Dim CIndex as UInteger                        'Eine Variable erstellen welche einen freien Array index speichert
Dim RV as Integer                           'Die Statusrückgabe variable
MutexLock(ClientMutex)                        'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC               'Wir gehen alle Array-Elemente durch
   If ClientD(X).V_InUse = 0 Then               'Haben wir ein Freies Element gefunden?
      CIndex = X                           'Dann diesen Index abspeichern
      Exit For                           'Und schleife verlassen
   End If
Next
If CIndex = 0 Then                           'Haben wir kein freies Feld gefunden?
   If ClientC >= 100 Then                     'Haben wir noch platz für einen Client oder wurde schon unser definiertes Maximum erreich?
      Print "[CLIENT] FULL!!!   IPA:" & V_IPA      'Wir zeigen an, das unser Server voll ist. und geben die IPA aus.
      RV = TSNE_Create_Accept(V_RequestID, TNewTSNEID, TReturnIPA, 0, 0, 0)   'Da wir kein Platz mehr haben akzeptieren wir pauschal die verbindung ohne Callback-sub's anzugeben (werden sowieso nicht benötigt).
      If RV <> TSNE_Const_NoError Then         'Gab es einen Fehler beim 'Accept'?
         Print "[CLIENT] [FEHLER] " & TSNE_GetGURUCode(RV)      'Dann geben wir diesen aus
         MutexUnLock(ClientMutex)            'Entsperren das Mutex
         Exit Sub                        'und verlassen auf direktem wege die sub
      End If
      TSNE_Disconnect(TNewTSNEID)               'Zum schluss beenden wir die Verbindung, da sie sowieso nicht von uns weiter verwaltet wird.
      MutexUnLock(ClientMutex)               'Noch das MUTEX entsperren
      Exit Sub                           'und die Sub auf direktem wege verlassen
   End If
   ClientC += 1                           'Ist noch Platz frei erstellen wir ein neues Element
   Redim Preserve ClientD(ClientC) as Client_Type   'Und redimensionieren (mit 'Preserve' für das erhalten der anderen Element-daten) das Array
   CIndex = ClientC                        'Als Freien Index geben wir das neue Element an
End If
Dim TMyIPA as String                           'Erhält von er Accept die IP-Adresse dieses Servers, so wie der Client sie sieht.
RV = TSNE_Create_Accept(V_RequestID, TNewTSNEID, TReturnIPA, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData, TMyIPA)   'Da wir noch platz haben akzeptieren wir die verbindung mit den Callbacks
If RV <> TSNE_Const_NoError Then               'Gab es einen Fehler beim 'Accept'?
   Print "[CLIENT] [FEHLER] " & TSNE_GetGURUCode(RV)   'Dann geben wir diesen aus
   MutexUnLock(ClientMutex)                  'Entsperren das Mutex
   Exit Sub                              'und verlassen auf direktem wege die sub
End If
With ClientD(CIndex)                        'Kein fehler entsanden? dann das freie Element selektieren
   .V_InUse   = 1                           'und markieren es als 'In Nutzung'
   .V_TSNEID   = TNewTSNEID                  'TSNEID der neuen Verbindung speichern
End With
Print "[CLIENT] New Connect >" & V_TSNEID & "<   IPA:" & V_IPA & "   MyIPA:"; TMyIPA   'Anzeigen das Verbindung akzeptiert wurde.
MutexUnLock(ClientMutex)                     'Mutex Sperren aufheben
End Sub



'##############################################################################################################
Print "[INIT] Setup..."                        'Signalisieren das wir das Programm starten
ClientMutex = MutexCreate()                     'Ein neues MUTEX erstellen
Dim RV as Integer                           'Eine Statusrückgabe Variable
Print "[SERVER] Init..."                     'Signalisieren das wir den Server jetzt inizialisieren
RV = TSNE_Create_Server(G_Server, 1234, 10, @TSNE_NewConnection)   'Server erstellen
If RV <> TSNE_Const_NoError Then               'Prüfen ob dabei Fehler entstanden sind
   Print "[SERVER] [FEHLER] " & TSNE_GetGURUCode(RV)   'Irgend ein Fehler trat beim erstellen des Server auf
   MutexDestroy(ClientMutex)                  'MUTEX zerstören. Wird jetzt nimmer gebraucht
   Print "[END]"                           'Wir sind fertig
   End   0                                 'Und beenden das Programm mit dem Returncode: 0
End if
Print "[SERVER] OK!"                        'Wenn nicht, dann ausgaben das alle OK war
Print "[SERVER] wait for ESC push..."            'Ausgeben das wir auf ein ESC Tastendruck warten
Do                                       'Wir poolen die Tastenabfrage
   Sleep 10, 1                              'Kurz warten um die CPU auslastung massiv zu verringern
Loop until InKey() = Chr(27)                  'Prüfen ob ein ESC gedrückt wurde. Wenn ja, dann shcleife verlassen
Print "[SERVER] ESC pushed!"                  'Und ausgeben was wir das ESC erkannt haben
Print "[SERVER] Disconnecting..."               'Mitteilen das wir den Server beenden
RV = TSNE_Disconnect(G_Server)                  'Server-Socket beenden
If RV <> TSNE_Const_NoError Then Print "[SERVER] [FEHLER] " & TSNE_GetGURUCode(RV)   'Wenn ein Fehler entstand, dann geben wir diesen aus
Print "[SERVER] Wait disconnected..."            'Ausgeben das wir trotzdem auf den Disconnect warten
TSNE_WaitClose(G_Server)                     'Wir warten auf das ende der serververbindung
Print "[SERVER] Disconnected!"                  'Server wurde beendet
MutexLock(ClientMutex)                        'MUTEX sperren um zugriff darauf zu verhinden
Dim TID as UInteger                           'Eine Variable erstellen welche die TSNEID zwischenspeichert
For X as UInteger = 1 to ClientC               'Alle clienten im UDT durchgehen
   If ClientD(X).V_InUse = 1 Then               'Wird das Element verwendet?
      TID = ClientD(X).V_TSNEID               'Wir hohlen die TSNEID der Verbindung udn speichern sie zwischen
      MutexUnLock(ClientMutex)               'Da wir jetzt die CLientverbindung trennen wird auch das Disconnect event aufgerufen. Darum Müssen wir das MUTEX entsperren
      TSNE_Disconnect(TID)                  'Verbindung trennen
      MutexLock(ClientMutex)                  'MUTEX wieder sperren um nächstes element zu prüfen
   End IF
Next
MutexUnLock(ClientMutex)                     'Mutex wieder entsperren
MutexDestroy(ClientMutex)                     'MUTEX zerstören. Wird jetzt nimmer gebraucht
Print "[END]"                              'Wir sind fertig
End   0                                    'Und beenden das Programm mit dem Returncode: 0


Client:
Code:

'##############################################################################################################
'TEST-CLIENT für TSNE_V3
'##############################################################################################################



'##############################################################################################################
#include once "TSNE_V3.bi"                     'Die TCP Netzwerkbibliotek integrieren



'##############################################################################################################
Dim G_Client as UInteger                     'Eine Variable für den Client-Handel erstellen



'##############################################################################################################
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger)   'Empfänger für das Disconnect Signal (Verbindung beendet)
Print "[Disconnected]"                        'Wir geben nur kurz aus, das die Verbindung beendet wurde.
End Sub



'##############################################################################################################
Sub TSNE_Connected(ByVal V_TSNEID as UInteger)      'Empfänger für das Connect Signal (Verbindung besteht)
Print "[Connected]"                           'Nachdem die Verbindung vollständig aufgebaut wurde, geben wir dies aus, und bereiten das senden der Anfrage vor.
End Sub



'##############################################################################################################
Sub TSNE_NewData(ByVal V_TSNEID as UInteger, ByRef V_Data as String)   'Empfänger für neue Daten
Print "[Data]: >" & V_Data & "<"
End Sub



'##############################################################################################################
Print "[INIT] Client..."                     'Programm beginnen
Dim BV as Integer                           'Variable für Statusrückgabe erstellen

'Client Verbindung etablieren, Pointer der Empfänger Sub Routinen mit übergeben.
Print "[Connecting]"
BV = TSNE_Create_Client(G_Client, "localhost", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData, 10)

'   Statusrückgabe auswerten
If BV <> TSNE_Const_NoError Then
   Print "[FEHLER] " & TSNE_GetGURUCode(BV)      'Fehler ausgeben
   End -1                                 'Programmbeenden
End If

Print "[OK]"   'Verbindung wurde erfolgreich hergestellt.
Print "Bitte Daten eingeben! (Mit ENTER absenden, mit ESC beenden)"

Dim T as String
Do
   T = InKey()
   If T = Chr(27) Then Exit Do
   If T <> "" Then TSNE_Data_Send(G_Client, T)
   Sleep 10, 1
Loop
Print "[DISCONNECTING] ..."                     'Verbindung beenden
TSNE_Disconnect(G_Client)

Print "[END]"
End                                       'Anschliessend beenden wir unser Programm


Im client die IP-Adresse entsprechend anpassen.

dann kannst du mehrmals den client aufrufen, welcher sich mit dem server verbindet.

wenn du dann im clienten eine Taste drückt, überträgt der client diesen buchstabe zum server, und dieser sendet die daten an alle verbundenen clienten weiter (auser dem, welcher das zeichen gesendet hat)


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 02.11.2018, 16:59    Titel: Antworten mit Zitat

EDIT: Bezüglich deinem letzten Post, sieh dir einmal das hier an: https://forum.qbasic.at/viewtopic.php?t=8375

Das ist ne Netzwerk-Lösung (bassierend auf TSNE), direkt für Spiele und Multiplayer Zeugs.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sveen



Anmeldungsdatum: 31.10.2018
Beiträge: 4

BeitragVerfasst am: 02.11.2018, 17:52    Titel: Antworten mit Zitat

oh danke grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.11.2018, 20:59    Titel: Antworten mit Zitat

@Sveen:

Vielen Dank für die Blumen, und es gibt auch sicher Leute, die solch einen Code in einer Stunde runterschreiben könnten, aber ich gehöre definitiv nicht dazu. grinsen Den Server / Client habe ich vor ein paar Wochen für einen Thread im englischen Forum geschrieben (oder besser gesagt: Angepasst, die Vorlagen stammen von hier und hier ), aber wenn ich damit einen weiteren Menschen glücklich machen kann: Umso besser. zwinkern

Aus deiner Beschreibung entnehme ich allerdings, daß du nicht wirklich weißt, was du dir unter den Begriffen "Client" und "Server" vorzustellen hast.

Also: Ein Server ist ein Programm, das darauf wartet, von einem Client kontaktiert zu werden und, sobald das geschieht, dessen Anfrage gemäß seiner Programmierung zu bearbeiten. Ein Server läuft daher üblicherweise permanent im Hintergrund.

Ein Client ist ein Programm, das bei Bedarf Kontakt zu einem Server aufnimmt und eine Anweisung oder Anfrage an diesen schickt. Was dann weiter passiert, hängt wieder von der Programmierung ab. In den allermeisten Fällen wird der Server irgendwelche Daten zum Client zurückschicken, die dieser dann verarbeitet, zwingend notwendig ist das jedoch nicht.

Will ein Server einen anderen Server kontaktieren (Proxy - Server), muß er dazu einen (temporären) Client generieren, der diese Aufgabe erledigt.

Auf keinen Fall kann jedoch ein Server oder Client von sich aus Kontakt zu einem anderen Client aufnehmen.

Vom Autor von TSNE, ThePuppetMaster, gibt es übrigens auch ein Erweiterungsmodul, um Spiele netzwerkfähig zu machen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sveen



Anmeldungsdatum: 31.10.2018
Beiträge: 4

BeitragVerfasst am: 02.11.2018, 22:05    Titel: Mehrere Variablen Antworten mit Zitat

Hallo nochmal

Ich habe jetzt deinen Code verwendet und nach ein bischen "anpassen" hat es dann perfekt funktioniert so wie ich es mir vorgestellt habe. Nach weiteren Tests ist ein neues Problem aufgetaucht peinlich . Ich wollte es zuerst selbst herausfinden jedoch bin ich daran gescheitert. Ich kann jetzt zwar eine Variable übertragen jedoch war es das auch. Ich wollte fragen ob mir jemand einen Tipp geben kann wie ich vorgehen könnte um mehrere Variablen auf einenmal zu übertragen z.b X,Y,F etc.

Danke schonmal im voraus

grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 03.11.2018, 00:16    Titel: Antworten mit Zitat

@Sveen .. für dein Vorhaben kann ich nur EGNP empfehlen. Es besitzt bereits alle passenden Routinen und Funktionen um derartige Daten zu übertragen und zu verwalten. Zudem lässt es sich sehr sehr einfach erweitern, um es deinen Anforderungen anzupassen.

https://forum.qbasic.at/viewtopic.php?t=8375


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz