Seite 1 von 4

Chatprogramm

Verfasst: 14.06.2005 15:56
von AirTokio
Nachdem ihr mir geraten habt nen bisschen mit der Konsole zu programmieren, sitzte ich jetzt hier und komme nicht weiter!

Hab ein Chatprogramm geproggt, mit einer Server -> Client Kombination.

Hier mein Server

Code: Alles auswählen

OpenConsole()                                              
 
ConsoleTitle("Server")                              
ConsoleColor (15, 0)


If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht finden !")
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(Port)

  PrintN("Server wurder erstellt (Port "+Str(Port)+").")
  
  Repeat
      
    SEvent.l = NetworkServerEvent()
  
    If SEvent
    
      ClientID = NetworkClientID()
  
      Select SEvent
      
        Case 1
          PrintN("Ein neuer Client hat sich angemeldet !")
  
        Case 2  
          ReceiveNetworkData(ClientID, Buffer, 10000)
          PrintN(""+PeekS(Buffer))
          ReceiveNetworkData(ConnID, @Text, 500)
          
          
          
          
   
        Case 3
          PrintN("Client "+Str(ClientID)+" hat die Verbindung beendet...")

    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  PrintN("Klicke zum beenden des Servers.")
  Input()
  CloseNetworkServer()
Else
  PrintN("Konnte Server nicht erstellen (Wird der Port bereits benutzt ?).")
EndIf

  
End
Und hier mein Client

Code: Alles auswählen

OpenConsole()                                              
 
ConsoleTitle("Client")                              
ConsoleColor (15, 0)


If InitNetwork() = 0
   PrintN("Kein Netzwerk gefunden!")
  End
EndIf


Port = 6832
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)


PrintN("Willkommen zu NextConextion!")
PrintN("")
Delay(2000)
Print("Verbindung wird hergestellt")
Delay(1000)
Print(".")
Delay(1000)
Print(".")
Delay(1000)
Print(".")
Delay(1000)
PrintN(".")
PrintN("")

If ConnectionID
  PrintN("Client ist verbunden mit Server...")
  Delay(1000)
  ClearConsole ()

PrintN("Willkommen zum Chat!")
PrintN("")
     
Repeat
     
   
PrintN("")
string$ = Input ()
SendNetworkString(ConnectionID, String$)
   
   
   
   
ForEver
  

Else
  PrintN("Konnte Server nicht finden!")
EndIf

Input ()
  
End

So weit so gut :allright:
Nur wie mach ich es nun, dass man was schreibt (also input + Variable) der es dem Server weiterschickt und dieser wiederum alles allen Clients weiterschickt?

Verfasst: 14.06.2005 17:21
von Sonne
so, ich hab auch mal einen server geschrieben, der sollte dir eingtlich gut helfen, deinen fehler zu finden :)

Code: Alles auswählen

If InitNetwork() = 0 
  End 
Else 
EndIf 

If CreateNetworkServer(Port) 
  Repeat 
If NetworkServerEvent() = 2
ReceiveNetworkData(NetworkClientID(), Buffer, 10000)
MessageRequester("Message from Root", PeekS(Buffer),0)
EndIf
  ForEver 
  
  CloseNetworkServer() 
  
Else 
EndIf 
Ich denke mal, dass dein Fehler da beim Case ist ... also die reihe darunter :)

Verfasst: 14.06.2005 17:30
von AirTokio
So hab den Code mal verändert

Code: Alles auswählen

If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht finden !")
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(Port)

  PrintN("Server wurder erstellt (Port "+Str(Port)+").")
  
  Repeat
      
    SEvent.l = NetworkServerEvent()
  
    If SEvent
    
      ClientID = NetworkClientID()
  
      Select SEvent
      
        Case 1
          PrintN("Ein neuer Client hat sich angemeldet !")
  
        Case 2  
        ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
        PrintN(""+ PeekS(Buffer))
              
        Case 3
          PrintN("Client "+ Str(ClientID) + " hat die Verbindung beendet...")
    
    
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  PrintN("Klicke zum beenden des Servers.")
  Input()
  CloseNetworkServer()
Else
  PrintN("Konnte Server nicht erstellen (Wird der Port bereits benutzt ?).")
EndIf

  
End
Nun wenn man etwas schreibt zeigt er es schonam im Server Fenster an (!!!), wenn ich jedoch im Client Morgeeen schreibe, zeigt er es im Server an. Wenn ich nun als nächstes nur a schreibe zeigt er aorgeeen an!
Also irgendwas funktioniert da noch nicht! Genauso bemerkt der Server es nicht, wenn der Client beendet! Was ist also an Case 4 falsch?

Verfasst: 14.06.2005 18:02
von MVXA
Das liegt daran, dass der Buffer nach ende eines Schleifendurchlaufes nicht geleert wird ;). Abhilfe könnte diese Funktion schaffen, sofern ihr über die Vollversion verfügt: http://msdn.microsoft.com/library/defau ... 4b.xml.asp

Verfasst: 14.06.2005 18:10
von AirTokio
Ja hab mir schon gedacht, dass es am Buffer liegt!
So aber mit der Microsoft seite komm ich gar nicht klar!
Hab die Vollversion von PureBasic aber wo und was muss ich zum leeren eingeben?

Verfasst: 14.06.2005 19:25
von MVXA
Ersetz die Zeile

Code: Alles auswählen

ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
durch diese Zeilen

Code: Alles auswählen

RtlZeroMemory(Buffer, 1000)
ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
Mit der MSDN sollte man aber umgehen können, wenn man unter Windows was gescheites programmieren will ;). Ohne API kommt man selten sehr weit.

Verfasst: 14.06.2005 20:07
von AirTokio
Danke!
Jedoch beim Starten macht er immer einen Fehler:
Zeile 34: RtlZeroMemory() is not a function, an array, or a linked list!

Hier ist mein Quelltext:

Code: Alles auswählen

OpenConsole()                                             
 
ConsoleTitle("Server")                             
ConsoleColor (15, 0)



If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht finden !")
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(Port)

  PrintN("Server wurder erstellt (Port "+Str(Port)+").")
 
  Repeat
     
    SEvent.l = NetworkServerEvent()
 
    If SEvent
   
      ClientID = NetworkClientID()
 
      Select SEvent
     
        Case 1
          PrintN("Ein neuer Client hat sich angemeldet !")
 
        Case 2 
        RtlZeroMemory(Buffer, 1000)
        ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
        PrintN(""+ PeekS(Buffer))
             
        Case 3
          PrintN("Client "+ Str(ClientID) + " hat die Verbindung beendet...")
   
   
   

   
      EndSelect
    EndIf
   
  Until Quit = 1
 
  PrintN("Klicke zum beenden des Servers.")
  Input()
  CloseNetworkServer()
Else
  PrintN("Konnte Server nicht erstellen (Wird der Port bereits benutzt ?).")
EndIf

 
End 

Verfasst: 14.06.2005 20:12
von bluejoke

Code: Alles auswählen

RtlZeroMemory(Buffer, 1000)
ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
Mit der MSDN sollte man aber umgehen können, wenn man unter Windows was gescheites programmieren will Wink. Ohne API kommt man selten sehr weit.
Verwechsel eine User-Lib mal lieber nicht mit der Windows-API, wobei ich deiner Aussage in Teilen zustimmen muss...

Verfasst: 14.06.2005 20:15
von Spirit
Da muss noch ein '_' dazwischen, also

Code: Alles auswählen

RtlZeroMemory_(Buffer, 1000)
EDIT: Ach er meint eine User-Lib? Na dann muss doch kein '_' dazwischen.

Verfasst: 14.06.2005 20:23
von AirTokio
Nee stimmt schon der muss dazwischen ;)
Jetzt funzt das auf jedenfall schon!!! DANKE :)

So nun funktioniert bloss nicht mehr, das der Server es meldet, wenn der Client beendet wird!

Und ich brauch noch, dass er jeden client, der Verbunden is (aus dem der es geschrieben hat) diese Naricht zu schickt!

Aber jetzt schonmal fettes dankeschön für eure Hilfe :allright: