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
Code: Alles auswählen
INVOKE WSAStartup, 101h, addr INET_WSADATA
INVOKE DoSocket, EAX, DX, ECX
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
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
Nun iss zwar ein anderer fehler, aber zumindest wird der Socket erstellt
/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