Page 1 of 1

Simple irc client troubles

Posted: Wed Aug 11, 2004 4:58 pm
by Raven
I can't understand why, although I can connect and recieve the welcome message, any other attempts to recieve data are met with a harsh <ping timeout>

I have it working using a 3rd part TCP/UDP DLL however, I'd rather use the internal functions if possible.
If anyone has any idea to what is going wrong please let me know.

Code: Select all

Global Quit, Connection, Callback$, Message$, *Buffer, *TBuffer, DBGM

Declare SendString( lpString.s, lpSuccess.s )
Declare ClearBuffer( *Void.l, dwSize.l )
Declare ConnectToNetwork()
Declare GetNetworkMessage()

NewList TString.s()

#MAXBUFFERSIZE=1024
*Buffer = AllocateMemory(#MAXBUFFERSIZE)
*TBuffer = AllocateMemory(1) ; Token Allocation

NICK$ = "NICK SirC"
USER$ = "USER Raven 0 * :Robert"
JOIN$ = "JOIN #dbp"
DBGM = #TRUE ; Debug Mode

If OpenConsole()
  ConsoleTitle( "SimpleIRC v0.01.0 build 0004" )
  If InitNetwork()
    ConnectToNetwork()
    SendString( NICK$, "Nick Changed" ) 
    SendString( USER$, "User Data Updated" )
    SendString( JOIN$, "Joined Channel" )   
  EndIf
  Repeat
    ;Message$ = Input() : PrintN("") ; this is sloppy, and i think hangs the system
    GetNetworkMessage()
    Select UCase(Message$)
      Case "QUIT" : Quit=1
      Case "CONNECT" : ConnectToNetwork()
      Case "GETMSG" : GetNetworkMessage()
      Default
        PrintN("")
        SendString( Message$, "Operation Successful" )   
    EndSelect    
  Until Quit=1
  FreeMemory(*Buffer)
  FreeMemory(*TBuffer)
  CloseNetworkConnection(Connection)
  CloseConsole()
EndIf

Procedure.l SendString( lpString.s, lpSuccess.s )
  If lpString
    ReAlloc.l = MemoryStringLength( lpString )
    *TBuffer = ClearBuffer( *TBuffer, ReAlloc )
    PokeS( *TBuffer, lpString )
    Result.l = SendNetworkData( Connection, *TBuffer, ReAlloc )
    If Result And lpSuccess
      Print( lpSuccess )
      If DBGM=#TRUE
        PrintN( " :: Sent "+Str(Result)+" bytes"+" :: "+PeekS(*TBuffer) )
      Else
        PrintN("")
      EndIf
    Else
      ProcedureReturn #FALSE
    EndIf
  Else
    ProcedureReturn #FALSE
  EndIf
  ProcedureReturn #TRUE
EndProcedure

Procedure.l ClearBuffer( *ptr.l, dwSize )
; this might be kinda lazy but seemed the simplist solution
  FreeMemory( *ptr )
  *ptr = AllocateMemory( dwSize )
  ProcedureReturn *ptr
EndProcedure

Procedure ConnectToNetwork()
  Connection = OpenNetworkConnection( "lightning.chattingaway.com", 6667 )
  If Connection
    PrintN( "Connected To Network" )
    GetNetworkMessage()
  EndIf
EndProcedure

Procedure GetNetworkMessage()
  Result.l = ReceiveNetworkData( Connection, *Buffer, #MAXBUFFERSIZE )
  Callback$ = PeekS( *Buffer )
  If Left( Callback$, 5 ) = "PING "
    SendString( "PONG "+Right(Callback$, Len(Callback$)-5 ), "Pinged" )
  Else
    Print(Callback$)
    *Buffer = ClearBuffer( *Buffer, #MAXBUFFERSIZE )
    If DBGM=#TRUE
      PrintN( " :: Received "+Str(Result)+" bytes" )
    Else
      PrintN("")
    EndIf
  EndIf
EndProcedure

Re: Simple irc client troubles

Posted: Mon Aug 23, 2004 10:05 am
by WolfgangS
Raven wrote:I can't understand why, although I can connect and recieve the welcome message, any other attempts to recieve data are met with a harsh <ping timeout>

I have it working using a 3rd part TCP/UDP DLL however, I'd rather use the internal functions if possible.
Hi
You even don't extract complete IRCMessages from the data flow which is is quite a coplex task. Better look here http://www.faqs.org/rfcs/rfc2812.html or here http://www.valinor.sorcery.net/docs/rfc ... o-bnf.html

MFG
WolfgangS