Speicherfehler

illaX

Erfahrenes Mitglied
Morgen,

ich habe schon wieder ein Problem.

Hier ist meine Methode:
Code:
JNIEXPORT jboolean JNICALL Java_utils_jni_FunctionJNI_ping
(JNIEnv *env, jobject object, jstring strClient) {

	if(strClient == NULL)
		return false;
	
	const char *str = env->GetStringUTFChars(strClient, NULL);
	string buf = str;

	const char* cIP = buf.c_str();

	env->ReleaseStringUTFChars(strClient, str);

	HANDLE hIcmpFile = IcmpCreateFile();

	// Declare and initialize variables
	char *SendData = "Data Buffer";
	LPVOID ReplyBuffer;
	ReplyBuffer = (VOID*) malloc(sizeof(ICMP_ECHO_REPLY) + sizeof(SendData));
	
	//cout << "ping " << cIP << endl;
	int dwRetVal;
	if ((dwRetVal = IcmpSendEcho2(hIcmpFile,
		NULL,
		NULL,
		NULL,
		inet_addr(cIP),
		SendData, 
		sizeof(SendData),
		NULL,
		ReplyBuffer, 
		8*sizeof(SendData) + sizeof(ICMP_ECHO_REPLY),
		1000)) != 0) {
		//printf("\tReceived %ld messages.\n", dwRetVal);
		//printf("\tMessage: %s\n", ReplyBuffer);
		CloseHandle(hIcmpFile);
		return true;
	}

	CloseHandle(hIcmpFile);
	

	return false;
}

Diese funktioniert auch, nur hin und wieder bekomme ich die Fehlermeldung:
Fehler in Anwendung
Die Anweisung in "0x7c9..." verweist auf Speicher in "0x0000...". Der Vorgang "read" konnte nicht auf dem Speicher durchgefuehrt werden.

Wie kann so etwas entstehen?
 
Zuletzt bearbeitet:
Möglicherweise liegt es daran:
Code:
ReplyBuffer = (VOID*) malloc(sizeof(ICMP_ECHO_REPLY) + sizeof(SendData));
     
if ((dwRetVal = IcmpSendEcho2(hIcmpFile,
    ...
    8*sizeof(SendData) + sizeof(ICMP_ECHO_REPLY),
    ...
Du legst den Empfangsspeicherbereich mit der Größe
Code:
 sizeof(ICMP_ECHO_REPLY) + sizeof(SendData)
an, gibst die Größe im Aufruf von IcmpSendEcho2 aber mit
Code:
8*sizeof(SendData) + sizeof(ICMP_ECHO_REPLY)
an.
 
Also muesste ich beim Empfangsspeicher auch *8 nehmen:

sizeof(ICMP_ECHO_REPLY) + 8*sizeof(SendData)
 
Je nachdem, welche Größe Du brauchst.
Auf jeden Fall sollten die beiden Größenangaben übereinstimmen. So wie Du es in Deinem 1. Post hattest, konnte es passieren, daß IcmpSendEcho2 in einen Speicherbereich schreibt, der evtl. für andere Variablen reserviert ist. Die werden dann natürlich überschrieben, was lustige Effekte haben kann ;-).
 
Der lustige Effekt war ja die Fehlermeldung und danach der absturz von meinem Programm :D

Habe es angepasst und beide Speicher gleich gross gemacht und bin am testen. Da der Fehler nur spradisch aufgetaucht ist dauert der test halt ein wenig laenger :D

Danke fuer die Hilfe
 
Zurück