Problem mit CSocket

Quero59

Mitglied
Hallo zusammen,

ich schreibe grad eine DLL, die mit HIlfe von CSocket Mails von einem POP3 Server holten soll.

Sie funktioniert auch - jedes zweite mal. Das heist auf einen erfolgreichen Versuch folgt genau ein Absturz. Bei der Fehlersuche habe ich den Code auf ein simples Create und Close reduziert, der Fehler bleibt.

Das Projekt wurde mit Visual C++ 5.0 als Win32 Dynamic-Link Library angelegt (also nicht mit den MFC Assistenten).

Hier der reduzierte Code, der Absturz kommt bei jedem zweiten Create:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
#include <errno.h>
#include <afxwin.h>
#include <afxsock.h>
#include <dos.h>

#define DllExport __declspec( dllexport )

extern DllExport long hole_meldungen (char *pop3server, char *user, char* password, unsigned int port, char *dateiname);

CSocket m_PopServer;


extern DllExport long hole_meldungen (char *pop3server, char *user, char* password, unsigned int port, char *dateiname)
{

MessageBox( NULL, "vor create!", "HINWEIS", MB_OK);

// AfxSocketInit(); //bringt keine Änderung

if (!m_PopServer.Create())
MessageBox( NULL, "Create fehlgeschlagen!", "HINWEIS", MB_OK);


MessageBox( NULL, "nach create!", "HINWEIS", MB_OK);

m_PopServer.Close();

MessageBox( NULL, "nach close!", "HINWEIS", MB_OK);

return 1;
}


Hat jemand eine Idee dazu?
 
Da du eine globale Variable (m_PopServer) für den Socket verwendest, führt das zweite Create() auf ein bereits erzeugtes CSocket-Objekt zum Absturz.

Gruß
MCoder
 
Viel weiter bin ich allerdings immer noch nicht.

1. Versuch: Das Teil global lassen und mit mittels Merker bei erneuten Aufrufen das Create überpringen => der Socket tut irgendwie nix mehr bei erneutem Funktionsaufruf.

2. Versuch: Den Socket innerhalb der Funkion definieren und hoffen, dass er nach der Funktion nicht mehr lebt => Abstürze bei zweitem Aufruf.

In den Dokus lese ich auch dauernd, dass der Socket zerstört werden muss am Ende. Was kannn ich da tun außer das Close?

Sorry von einem, der das letzte mal unter DOS nach Kerningham und Ritchie C programmiert hat (das allerdings 10 Jahre lang).
 
Das dein 2. Versuch zum Absturz führt wundert mich allerdings sehr, denn das CSocket-Objekt sollte nach dem Funktionsende definitiv nicht mehr leben. Erfolgt der Absturz tatsächlich wieder bei Create() ?
Möglicherweise verträgt CSocket auch nicht so richtig die Verwendung in einer DLL. Hast du's mal innerhalb der Applikation (ohne DLL) probiert ?
Ich würde ohnehin empfehlen, die Funktion der Winsock-API direkt zu benutzen. Das ist auch nicht aufwendiger als das Hantieren mit CSocket und sicherlich zuverlässiger, da die CSocket-Klasse nicht unbedingt den besten Ruf hat.

Gruß
MCoder
 
So ich habs jetzt.

1. Die DLL besser mit dem MFC-Anwendungsassistenten erstellen lassen, statt die DLL zu Fuß aufzubauen

2. Am Anfang der Funktion das Macro AFX_MANAGE_STATE(AfxGetStaticModuleState()) stellen.

Nun kann ich den CSocket hinschubsen wo ich will, alles ist gut.

Danke an MCoder und alle Interessierten!
 
Zurück