TCP - Client & Server in einem

  • Hallo ^^
    Ich hab ma wieder ein Problem.
    Und zwar versuch ich grade nen TCP - Chat selbst zu schreiben,
    klar, gibts schon massig, und auch viel bessere als meinen,

    doch die Betonung liegt auf selbst ;)

    So.
    Das Problem ist, dass ich nicht weiß, was mein Problem ist :D xD
    Das funzt einfach ma wieder nicht, und wahrscheinlich
    ist der Fehler so banal und einfach, dass ich mich nachher schämen
    muss dafür n neues Topic erstellt zu haben ;) :P

    Alsoo.. connecten funzt..
    aber die Nachrichten kommen nicht an..

    bitte überseht Feinheiten und Stellen, wo ichs kürzen könnte,
    der Feinschliff kommt später ;)
    Ach, und wenn euch meine Variablennamen nicht gefallen,...
    helft mir, ich bin immer so unkreativ :P


    Hab ich jz alles gesagt was ihr wissen müsst...?
    ahja, mein Code:
    (SocketToIP hab ich aus der Hilfe übernommen ;) )

    Für Schäden an Augen oder Hirn aufgrund beschi****** Code übernehme
    ich grundsätzlich keine Haftung.

    Lesen auf eigene Gefahr.
    Kinder haften für ihre Eltern.


    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Dim $connected = 0
    Dim $mainsocket
    Dim $in_connector = 0

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $mysocket = TCPListen( Inputbox( "Verbindung ermöglichen", "Bitte gib hier deine IP an." ), 1337 )
    $myname = InputBox( "Dein Name", "Bitte gib hier deinen Namen ein." )
    If @error = 1 Then Exit

    #include <GuiConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt( "GUIOnEventMode", 1 )
    Opt( "TrayAutoPause", 0 )

    [/autoit] [autoit][/autoit] [autoit]

    $main = GuiCreate("Chat", 237, 310,-1, -1 )
    $Edit_income = GuiCtrlCreateEdit("", 20, 40, 190, 160, $ES_READONLY )
    $Edit_output = GuiCtrlCreateEdit("", 20, 210, 190, 50)
    $Button_send = GuiCtrlCreateButton("senden", 40, 270, 150, 20, $BS_DEFPUSHBUTTON )
    GUICtrlSetState( $Button_send, $GUI_DISABLE )
    GUICtrlSetOnEvent( $Button_send, "_senden" )
    $menu = GUICtrlCreateMenu( "Verbinden" )
    $menu_verbinden = GUICtrlCreateMenuitem( "Verbindung herstellen mit...", $menu )
    GUICtrlSetOnEvent( $menu_verbinden, "_verbinden" )
    GUISetOnEvent( $GUI_EVENT_CLOSE, "_exit" )
    GuiSetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    If $connected = 1 Then
    $get = TCPRecv( $mainsocket, 2048 )
    If Not $get = "" Then
    GUICtrlSetData( $Edit_income, GUICtrlRead( $Edit_income ) & @CRLF & $yourname & ":" & $get )
    EndIf
    EndIf

    If $connected = 1 And GUICtrlGetState( $Button_send ) = $GUI_DISABLE Then
    GUICtrlSetState( $Button_send, $GUI_ENABLE )
    ElseIf $connected = 0 And GUICtrlGetState( $Button_send ) = $GUI_ENABLE Then
    GUICtrlSetState( $Button_send, $GUI_DISABLE )
    EndIf

    If $connected = 0 And $in_connector = 0 Then
    $yoursocket = TCPAccept( $mysocket )
    If $yoursocket <> -1 Then
    $in_connector = 1
    MsgBox( 0, "Verbunden", "Jemand hat eine Verbindung zu dir aufgebaut.", 5 )
    $income_connection = TCPConnect( SocketToIP( $yoursocket ), 1337 )
    If $income_connection = -1 Then
    MsgBox( 0, "Error", "Verbindung fehlgeschlagen. Er/Sie kann keine Nachrichten von dir empfangen.", 5 )
    Else
    $connected = 1
    GUICtrlSetState( $Button_send, $GUI_ENABLE )
    EndIf
    EndIf
    EndIf

    Sleep( 300 )
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit()
    TCPShutdown()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _verbinden()

    Opt( "GUIOnEventMode", 0 )

    $con = GuiCreate("Einstellungen", 182, 220,-1, -1 )

    [/autoit] [autoit][/autoit] [autoit]

    $Input_3 = GuiCtrlCreateInput("Die IP zum connecten", 20, 30, 140, 20)
    $Group_5 = GuiCtrlCreateGroup("Daten des Freundes", 10, 10, 160, 80)
    $Input_6 = GuiCtrlCreateInput("Name des Freundes", 20, 60, 140, 20)
    $Button_7 = GuiCtrlCreateButton("OK", 10, 190, 80, 20)
    $Button_8 = GuiCtrlCreateButton("Abbrechen", 90, 190, 80, 20)

    GuiSetState()
    Sleep( 1000 )
    Dim $a = 0
    While $a = 0
    $msg = GuiGetMsg()
    Select
    Case $msg = $Button_8
    GUIDelete()
    Opt( "GUIOnEventMode", 1 )
    ExitLoop
    Case $msg = $Button_7
    $yourname = GUICtrlRead( $Input_6 )
    $yourip = GUICtrlRead( $Input_3 )

    For $i = 1 To 5
    $yoursocket = TCPConnect( $yourip, 1337 )
    GUISwitch( $main )
    GUICtrlSetData( $Edit_income, GUICtrlRead( $Edit_income ) & @CRLF & "Verbinungsversuch - " & $i )
    GUISwitch( $con )
    If $yoursocket <> -1 Then
    GUISwitch( $main )
    GUICtrlSetData( $Edit_income, GUICtrlRead( $Edit_income ) & @CRLF & "Verbindung hergestellt." )
    GUISwitch( $con )
    GUIDelete()
    $connected = 1
    GUICtrlSetState( $Button_send, $GUI_ENABLE )
    $a = 1
    Opt( "GUIOnEventMode", 1 )
    ExitLoop
    EndIf
    Next


    If $yoursocket = -1 Then
    GUISwitch( $main )
    GUICtrlSetData( $Edit_income, GUICtrlRead( $Edit_income ) & @CRLF & "Verbindung fehlgeschlagen." )
    GUISwitch( $con )
    GUIDelete()
    Opt( "GUIOnEventMode", 1 )
    ExitLoop
    EndIf


    EndSelect
    WEnd
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _senden()
    $send = GUICtrlRead( $Edit_output )
    TCPSend( $yoursocket, $send )
    GUICtrlSetData( $Edit_output, "" )
    GUICtrlSetData( $Edit_income, GUICtrlRead( $Edit_income )& @CRLF & $myname & ": " & $send )
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
    "ptr",DLLStructGetPtr($sockaddr),"int_ptr",DLLStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sockaddr = 0

    [/autoit] [autoit][/autoit] [autoit]

    Return $aRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.