[schon wieder gelöst] Socket FUnktion in DLL

Wohl das A & O in der Windows-Programmierung

Moderatoren: crack, Krüsty, Marwin

[schon wieder gelöst] Socket FUnktion in DLL

Beitragvon Biehler-Productions » Sonntag 27. Mai 2007, 11:54

Hi,
ich schreibe gerade POp3 Funktionen,die ich in eine DLL unterbringen will.

Aus diesem Grund benötige ich logischerweise ja die Socketfunktionen.
Nur kommt scheinbar bei dme Aufruf von socket() ein ILLEGAL_SOCKET Error.

Das wäre meine Funktoion, um einen Socket zu erstellen und zum Serve rzu verbindne:
Code: Alles auswählen
DoSocket PROC STDCALL lpHost:DWORD, nPort:DWORD, lpSF:DWORD

  PUSH EBX
  PUSH EDI

   INVOKE socket, AF_INET, SOCK_STREAM, IPPROTO_TCP

   .IF EAX != INVALID_SOCKET
      MOV sock, EAX
      MOV EDI, lpSF
      MOV WORD PTR [EDI], AF_INET
      ADD EDI, 2
            
      MOV EBX, nPort
      INVOKE htons, BX;80
      ;MOV s_port, AX
      MOV WORD PTR [EDI], AX
      ADD EDI, 2
      INVOKE gethostbyname, lpHost;IP_ADDR;addr HOSTNAME
      MOV EAX, [EAX+12]
      MOV EAX, [EAX]
      MOV EAX, [EAX]
      ;mov s_addr, EAX
      MOV [EDI], EAX
         
      INVOKE connect, sock, lpSF, 16;addr s_family, 16
      PUSHA
         INVOKE recv,sock, addr BBB, 10000, 0


   POPA
   .ELSE
       INVOKE MessageBox, 0, BBB, BBB, MB_OK

   .ENDIF
   MOV EAX, sock
   POP EDI
   POP EBX
   RET
DoSocket ENDP


Aufgerufen wird die DoSocket:

Code: Alles auswählen
    INVOKE WSAStartup, 101h, addr INET_WSADATA

  INVOKE DoSocket, EAX, DX, ECX


Mache ich dies, so wird eine Fehlermeldung ausgegeben, ein ILLEGAL_SOCKET Error ist also aufgetreten.

Jetzt hab ich mal probiert, die obigen 2 Zeilen durch das zu ersetzten:

Code: Alles auswählen
    INVOKE WSAStartup, 101h, addr INET_WSADATA
   INVOKE socket, AF_INET, SOCK_STREAM, IPPROTO_TCP

.if EAX != INVALID_SOCKET
  INVOKE DoSocket, EAX, DX, ECX
.endif

Hier erstelle ich also schon vor dme DoSocket einen Socket und prüfe, ob ein Fehler aufgetreten ist.

Wäre dies der Fall, also tritt ein Fehler auf, würde DoSocket nicht aufgerufen werden und es würde keine Fehlermeldung ausgegeben.
Nun ist es aber so, dass KEIN Fehler auftritt und die DoSocket infolge dessen aufgerufne wird.

Ich dneke, die Frage ist klar:
Hab ich irgendwas vergessen, sollte ich irgendwas beachten?
Man muss bedenken, dass ich eine abgespeckte Version der DoSOcket bereits erfolgreich in anderen Programmen benutzt habe:

Code: Alles auswählen
DoSocket PROC

   INVOKE socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
         
   .IF EAX != INVALID_SOCKET
      MOV sock, EAX
      INVOKE htons, 80
      MOV s_port, AX
      INVOKE gethostbyname, IP_ADDR;addr HOSTNAME
      MOV EAX, [EAX+12]
      MOV EAX, [EAX]
      MOV EAX, [EAX]
      mov s_addr, EAX
         
      INVOKE connect, sock, addr s_family, 16
   .ELSE
   
   .ENDIF
   RET
DoSocket ENDP


ARGH!! ich ahsb selber gefunden, ich ahb der Dosocket anstatt 3 DWORD's 2 DWORD's und ein WORD übergeben :oops:

Nun iss zwar ein anderer fehler, aber zumindest wird der Socket erstellt :mrgreen:

/7Edit:
So, nun taucht ein neuer Fehler auf:
Ich will einen Hostnamen auflösen und gethostbyname liefert 11001 zurück.
Nur hab ich keine Ahnung, wieso.
mx.freenet findet er angeblich nicht und biehler-josef.de auch nicht.

Nun hab ich mit Etheral mal dne Verkehr gesnifft, und siehe da: Es erfolgt gar keine DNS Abfrage.
Was ist da los?

//Edit:
Also irgendwie iss da der Wurm drinn.
Wenn ich die gethostbyname ein paar Zeilen vorher aufrufe, geht die DNS Abfrage scheinbar :?:

//Edit:
OK. Ich hab dne Fehler gefunden, ich hab der htons() Funktion ein 16Bit Register übergeben anstatt eines 32Bit Registers, da hab ich die MSDN wohl falsch verstanden
mfg
Biehler-Productions
http://biehler-josef.de
Biehler-Productions
Member
 
Beiträge: 18
Registriert: Freitag 21. April 2006, 12:39

Zurück zu Windows-API

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron