Fehler bei Winsock Programmierung



  • Hallo zusammen,

    hat schonmal jemand eine Winsockanwendung mit Assembler und der WinApi ertsellt?

    Irgendwas haut bei mir nicht hin und ich erhalte auch keinen Fehler.

    Hier erstmal der Code:
    ;hier wird die Versionsnummer eingetragen 2.0
    xor ecx, ecx
    xor ebx, ebx
    mov cx, 16
    mov bx, 00h
    shl ebx, cl
    mov bx, 02h
    mov s_version, ebx

    invoke WSAStartup, s_version, addr wsadata

    .if eax != 0d
    invoke MessageBox, NULL, addr wsa_fehler, addr wsa_fehler, MB_OK
    .endif
    ;prüfen ob WSAStartup einen Fehler liefert

    ;Socket erstellen
    invoke socket, AF_INET, SOCK_STREAM, 0
    mov sock, eax

    .if eax == 0d
    invoke MessageBox, NULL, addr socket_fehler, addr socket_fehler, MB_OK
    .endif
    ;prüfen ob Socketerstellung einen Fehler liefert

    ;ab hier Struktur von sockaddr_in füllen
    mov sa.sin_family, AF_INET

    xor eax, eax
    invoke htons, IPPORT_DAHEIM ;=81d
    mov sa.sin_port, ax

    call zeige ;nur zum schauen was er aus dem Port gemacht hat nach der Umwandlung

    invoke inet_addr, addr ip_adresse
    mov sa.sin_addr.S_un.S_addr, eax
    ;IP umwandeln und zuweisen

    .if eax == INADDR_NONE or INADDR_ANY
    invoke MessageBox, NULL, addr ip_fehler, addr ip_fehler, MB_OK
    .endif
    ;Prüfen ob die Umwandlung der IP einen Fehler ergeben hat

    invoke connect, sock, addr sa, sizeof sa
    .if eax != 0d
    invoke MessageBox, NULL, addr connect_fehler, addr connect_fehler, MB_OK
    .endif
    ;beim connect erhalte ich einen Fehler da ungleich NULL zurückgegeben wurde.

    Ich bin bei der Ausführung nach dem Buch von Herrn Petzold vorgegangen.
    Der einzigste Fehler entsteht beim connect...
    Eine Vermutung habe ich und zwar das es am Port liegt.
    Die Funktion htons macht aus meinem Port z.B. 1 eine 256.
    Aus Port 2 eine 512
    Aus Port 3 eine 768 usw. usf...
    Also rechnet er meinen "Wunschport" * 256???

    Soweit ich weiß kann man aber 65536 Ports nutzen, das geht aber nicht mit einem 16bit Wert den htons erwartet. Sondern es müssten 24bit sein (16,7 Mio).

    Ich hoffe jemand weiß auch hier Rat...

    Gruß, Nicky





  • Hallo,

    also liegt es am Port und dem Big-Endian Format?

    Nicky



  • Programm läuft...

    Die Connect-Funktion muss in einem extra Thread laufen sonst geht es nicht..

    Gruß und Danke

    Nicky



  • xor ebx, ebx
    mov cx, 16
    mov bx, 00h
    shl ebx, cl
    

    Was hast du dir denn dabei gedacht?

    2 mal das Register nullen und dann die 0 shiften???



  • Ja, da habe ich dann mit den Registern bh und bl gearbeitet. Es wird ja nur ein Word gebraucht.

    Aber mein Programm läuft wie gesagt.

    Habe noch eine Frage zu Threads...

    Was passiert wenn der Thread in der Prozedur auf ein RET stößt?
    Beendet er sich dann selbst oder wohin kehrt er da zurück?

    Ich dachte einen Thread beendet man mit CloseHandle, obj_id???

    Wie mache ich es hier richtig?

    Nicky



  • supernicky schrieb:

    Was passiert wenn der Thread in der Prozedur auf ein RET stößt?
    Beendet er sich dann selbst oder wohin kehrt er da zurück?

    In die Kernel.dll, wo dann ExitThread() Aufgerufen wird. Eine Thread sollte man allerding besser (laut Doku) direkt mit ExitThread() beenden.

    Das Handle des Threads ist unabhängig von der Ausführung - dies kannst du entweder direkt nach dem Erstellen schließen, oder nach dem der Thread beendend ist (z.B. in Anschluss auf WaitForSingleObject()).



  • Aber das RET muss auf jeden Fall in die Prozedur die der Thread ausführt?

    Ich schließe alle Handles beim beenden der Anwendung, hoffe das reicht..

    Danke erstmal für die vielen Antworten...

    Nicky



  • supernicky schrieb:

    Aber das RET muss auf jeden Fall in die Prozedur die der Thread ausführt?

    ja - wohin denn sonst?



  • Hallo,

    wie kann ich ein Socket prüfen ob es noch verbunden ist?

    Nicky



  • Wird hier ganz gut erklärt



  • Hallo,

    Dank solcher Antworten könnte man jedes Forum schließen...

    Ich habe einiges unternommen um eine passende Antwort zu bekommen.
    Selbst auf der MSDN Seite habe ich nichts gefunden.

    In VB kann man mit einer IF Abfrage schauen ob eine Verbindung besteht.

    if socket.connected = false then...
    // hier der Code wenn nicht verbunden
    end if

    Für C hab ich nichts vergleichbares gefunden.

    Bis zu deiner grandiosen Antwort hab ich mir aber auch schon was überlegt..
    Ich versuche das erstmal und hoffe hier nicht mehr viel Fragen zu müssen...

    Nicky



  • getsockopt(SO_CONNECT_TIME).
    Gibt -1 zurück, wenn der Socket getrennt ist.



  • Ob eine TCP-Verbindung noch besteht kannst du nur testen indem du etwas sendest.



  • ok...

    wenn der Befehl send() -1 zurück gibt, dann ist wohl keine Verbindung mehr vorhanden...

    Nun nochwas...

    Weiß jemand wie man die eigene IP mit der WinAPI ermittelt?
    Es gibt dort einige Funktionen wie gethostbyname ode getaddrinfo, aber ich weiß nicht wo in den ganzen Strukturen sich dann die IP versteckt.

    Gibt es irgendwo ein Beispiel in dem es nur um die lokale IP geht, ich brauch keine Alias- oder Service Infos von meinem Socket.

    Danke und Gruß

    Nicky



  • Irgendwie bewegst du dich hier langsam etwas vom Thema Assembler weg. Wenn du Fragen zur Win-API hast, bekommst du in unserem Win-API-Forum bestimmt sehr viel schneller bessere/ausfuehrlichere Antworten als hier. Wenn du dann noch Fragen/Probleme mit der konkreten Umsetzung in Assembler hast, bist du dagegen hier richtig...

    Kann dir davon ab leider jetzt nicht konkret weiterhelfen, da ich in dem Thema nicht drinstecke und zu faul bin, nachzuschlagen.



  • Hallo nochmal,

    ich habe wohl eine Mischung aus beiden vor mir liegen, da auch noch das auslesen der einzelnen Daten hinzukommt.

    Ich versuch es mal drüben...

    Trotzdem Danke



  • > wenn der Befehl send() -1 zurück gibt, dann ist wohl keine Verbindung mehr vorhanden...

    Oder es ist etwas anderes schief gelaufen. Du müsstest dann mindestens WSAGetLastError() überprüfen.


Anmelden zum Antworten