my sample code is given below which is not working in window
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 () { int x = startWinsock();
if ( !x) printf( "%i\n", x );
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; }
//fgets( request, sizeof( request ), stdin );
if(!err) { closesocket(s); fprintf(stderr, "SSL write error\n"); return -1; }
while(true) { sprintf( request,"Hallo,
Welt!" ); err=SSL_write(ssl, request, strlen(request));
int read_size = SSL_read(ssl, buf, sizeof(buf) ); if ( read_size > 0 ) { buf[read_size]='\0'; printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf); } else { switch( SSL_get_error( ssl, read_size ) ) { case SSL_ERROR_ZERO_RETURN: printf( "ZERO" ); break;
case SSL_ERROR_NONE: printf( "No Error" ); break;
case SSL_ERROR_SSL: printf( "SSL ERROR" ); break; } break; } Sleep(1); }
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); }
#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[1024]; char buf2[1024];
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(SOCKA DDR_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(true) { int read_size = SSL_read(ssl, buf, sizeof(buf) ); if ( read_size > 0 ) { buf[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; }
Sleep(1000); } 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); }
Regards, Amit
--- On Thu, 24/4/08, amit pansuria <[EMAIL PROTECTED]> wrote:
From: amit pansuria <[EMAIL PROTECTED]> Subject: how to write openssl based win32 c,c++ application without using winsock or mfc To: [email protected] Date: Thursday, 24 April, 2008, 6:23 PM
|
I want to write client socket application using c,c++ language on windows platform on vc++(vc++ console application or win32 static library). i dont want to use any Winsock API or MFC class for creating and connecting socket. because when i create socket using winsock API and after that if i use SSL_read() on the fd retured by winsock API, then it will not working.
for simplicity, IS it possible to write openssl -based client socket application using c,c++ on windows-vc++ platform without using any winsock class and MFC class if possible then what i have to do (1) what openssl version i have to use for windows (2) what API i have to use for creating socket,connecting socket, reading data and writing data.
right now i m creating socket like this in window using vc++ . I m using window XP
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) I think in window socket() is defined in winsock.h now i how i use SSL functionality. whethere SSL_read() support fd return by WINSOCK API socket. if not then what is the solution.I heard that winsock doest not support for SSL is there any third party lib i have to use or i have to write my own SSL lib API
Regards,
Amit
|
Explore your hobbies and interests. Click here to begin. |