PWR
07-09-2005, 16:04
Hallo,
Beschäftige mich nun schon seit einiger Zeit mit OpenSSL und hab mit folgendem Beispiel ein Problem. Das Programm sollte letztendlich nicht mehr tun, als auf Port 40000 auf einkommende SSL-Verbindungen warten. (Das ganze ist ein abgeänderter Auszug aus einem größeren Projekt, an dem ich arbeite)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define OpenSSL_add_ssl_algorithms() SSL_library_init()
#define SSLeay_add_ssl_algorithms() SSL_library_init()
#include <openssl/ssl.h>
#include <openssl/err.h>
SSL *ssl = NULL;
SSL_CTX *ctx = NULL;
int main(int argc, char *argv[]) {
struct sockaddr_in addr;
struct hostent *host;
int sockfd;
int addr_len;
puts("doing some ssl stuff");
SSL_load_error_strings();
SSL_library_init();
/* creating new SSL_CTX object */
if((ctx = SSL_CTX_new(SSLv23_method())) == NULL)
perror("SSL_CTX_new() failed: ");
if((ssl = SSL_new(ctx)) == NULL)
perror("SSL_new() failed: ");
puts("socket stuff");
if(!inet_aton(argv[1], &addr.sin_addr)) {
host = gethostbyname(argv[1]);
if(!host) {
perror("gethotbyname() failed: ");
return -1;
}
addr.sin_addr = *(struct in_addr*)host->h_addr;
}
addr.sin_family = AF_INET;
addr.sin_port=htons(40000);
addr.sin_addr.s_addr = INADDR_ANY;
puts("creating socket");
/* create socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("sockfd() failed: ");
return -1;
}
puts("binding socket");
/* binding socket */
if((bind(sockfd, (struct sockaddr *)&addr,
sizeof(struct sockaddr))) == -1) {
perror("bind() failed: ");
return -1;
}
if(!SSL_set_fd(ssl, sockfd)) {
perror("SSL_set_fd() failed: ");
exit(-1);
}
if(SSL_accept(ssl) != 1) {
perror("SSL_accept() failed: ");
exit(-1);
}
return 0;
}
Kompilieren lässt sich alles problemlos. Beim Ausführen hingegen bekomme ich diesen Output:
[src] ./ssltest 192.168.1.117
doing some ssl stuff
socket stuff
creating socket
binding socket
SSL_accept() failed: : Transport endpoint is not connected
Bis zu SSL_accept(ssl) arbeitet alles. Kann aber mit der Fehlermeldung nix anfangen.
(Der Output ist unabhängig von der IP-Adresse, die ich dem Programm mitgebe.) Hab schon Google durchwühlt nach dem Fehler, bin aber auf nichts wirklich Brauchbares gestoßen.
(Daten: gcc 3.3.6, OpenSSL 0.9.7, Debian Sid)
Würd mich sehr über etwas Hilfe freuen.
Viele Grüße, Philipp
Beschäftige mich nun schon seit einiger Zeit mit OpenSSL und hab mit folgendem Beispiel ein Problem. Das Programm sollte letztendlich nicht mehr tun, als auf Port 40000 auf einkommende SSL-Verbindungen warten. (Das ganze ist ein abgeänderter Auszug aus einem größeren Projekt, an dem ich arbeite)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define OpenSSL_add_ssl_algorithms() SSL_library_init()
#define SSLeay_add_ssl_algorithms() SSL_library_init()
#include <openssl/ssl.h>
#include <openssl/err.h>
SSL *ssl = NULL;
SSL_CTX *ctx = NULL;
int main(int argc, char *argv[]) {
struct sockaddr_in addr;
struct hostent *host;
int sockfd;
int addr_len;
puts("doing some ssl stuff");
SSL_load_error_strings();
SSL_library_init();
/* creating new SSL_CTX object */
if((ctx = SSL_CTX_new(SSLv23_method())) == NULL)
perror("SSL_CTX_new() failed: ");
if((ssl = SSL_new(ctx)) == NULL)
perror("SSL_new() failed: ");
puts("socket stuff");
if(!inet_aton(argv[1], &addr.sin_addr)) {
host = gethostbyname(argv[1]);
if(!host) {
perror("gethotbyname() failed: ");
return -1;
}
addr.sin_addr = *(struct in_addr*)host->h_addr;
}
addr.sin_family = AF_INET;
addr.sin_port=htons(40000);
addr.sin_addr.s_addr = INADDR_ANY;
puts("creating socket");
/* create socket */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("sockfd() failed: ");
return -1;
}
puts("binding socket");
/* binding socket */
if((bind(sockfd, (struct sockaddr *)&addr,
sizeof(struct sockaddr))) == -1) {
perror("bind() failed: ");
return -1;
}
if(!SSL_set_fd(ssl, sockfd)) {
perror("SSL_set_fd() failed: ");
exit(-1);
}
if(SSL_accept(ssl) != 1) {
perror("SSL_accept() failed: ");
exit(-1);
}
return 0;
}
Kompilieren lässt sich alles problemlos. Beim Ausführen hingegen bekomme ich diesen Output:
[src] ./ssltest 192.168.1.117
doing some ssl stuff
socket stuff
creating socket
binding socket
SSL_accept() failed: : Transport endpoint is not connected
Bis zu SSL_accept(ssl) arbeitet alles. Kann aber mit der Fehlermeldung nix anfangen.
(Der Output ist unabhängig von der IP-Adresse, die ich dem Programm mitgebe.) Hab schon Google durchwühlt nach dem Fehler, bin aber auf nichts wirklich Brauchbares gestoßen.
(Daten: gcc 3.3.6, OpenSSL 0.9.7, Debian Sid)
Würd mich sehr über etwas Hilfe freuen.
Viele Grüße, Philipp