TCP Problem

  • Hallo zusammen,

    ich weiß zwar, dass dieses Thema schon oft durchgekaut wurde, doch ich habe ein Problem mit einer TCP Verbindung. Mein Programm soll ein kleiner Netzwerkmessenger werden, der über TCP Daten zu einem bestimmten Ziel sendet. Diese Daten werden dann als TrayTip angezeigt. Soweit so gut. In der Praxis funktionierts lokal, doch wenn man es auf 2 verschiedenen Rechner probiert, dann kriegt der Client keine Verbindung zum Server aufgebaut. Mir wird nur ein WSA 10060 Error angezeigt. Um sicher zu gehen, hab ich mal versucht meine Firewall auszuschalten, doch es funktiobiert trozdem nicht. Hat jemand einen Rat?

    Hier sind meine Quelltexte:

    Server

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    TraySetToolTip("Intranet Messenger")

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

    Opt('MustDeclareVars', 1)
    Opt("TrayMenuMode", 1)
    Opt("TrayMenuMode", 1)
    Opt("TrayMenuMode", 1)

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

    Global $szIPADDRESS = "127.0.0.1"
    Global $nPORT = 33891
    Global $MainSocket, $ConnectedSocket, $szIP_Accepted, $recv

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

    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit

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

    $ConnectedSocket = -1

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

    Main()

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

    Func Main()

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

    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Sleep(300)
    Until $ConnectedSocket <> -1

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

    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    While 1

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

    $recv = TCPRecv($ConnectedSocket, 2048)

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

    If @error Then ExitLoop

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

    If $recv <> "" Then TrayTip($szIP_Accepted, $recv, 10)

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

    WEnd

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

    If $ConnectedSocket <> -1 Then Main()

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

    EndFunc

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

    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", 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]


    Client

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    Global $ConnectedSocket, $szData

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

    Global $szIPADDRESS = "127.0.0.1"
    Global $nPORT = 33891

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

    $ConnectedSocket = -1

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

    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    Else
    $szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")

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

    If $szData <> "" Then TCPSend($ConnectedSocket, $szData)

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

    If @error Or $szData = "" Then Exit
    EndIf

    [/autoit]
  • so ich fang mal an :) :
    1. was bringt 3x ??

    [autoit]

    Opt("TrayMenuMode", 1)

    [/autoit]

    2. Statt

    [autoit]

    Global $szIPADDRESS = "127.0.0.1"

    [/autoit]


    probier mal :

    [autoit]

    Global $szIPADDRESS = @IPAddress1

    [/autoit]


    Ebenso beim Client

    Edit : Du musst Sleep(300) in Zeile 27 weglassen sonst wird das nicht klappen ;)


    Gehn denn die Beispiele aus der Hilfe ??

  • Hallo nof@ker2,

    Da steht 3x Opt("TrayMenuMode", 1), weil da ursprünglich mal eine GUI drin war. Koda macht bei mir immer 3 x Opt("TrayMenuMode", 1).
    Die Quelltexte bestehen übrigens aus den Beispielen aus der Hilfe. Aber dabke für den Tipp mit dem @IPAddress1. Werds gleich ausprobieren. Danke.

    MFG
    Lord232

  • achso das mit @IPAddress1 wird denke ich nichts ändern du musst nur Zeile 27 beim Server die Sleep(300) weglassen sonst aktzeptiert er nur jede 0,3 Sekunden einen einkommenden Socket womit die Wahrscheinlichkeit dass der Client connecten kann ziemlich klein ist .. :)

    ;)

    • Offizieller Beitrag

    Du musst beim Client die IP-Adresse von dem Rechner eintragen auf dem der Server läuft.