openSSL - Server und Client Problem
-
Hallo,
ich beschäftige mich z.Z. mit openSSL kriege leider aber immer einen Fehler:
Stack around 'buf' was corrupted. Warum?Client( hier tritt der Fehler auf )
#define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <winsock2.h> #include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h> #define MAXHOSTNAMELEN 100 int startWinsock(); int main () { startWinsock(); struct sockaddr_in host_addr; int size; int s; struct hostent *host; char hostname[MAXHOSTNAMELEN]; char buf[1000]; char request[1000]; SSL_CTX *ctx; SSL *ssl; int err; printf("\nEnter Hostname: "); scanf("%s", &hostname); host = gethostbyname(hostname); if (host == NULL) { fprintf(stderr, "Unknown Host %s\n", hostname); return -1; } fflush(stdout); s = socket(PF_INET, SOCK_STREAM, 0); if (s < 0) { fprintf(stderr, "Socket Error\n"); return -1; } host_addr.sin_family = AF_INET; host_addr.sin_addr = *((struct in_addr *)host->h_addr); host_addr.sin_port = htons(334); if (connect(s, (struct sockaddr *)&host_addr, sizeof(host_addr)) == -1) { closesocket(s); fprintf(stderr, "Connection Error\n"); return -1; } SSL_load_error_strings(); SSL_library_init(); ctx=SSL_CTX_new(SSLv23_client_method()); ssl=SSL_new(ctx); if(!ssl) { closesocket(s); fprintf(stderr, "SSL creation error\n"); return -1; } SSL_set_fd(ssl, s); err=SSL_connect(ssl); if(!err) { closesocket(s); fprintf(stderr, "SSL connect error\nretval: %d\n", err); err=SSL_get_error(ssl, err); fprintf(stderr, "SSL error: %d\n", err); return -1; } sprintf( request,"Hallo, Welt!\r\n" ); err=SSL_write(ssl, request, strlen(request)); if(!err) { closesocket(s); fprintf(stderr, "SSL write error\n"); return -1; } while(1) { int read_size = -1; read_size=SSL_read(ssl, buf, sizeof(buf)-1); buf[read_size]='\0'; if (read_size > 0) { printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf); } else { break; } } SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); fflush(stdout); closesocket(s); return 0; } int startWinsock() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }Server( hier tritt der Fehler nur auf, wenn man das Kommentar wieder entfernt )
#define _CRT_SECURE_NO_DEPRECATE #include <windows.h> #include <winsock.h> #include <stdio.h> #include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h> //Prototypen int startWinsock(void); int main() { long rc; SOCKET acceptSocket; SOCKET connectedSocket = NULL; SOCKADDR_IN addr; char buf[1000]; char buf2[1000]; SSL_CTX *ctx; SSL *ssl; int err; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } // Socket binden memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(334); addr.sin_addr.s_addr=INADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket an port gebunden\n"); } // In den listen Modus rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("acceptSocket ist im listen Modus....\n"); } // Verbindung annehmen connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Neue Verbindung wurde akzeptiert!\n"); } SSL_load_error_strings(); SSL_library_init(); ctx=SSL_CTX_new(SSLv23_server_method()); ssl=SSL_new(ctx); if(!ssl) { closesocket(connectedSocket); fprintf(stderr, "SSL creation error\n"); return -1; } SSL_set_fd(ssl, connectedSocket); err=SSL_accept(ssl); if(!err) { closesocket(connectedSocket); fprintf(stderr, "SSL accept error\nretval: %d\n", err); err=SSL_get_error(ssl, err); fprintf(stderr, "SSL error: %d\n", err); return -1; } // Daten austauschen while(1) { sprintf( buf, "" ); sprintf( buf2, "" ); /* int read_size = -1; read_size=SSL_read(ssl, buf, sizeof(buf)-1); buf[read_size]='\0'; if (read_size > 0) { printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf); } else { break; } */ sprintf( buf2,"Du mich auch %s\r\n", "x" ); err=SSL_write(ssl, buf2, strlen(buf2)); if(!err) { closesocket(connectedSocket); fprintf(stderr, "SSL write error\n"); return -1; } } SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); fflush(stdout); closesocket(acceptSocket); closesocket(connectedSocket); WSACleanup(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }Ich weiß das der Code hässlich aussieht, aber bevor ich was ordentliches mache wollte ichs erstmal ans Laufen kriegen. Wo liegt also der Fehler?

Danke im Voraus
Nappppp
-
Nappppp schrieb:
Ich weiß das der Code hässlich aussieht, aber bevor ich was ordentliches mache wollte ichs erstmal ans Laufen kriegen. Wo liegt also der Fehler?

Danke im Voraus
NapppppDu weisst sogar, daß der Code hässlich aussieht und hoffst, daß den dennoch jemand liest? Na dann viel Glück.

-
So hässlich das ihn niemand liest ist er auch wieder nicht. Kann nicht mal jemand kurz drüberschauen und mir sagen was ich falsch gemacht habe? Der Fehler liegt in diesen Zeilen:
int read_size = -1; read_size=SSL_read(ssl, buf, sizeof(buf) - 1); buf[read_size]='\0'; if ( read_size > 0 ) { printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf); } else { break; }Das ganze lässt sich mit einem "void *buf" zwar beheben, aber ein Datenaustausch findet dann trotzdem och nicht statt. Wie mache ich das richtig? Ich bin verzeweifelt

Ich würde mich über eine Antwort, die mir weiterhilft sehr freuen!
-
Hast du read_size mal überprüft? Nicht, dass da -1 drin steht.
-
Braunstein schrieb:
Hast du read_size mal überprüft? Nicht, dass da -1 drin steht.
Um ehrlich zu sein: Ja, ich habe das alles schon gemacht und es steht -1 drinne!
Aber ich kann mit diesen Meldungen nichts anfangen
Die Doku ist auch fürn...Kann sich nicht jemand erbarmen meinen Client/Server funktionstüchtig zu machen?
Von dort aus komme ich dann ganz sicher alleine weiter...

-
Wenn read_size -1 ist, dann wurden ja keine daten gelesen. Dann kann das hier
buf[read_size]='\0';ja schon zu einem Fehler führen.
Dann mach es erstmal soint read_size = SSL_read(ssl, buf, sizeof(buf) - 1); if ( read_size > 0 ) { buf[read_size]='\0'; printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf); } else break;Negative Werte bedeuten ja einen Fehler. Den solltest du auswerten.
Siehe auch hier
http://www.openssl.org/docs/ssl/SSL_read.html
Das Ganze testen bzw. funktionstüchtig machen kann ich jetzt hier nicht.
-
Hallo,
erstmal Danke, der Absturz ist nun nicht mehr da, trotzdem kommt kein Datenaustausch zu Stande
Ich weiß aber nicht warum
Hat nicht jemand eine Idee???Vielen Dank!!!
-
Call SSL_get_error() with the return value ret to find out the reason.
-
.................. schrieb:
Call SSL_get_error() with the return value ret to find out the reason.
Ach tatsächlich!? Dann sag mir was das bedeutet und wie ich es beheben kann:
printf( "Error: %i\n", SSL_get_error( ssl, read_size ) ); // Output: Error: 1DANKE!
-
Schau doch bei SSL_get_error nach und schau was die 1 bedeutet.
Es könnte z.Bsp. SSL_ERROR_ZERO_RETURN sein. das würde bedeuten, dass deine verbindung geschlossen wurde etc.
-
A failure in the SSL library occurred, usually a protocol error. The OpenSSL error queue contains more information on the error.
Auch das hilft mir nicht weiter

-
Nappppp schrieb:
A failure in the SSL library occurred, usually a protocol error. The OpenSSL error queue contains more information on the error.
Auch das hilft mir nicht weiter

ERR_print_errors_fp(stdout);
-
hi Nappppp ..
ich schlage mich im moment auch gerade mit openssl herum und habe daher mal die beiträge im forum durchsucht. dabei bin ich auf diesen uralten betrag gestossen
du bist / oder warst nicht registriert, daher kann ich dir kein e-mail schreiben. Hast du dein beispiel progrämmchen schlussendlich eigentlich zum funktionieren gebracht? und wenn ja.. darf ich den source dazu sehen
Das würde mir wohl viel arbeit sparen, da ich kaum beispiele für openssl unter windows finde im web. also.. wenn du vielleich in der zwischenzeit ein registrierter user bist oder einfach sonst zufällig diesen eintrag siehst.. dann wäre das ne gute sache 
gruss, dominic