[schon wieder gelöst] Socket FUnktion in DLL

Wohl das A & O in der Windows-Programmierung

Moderatoren: crack, Krüsty, Marwin

Antworten
Biehler-Productions
Member
Beiträge: 18
Registriert: Freitag 21. April 2006, 12:39
Kontaktdaten:

[schon wieder gelöst] Socket FUnktion in DLL

Beitrag von 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

Antworten