<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7271472050035445247</id><updated>2024-09-10T15:39:30.009+02:00</updated><category term="OpenSSL"/><category term="download"/><category term="C"/><category term="C++"/><category term="Microsoft"/><category term="Visual C"/><category term="Visual C++"/><category term="Windows"/><category term="source"/><category term="SSL"/><category term="error"/><category term="example"/><category term="HTTP POST"/><category term="HTTPS"/><category term="Http"/><category term="PEM_read_RSAPrivateKey"/><category term="POST"/><category term="SSL_new"/><category term="Socket"/><category term="base64"/><category term="problem"/><category term="CSOAP"/><category term="EVP_PKEY_assign_RSA"/><category term="GET"/><category term="Nano"/><category term="NanoHttp"/><category term="PEM_read_RSA_PUBKEY"/><category term="PROXY"/><category term="Proxy-authorization"/><category term="SOAP"/><category term="SSL_CTX_use_RSAPrivateKey"/><category term="Service"/><category term="Studio"/><category term="Visual"/><category term="Web"/><category term="WebService"/><category term="auth"/><category term="authorization"/><category term="basic"/><category term="code"/><category term="compile"/><category term="compiling"/><category term="create cert"/><category term="email"/><category term="login"/><category term="mail"/><category term="mkcert"/><category term="request"/><category term="smtp"/><title type='text'>Languages Help</title><subtitle type='html'>This blog is a location where I&#39;ll write my programing problems and his solutions when I see it&#39;s works fine. I&#39;m sure that this will help me in other situations and also I hope that it&#39;ll be usefull for you.&#xa;&#xa;I usually work with Java a Visual C++, C and Visual Basic. Therefore, you are going to find here solutions about these languages and his compilers.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-5801415667590802408</id><published>2008-04-16T17:14:00.004+02:00</published><updated>2008-04-16T18:20:02.354+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="authorization"/><category scheme="http://www.blogger.com/atom/ns#" term="base64"/><category scheme="http://www.blogger.com/atom/ns#" term="basic"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="GET"/><category scheme="http://www.blogger.com/atom/ns#" term="Http"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP POST"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTPS"/><category scheme="http://www.blogger.com/atom/ns#" term="PROXY"/><category scheme="http://www.blogger.com/atom/ns#" term="Proxy-authorization"/><category scheme="http://www.blogger.com/atom/ns#" term="request"/><category scheme="http://www.blogger.com/atom/ns#" term="Socket"/><title type='text'>Proxy HTTP request</title><content type='html'>&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;Today I was working with HTTP protocol, I had to connect to web server over proxy using C and Sockets.&lt;br /&gt;For this task you have to connect with the proxy and it&#39;ll redirect your request to your requested web server, if you are authenticated.&lt;br /&gt;My Proxy uses Basic Authorization then I had to send the login information (userid and password) in base64 format. For this task I used OpenSSL one more time.&lt;br /&gt;Once you are authenticated, and you have send a GET request correctly formated, proxy will send response to you.&lt;br /&gt;&lt;br /&gt;Bellow I write a necesary code to do this connection. I hope it&#39;ll be usefull for you.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Proxy.c : HTTP/HTTPS Request example&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltmemory.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;lterrno.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/types.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#ifdef&lt;/span&gt; WIN32&lt;br /&gt; &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltwinsock.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/socket.h&amp;gt&lt;br /&gt; &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltnetinet/in.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/sha.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/hmac.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/evp.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/bio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/buffer.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &quot;applink.c&quot;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// OpenSSL functions&lt;/span&gt;&lt;br /&gt;void OpenSSL_add_all_algorithms();&lt;br /&gt;void ERR_load_crypto_strings();&lt;br /&gt;void ENGINE_load_builtin_engines();&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// my functions&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;*base64(const unsigned char *input, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;length);&lt;br /&gt;BOOL sendGet(&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* host, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* dir, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* proxy,&lt;br /&gt;              &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;unsigned short&lt;/span&gt; proxyPort, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* uid, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* pwd);&lt;br /&gt;char* GetIpAddress(char* host);&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;long &lt;/span&gt;getLen(char* cadena, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;long &lt;/span&gt;*bytes);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#define&lt;/span&gt; MAXLEN 10000&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;main (&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;ret[2500]=&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean r=FALSE;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// OpenSSL Init&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_fmode=_O_BINARY; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CRYPTO_malloc_init(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERR_load_crypto_strings(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OpenSSL_add_all_algorithms(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENGINE_load_builtin_engines(); &lt;br /&gt;&lt;br /&gt;vERR_load_crypto_strings();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// HTTPS connection example&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r= sendGet(&quot;www.ingdirect.es:443&quot;, &quot;CONNECT www.ingdirect.es:443 &quot;, &quot;myproxy.es&quot;, 8080, &quot;uid&quot;, &quot;pwd&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Ejemplo HTTP&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r= sendGet(&quot;www.elmundo.es&quot;, &quot;GET /&quot;, &quot;myproxy.es&quot;, 8080, &quot;uid&quot;, &quot;pwd&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;/*&lt;br /&gt;*&lt;br /&gt;* Sends a HTTP request&lt;br /&gt;*&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;BOOL sendGet(&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;*  host, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* dir, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* proxy,&lt;br /&gt;              &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;unsigned short&lt;/span&gt; proxyPort, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* uid, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* pwd)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;iProtocolPort = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;szBuffer[MAXLEN] = &quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SOCKET sd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct sockaddr_in sa;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;proxySrv[16]=&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;login[200]=&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean loop=TRUE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;ret=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file=NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;len=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;long &lt;/span&gt;bytes=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#if&lt;/span&gt;def WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;err=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WORD wVersionRequested;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WSADATA wsaData;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wVersionRequested = MAKEWORD( 1, 1 ); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = WSAStartup(wVersionRequested, &amp;wsaData );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt; ( err != 0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Translate hostname to ip address&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(proxySrv, GetIpAddress((char*)proxy));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// creating Socket&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sd = socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt; (sd == INVALID_SOCKET)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Can&#39;t open the socket&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset (&amp;sa, &#39;\0&#39;, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(sa));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sa.sin_family      = AF_INET;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sa.sin_addr.s_addr = inet_addr (proxySrv);   /* Proxy Ip */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sa.sin_port        = htons(proxyPort); /* Proxy Port */&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Connecting to Proxy&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt;(connect(sd, (struct sockaddr*) &amp;sa, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(sa)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Error connecting proxy!&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Init Request&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(szBuffer,&quot;%s HTTP/1.1\r\nHost:%s\r\n&quot;, dir,host);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// setting login information &lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(szBuffer,&quot;Proxy-authorization:Basic &quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(login,uid);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(login, &quot;:&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(login,pwd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(login, base64(login, strlen(login)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(szBuffer,login);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(szBuffer, &quot;\r\n\r\n&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Sending request&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send(sd,szBuffer,strlen(szBuffer),0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Proxy response&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bytes=recv(sd, szBuffer, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file=fopen(&quot;c:\\index.html&quot;,&quot;w&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len=getLen(szBuffer, &amp;bytes);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(file, &quot;%s&quot;, szBuffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush(file);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt;(bytes&amp;gt0 &amp;&amp; strncmp(szBuffer+strlen(szBuffer)-4,&quot;\r\n\r\n&quot;,4)!=0 &amp;&amp; (len&amp;gt0 &amp;&amp; len&amp;gtbytes)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Writing proxy response&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret=recv(sd, szBuffer, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bytes+=ret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt;(ret&amp;lt0 || strncmp(szBuffer+strlen(szBuffer)-4,&quot;\r\n\r\n&quot;,4)==0 || (len&amp;gt0 &amp;&amp; len&amp;ltbytes)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop=FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(file, &quot;%s&quot;,szBuffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fflush(file);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}while(loop);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(file);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// closing connection&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#if&lt;/span&gt;def WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;closesocket (sd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// free resources&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WSACleanup();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(sd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;/*&lt;br /&gt;*&lt;br /&gt;* Returns a Base64 string&lt;br /&gt;*&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;*base64(const unsigned char *input, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;length)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO *bmem, *b64;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BUF_MEM *bptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;*buff=&quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b64 = BIO_new(BIO_f_base64());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmem = BIO_new(BIO_s_mem());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b64 = BIO_push(b64, bmem);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_write(b64, input, length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_flush(b64);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_get_mem_ptr(b64, &amp;bptr);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buff = (&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;*)malloc(bptr-&amp;gtlength);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(buff, bptr-&amp;gtdata, bptr-&amp;gtlength-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buff[bptr-&amp;gtlength-1] = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_free_all(b64);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; buff;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;/*&lt;br /&gt;*&lt;br /&gt;* Translate hostname to ip address&lt;br /&gt;*&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;char* GetIpAddress(&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;*hostname)&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct sockaddr_in SocketAddress;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct hostent *pHost = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;aszIPAddresses[16]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;iCnt=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pHost = gethostbyname(hostname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt;(!pHost)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; &quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Recupero la primera ip del Servidor&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(&amp;SocketAddress.sin_addr, pHost-&amp;gth_addr_list[0], pHost-&amp;gth_length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(aszIPAddresses, inet_ntoa(SocketAddress.sin_addr));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;// Retorno la ip&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; aszIPAddresses;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#33cc00;&quot;&gt;&lt;br /&gt;/*&lt;br /&gt;*&lt;br /&gt;* Returns length data from Content-Length header&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;long &lt;/span&gt;getLen(char* cadena, &lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;long &lt;/span&gt;*bytes){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;t=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;char &lt;/span&gt;len[10];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(t&amp;ltMAXLEN){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;if&lt;/span&gt;(strncmp(cadena+t,&quot;Content-Length:&quot;,15)==0){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;int &lt;/span&gt;f=t+16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(cadena[f]!=&#39;\r&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(len, cadena+t+16,f-(t+16));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(strncmp(cadena+f,&quot;\r\n\r\n&quot;,4)!=0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*bytes=*bytes-f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; atol(len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family:courier new;color:#3333ff;&quot;&gt;return&lt;/span&gt; -1;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/5801415667590802408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/5801415667590802408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/5801415667590802408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/5801415667590802408'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/04/proxy-http-request.html' title='Proxy HTTP request'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-6908349739423189457</id><published>2008-03-31T12:37:00.008+02:00</published><updated>2008-04-02T17:38:41.069+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="auth"/><category scheme="http://www.blogger.com/atom/ns#" term="base64"/><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="email"/><category scheme="http://www.blogger.com/atom/ns#" term="login"/><category scheme="http://www.blogger.com/atom/ns#" term="mail"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSSL"/><category scheme="http://www.blogger.com/atom/ns#" term="smtp"/><category scheme="http://www.blogger.com/atom/ns#" term="Socket"/><title type='text'>Socket eMail Example</title><content type='html'>&lt;span style=&quot;font-family:arial;&quot;&gt;Hi Friends, today We need to send a simple alert mail from our application and I have wanted to send this email from C using sockets.&lt;br /&gt;&lt;br /&gt;It isn&#39;t difficult, you need to open a socket connection to the server using the port of email service and exchange some messages to send the alert message.&lt;br /&gt;&lt;br /&gt;All messages you have to send, should be terminated by &quot;\r\n&quot; and after each message you have to call to recv function to get the response from the server.&lt;br /&gt;&lt;br /&gt;The first message to send to the Server is the HELO %s\r\n message, replacing %s with the server ip address. &lt;br /&gt;&lt;br /&gt;After this message you have to send the EHLO\r\n message, this message will be responsed by the Server with all operations permited by the server.&lt;br /&gt;&lt;br /&gt;If you need to send some login information to your email server, you&#39;ll need to send the auth\r\n message and after this, you&#39;ll have to send the user uid\r\n and pwd\r\n in base64 format.&lt;br /&gt;To do this, I&#39;ve used Openssl again.&lt;br /&gt;&lt;br /&gt;At this point you have to send the information about the from address, to address, subject and body.&lt;br /&gt;&lt;br /&gt;For ending the comunication with the server you need to send a blank line and after this blank line send a quit\r\n message.&lt;br /&gt;&lt;br /&gt;Bellow I paste the code I&#39;ve used to do this, I hope it&#39;ll be useful for you&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Mail.c : email function example&lt;br /&gt;//&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltmemory.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;lterrno.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt;e &amp;ltsys/types.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#ifdef&lt;/span&gt; WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltwinsock.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/socket.h&amp;gt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltnetinet/in.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/bio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/evp.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &quot;applink.c&quot;&lt;br /&gt;&lt;br /&gt;BIO_METHOD *   BIO_f_base64(void);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/sha.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/hmac.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/evp.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/bio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/buffer.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; *base64(&lt;span style=&quot;color:#3333ff;&quot;&gt;const unsigned char&lt;/span&gt; *input, &lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; length);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; main (&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; ret[2500]=&quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Init OpenSSL&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;_fmode=_O_BINARY; &lt;br /&gt;&amp;nbsp;&amp;nbsp;CRYPTO_malloc_init(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;ERR_load_crypto_strings(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;OpenSSL_add_all_algorithms(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;ENGINE_load_builtin_engines(); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ERR_load_crypto_strings();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; SendMail(&quot;uid@server.es&quot;,&quot;uidTo@server.es&quot;, &quot;MailServerIp&quot;, &quot;Subject&quot;, &quot;UID&quot;,&quot;PWD&quot;, &quot;Message&quot;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#33cc00;&quot;&gt;&lt;br /&gt;/*&lt;br /&gt;*&lt;br /&gt;* Send Text Mail from user requested to the target user, using the server and the specified credentials.&lt;br /&gt;*&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;BOOL SendMail(&lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* _From, &lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* _To, &lt;span style=&quot;color:#3333ff;&quot;&gt;const char*&lt;/span&gt; host,&lt;br /&gt;              &lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* _Subject, &lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* uid, &lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* pwd, &lt;span style=&quot;color:#3333ff;&quot;&gt;const char&lt;/span&gt;* _MessageFormat, ...)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; iProtocolPort = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; szBuffer[4096] = &quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;SOCKET sd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;struct&lt;/span&gt; sockaddr_in sa;&lt;br /&gt;&amp;nbsp;&amp;nbsp;LPSERVENT lpServEntry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;va_list message_parts;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; message[65536];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; err=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; _SMTP[16]=&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#ifdef&lt;/span&gt; WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;WORD&lt;/span&gt; wVersionRequested;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WSADATA wsaData;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#ifdef&lt;/span&gt; WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wVersionRequested = MAKEWORD( 1, 1 ); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = WSAStartup(wVersionRequested, &amp;wsaData );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt; ( err != 0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// traslating namehost to ip address&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;strcpy(_SMTP, GetIpAddress((char*)host));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// creating the Socket&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sd = socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt; (sd == INVALID_SOCKET)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Cannot open mail server socket!&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Getting the mail port&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;lpServEntry = getservbyname(&quot;mail&quot;, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// if we havent&#39;t a port, we use the default port to SMTP&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt; (!lpServEntry)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iProtocolPort = htons(IPPORT_SMTP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iProtocolPort = lpServEntry-&gt;s_port;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;memset (&amp;sa, &#39;\0&#39;, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(sa));&lt;br /&gt;&amp;nbsp;&amp;nbsp;sa.sin_family      = AF_INET;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sa.sin_addr.s_addr = inet_addr (_SMTP);   &lt;span style=&quot;color:#33cc00;&quot;&gt;/* Server IP*/&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sa.sin_port        = (iProtocolPort); &lt;span style=&quot;color:#33cc00;&quot;&gt;/* Server Port*/&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Connecting to the Server&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt;(connect(sd, (&lt;span style=&quot;color:#3333ff;&quot;&gt;struct&lt;/span&gt; sockaddr*) &amp;sa, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(sa)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Error connecting to the Server!&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Initial response from the Server&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Init dialog&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer, &quot;HELO %s\r\n&quot;, _SMTP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer,&quot;ehlo\r\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd,szBuffer,strlen(szBuffer),0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd,szBuffer,&lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer),0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Sending login&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;strcpy(szBuffer, &quot;auth login\r\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Send userid&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer,&quot;%s\r\n&quot;, base64(uid, strlen(uid)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Send Pwd&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer,&quot;%s\r\n&quot;, base64(pwd, strlen(pwd)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// send From&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer, &quot;MAIL FROM:&amp;lt%s&amp;gt\r\n&quot;, _From);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Send To &lt;br /&gt;&amp;nbsp;&amp;nbsp;// repeat for each target address&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer, &quot;RCPT TO:&amp;lt%s&amp;gt\r\n&quot;, _To);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Send Data&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer, &quot;DATA\r\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Preparing the string to send&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;va_start(message_parts, _MessageFormat);&lt;br /&gt;&amp;nbsp;&amp;nbsp;vsprintf(message, _MessageFormat, message_parts);&lt;br /&gt;&amp;nbsp;&amp;nbsp;va_end(message_parts);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Setting Subject and Body&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer,&quot;Subject: %s\r\n\r\n%s\r\n.\r\n&quot;,_Subject, message);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Send a blank line to end the transmision&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Sending end command&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;sprintf(szBuffer, &quot;quit\r\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;send(sd, szBuffer, strlen(szBuffer), 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;recv(sd, szBuffer, &lt;span style=&quot;color:#3333ff;&quot;&gt;sizeof&lt;/span&gt;(szBuffer), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// closing the connection&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#ifdef&lt;/span&gt; WIN32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;closesocket (sd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(sd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; *base64(&lt;span style=&quot;color:#3333ff;&quot;&gt;const unsigned char&lt;/span&gt; *input, &lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; length)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;BIO *bmem, *b64;&lt;br /&gt;&amp;nbsp;&amp;nbsp;BUF_MEM *bptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; *buff=&quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;b64 = BIO_new(BIO_f_base64());&lt;br /&gt;&amp;nbsp;&amp;nbsp;bmem = BIO_new(BIO_s_mem());&lt;br /&gt;&amp;nbsp;&amp;nbsp;b64 = BIO_push(b64, bmem);&lt;br /&gt;&amp;nbsp;&amp;nbsp;BIO_write(b64, input, length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;BIO_flush(b64);&lt;br /&gt;&amp;nbsp;&amp;nbsp;BIO_get_mem_ptr(b64, &amp;bptr);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;buff = (&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; *)malloc(bptr-&gt;length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;memcpy(buff, bptr-&gt;data, bptr-&gt;length-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;buff[bptr-&gt;length-1] = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;BIO_free_all(b64);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; buff;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#33cc00;&quot;&gt;/*&lt;br /&gt;*&lt;br /&gt;* Return Ip from hostname&lt;br /&gt;*&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;char* GetIpAddress(char *hostname)&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;struct&lt;/span&gt; sockaddr_in SocketAddress;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;struct&lt;/span&gt; hostent *pHost = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; aszIPAddresses[16]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; iCnt=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;pHost = gethostbyname(hostname);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt;(!pHost)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; &quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// get first server ip&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;memcpy(&amp;SocketAddress.sin_addr, pHost-&gt;h_addr_list[0], pHost-&gt;h_length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;strcpy(aszIPAddresses, inet_ntoa(SocketAddress.sin_addr));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// returning ip&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; aszIPAddresses;&lt;br /&gt;&lt;br /&gt;}</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/6908349739423189457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/6908349739423189457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/6908349739423189457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/6908349739423189457'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/03/socket-email-example.html' title='Socket eMail Example'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-8306494163289347576</id><published>2008-03-05T14:03:00.006+01:00</published><updated>2008-03-09T08:52:24.708+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="download"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP POST"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTPS"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSSL"/><category scheme="http://www.blogger.com/atom/ns#" term="POST"/><category scheme="http://www.blogger.com/atom/ns#" term="Service"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="source"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><category scheme="http://www.blogger.com/atom/ns#" term="WebService"/><title type='text'>SSL HTTP POST</title><content type='html'>&lt;span style=&quot;font-family:arial;&quot;&gt;Hi, friends&lt;br /&gt;&lt;br /&gt;I&#39;m developing a module to connect C programs with WebServices and newly I&#39;ve used OpenSSL. Actually it hasn&#39;t very difficult, although I had some problem. It&#39;s very important to set properly the method to use. I&#39;m connecting with a JBoss HTTPs WebService and I had to set this one:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;meth = TLSv1_client_method();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;ctx = SSL_CTX_new (meth);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;I copy bellow the main function I had used, to send the HTTP POST message, I hope it&#39;ll be usefull for you:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; sendPOST(&lt;span style=&quot;color:#3366ff;&quot;&gt;void&lt;/span&gt;* sd, SSL* ssl, ;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* server, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* port, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* post, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* action, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt;* csoap, &lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; *response){&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; ret=0;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; msg[5000]=&quot;&quot;;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; buff[5000]=&quot;&quot;;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; err=0;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt; len=0;&lt;br /&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;char&lt;/span&gt; header[200]=&quot;&quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Setting HTTP Headers&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(msg,&quot;POST %s HTTP/1.1\r\n&quot;, post);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(header,&quot;Host: %s:%s\r\n&quot;, server, port);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len=strlen(msg) ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(msg + len , header, strlen(header));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len+=strlen(header);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(header,&quot;Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(msg + len, header, strlen(header));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len+=strlen(header);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(header,&quot;Content-Length: %d\r\n&quot;, strlen(datos));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(msg + len, header, strlen(header));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len+=strlen(header);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(header,&quot;SOAPAction: %s\r\n\r\n&quot;,action);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(msg + len, header, strlen(header));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len+=strlen(header);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// Adding csoap&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(msg + len, datos, strlen(datos));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt;(sd!=NULL){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// No SSL Connections&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err=send((int)sd, msg, len + strlen(datos),0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt; (err == SOCKET_ERROR) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;send() failed with error: %d\n&quot;, WSAGetLastError());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;closesocket((&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt;)sd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WSACleanup();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;do&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = recv((&lt;span style=&quot;color:#3333ff;&quot;&gt;int&lt;/span&gt;)sd, buff, sizeof(buff) - 1, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;if&lt;/span&gt; ( err &gt; 0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;Bytes received: %d\n&quot;, err);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;else if&lt;/span&gt; ( err == 0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;Connection closed\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;recv failed with error: %d\n&quot;, WSAGetLastError());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style=&quot;color:#3333ff;&quot;&gt;while&lt;/span&gt;( err &gt; 0 );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style=&quot;color:#3333ff;&quot;&gt;else&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#33cc00;&quot;&gt;// SSL Connections&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = SSL_write (ssl, msg, len + strlen(datos)); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = SSL_read (ssl, buff, sizeof(buff) - 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHK_SSL(err);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buff[err] = &#39;\0&#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_shutdown (ssl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(respuesta, buff);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#3333ff;&quot;&gt;return&lt;/span&gt; ret;&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/8306494163289347576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/8306494163289347576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/8306494163289347576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/8306494163289347576'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/03/ssl-http-post.html' title='SSL HTTP POST'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-7851737993840259189</id><published>2008-02-07T15:13:00.000+01:00</published><updated>2008-02-07T16:05:53.672+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="create cert"/><category scheme="http://www.blogger.com/atom/ns#" term="download"/><category scheme="http://www.blogger.com/atom/ns#" term="EVP_PKEY_assign_RSA"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="mkcert"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSSL"/><category scheme="http://www.blogger.com/atom/ns#" term="PEM_read_RSAPrivateKey"/><category scheme="http://www.blogger.com/atom/ns#" term="problem"/><category scheme="http://www.blogger.com/atom/ns#" term="source"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL_CTX_use_RSAPrivateKey"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL_new"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Create a certificate based on private key file</title><content type='html'>&lt;span style=&quot;font-family:verdana;&quot;&gt;Well, this is another example of using OpenSSL API from Visual C++. In this case I needed to create a certificate from a private key file generated from openssl command line.&lt;br /&gt;&lt;br /&gt;It isn’t so difficult, because is too similar to another examples have been told here before.&lt;br /&gt;&lt;br /&gt;Bellow I list the code necessary to do this:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;font-size:80%;&quot;&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* serv.cpp - Little SSL Server for Windows 01/02/2008 ccalvo@indra.es&lt;ccalvo@indra.es&gt;*/&lt;br /&gt;/* working with openssl-0.9.8g */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdlib.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltmemory.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;lterrno.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/types.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltwinsock.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/rsa.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/crypto.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/pem.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/ssl.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/err.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/conf.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/x509v3.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#ifndef&lt;/span&gt; OPENSSL_NO_ENGINE&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/engine.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; mkcert(X509 **x509p, RSA *rsa, int bits, int serial, int days);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; add_ext(X509 *cert, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; nid, &lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; *value);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Key Home */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; HOME &quot;./&quot;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Key File */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; KEYF HOME &quot;mikey.des&quot;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Check functions */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_NULL(x) &lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((x)==NULL) exit (1)&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_ERR(err,s) &lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((err)==-1) { perror(s); exit(1); }&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_SSL(err) &lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; err;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Login information Callback&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; pass_cb(&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; *buf, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; size, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; rwflag, &lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; *password)&lt;br /&gt;{&lt;br /&gt;strncpy(buf, &quot;carlos&quot;, size);&lt;br /&gt;buf[size - 1] = &#39;\0&#39;;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt;(strlen(buf));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; main ()&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; err;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; listen_sd;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; sd;&lt;br /&gt;struct sockaddr_in sa_serv;&lt;br /&gt;struct sockaddr_in sa_cli;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; client_len;&lt;br /&gt;SSL_CTX* ctx;&lt;br /&gt;SSL* ssl;&lt;br /&gt;X509* client_cert;&lt;br /&gt;X509* x509=NULL;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt;* str;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; buf [4096];&lt;br /&gt;SSL_METHOD *meth;&lt;br /&gt;WORD wVersionRequested;&lt;br /&gt;WSADATA wsaData;&lt;br /&gt;FILE *privKey=NULL;&lt;br /&gt;RSA *rsaPrivKey = NULL;&lt;br /&gt;BIO *bio_err;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; pass[8]=&quot;carlos\n&quot;;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Open SSL Init */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SSL_load_error_strings();&lt;br /&gt;SSLeay_add_ssl_algorithms();&lt;br /&gt;meth = SSLv23_server_method();&lt;br /&gt;ctx = SSL_CTX_new (meth);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!ctx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERR_print_errors_fp(stderr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Reading private Key from file&lt;/span&gt;&lt;br /&gt;privKey=fopen(KEYF,&quot;r&quot;);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt;(privKey){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsaPrivKey = PEM_read_RSAPrivateKey(privKey, &amp;amp;rsaPrivKey, (pem_password_cb *)pass_cb, pass);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(privKey);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);&lt;br /&gt;&lt;br /&gt;bio_err=BIO_new_fp(stderr, BIO_NOCLOSE);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Creating a certificate&lt;/span&gt;&lt;br /&gt;mkcert(&amp;amp;x509,rsaPrivKey,512,0,365);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Keeping Key and Cert in the ctx&lt;/span&gt;&lt;br /&gt;SSL_CTX_use_RSAPrivateKey(ctx, rsaPrivKey);&lt;br /&gt;SSL_CTX_use_certificate(ctx, x509);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// clearing key and cert&lt;/span&gt;&lt;br /&gt;X509_free(x509);&lt;br /&gt;RSA_free(rsaPrivKey);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// checking key is valid to cert&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!SSL_CTX_check_private_key(ctx)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&quot;The private key don’t match with cert public key\n&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(5);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Init Sockets Layer */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wVersionRequested = MAKEWORD( 1, 1 );&lt;br /&gt;err = WSAStartup(wVersionRequested, &amp;amp;wsaData );&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ( err != 0 )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;///WSAStartup Error//%d\n&quot;,err);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(err);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;listen_sd = socket (AF_INET, SOCK_STREAM, 0);&lt;br /&gt;printf(&quot;socket() return 0x%X (%d)\n&quot;, listen_sd, listen_sd);&lt;br /&gt;CHK_ERR(listen_sd, &quot;socket&quot;);&lt;br /&gt;&lt;br /&gt;memset (&amp;amp;sa_serv, &#39;\0&#39;, sizeof(sa_serv));&lt;br /&gt;sa_serv.sin_family = AF_INET;&lt;br /&gt;sa_serv.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;sa_serv.sin_port = htons (1111); /* Puerto del Servidor */&lt;br /&gt;&lt;br /&gt;err = bind(listen_sd, (struct sockaddr*) &amp;amp;sa_serv,&lt;br /&gt;sizeof (sa_serv));&lt;br /&gt;CHK_ERR(err, &quot;bind&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Setting Listening */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;printf(&quot;listening\n&quot;);&lt;br /&gt;err = listen (listen_sd, 5);&lt;br /&gt;CHK_ERR(err, &quot;listen&quot;);&lt;br /&gt;&lt;br /&gt;client_len = sizeof(sa_cli);&lt;br /&gt;sd = accept (listen_sd, (struct sockaddr*) &amp;amp;sa_cli, &amp;amp;client_len);&lt;br /&gt;CHK_ERR(sd, &quot;accept&quot;);&lt;br /&gt;closesocket (listen_sd);&lt;br /&gt;&lt;br /&gt;printf (&quot;Connection from %lx, port %x\n&quot;,&lt;br /&gt;sa_cli.sin_addr.s_addr, sa_cli.sin_port);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Setting SSL */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ssl = SSL_new (ctx); CHK_NULL(ssl);&lt;br /&gt;SSL_set_fd (ssl, sd);&lt;br /&gt;err = SSL_accept (ssl); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Show cipher information - optional */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;printf (&quot;SSL connection using %s\n&quot;, SSL_get_cipher (ssl));&lt;br /&gt;&lt;br /&gt;/* Getting client cert, if exist - optional */&lt;br /&gt;&lt;br /&gt;client_cert = SSL_get_peer_certificate (ssl);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (client_cert != NULL) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;Client Cert:\n&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHK_NULL(str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;\t subject: %s\n&quot;, str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPENSSL_free (str);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHK_NULL(str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;\t issuer: %s\n&quot;, str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPENSSL_free (str);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#009900;&quot;&gt;/* Here we can check all we want about client cert, before freeing. */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509_free (client_cert);&lt;br /&gt;} &lt;span style=&quot;color:#000099;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;Client hasn’t Cert.\n&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Messaging exchange */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err);&lt;br /&gt;buf[err] = &#39;\0&#39;;&lt;br /&gt;printf (&quot;Read %d characters :&#39;%s&#39;\n&quot;, err, buf);&lt;br /&gt;&lt;br /&gt;err = SSL_write (ssl, &quot;I’m listening to you.&quot;, strlen(&quot;I’m listening to you.&quot;)); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Freeing resources */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;closesocket (sd);&lt;br /&gt;SSL_free (ssl);&lt;br /&gt;SSL_CTX_free (ctx);&lt;br /&gt;&lt;br /&gt;CRYPTO_cleanup_all_ex_data();&lt;br /&gt;ERR_remove_state(0);&lt;br /&gt;&lt;br /&gt;CRYPTO_mem_leaks_fp(stderr);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#ifndef&lt;/span&gt; OPENSSL_NO_ENGINE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENGINE_cleanup();&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;BIO_free(bio_err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt;(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; callback(&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; p, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; n, &lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; *arg)&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; c=&#39;B&#39;;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (p == 0) c=&#39;.&#39;;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (p == 1) c=&#39;+&#39;;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (p == 2) c=&#39;*&#39;;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (p == 3) c=&#39;\n&#39;;&lt;br /&gt;fputc(c,stderr);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; mkcert(X509 **x509p, RSA *rsa, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; bits, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; serial, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; days)&lt;br /&gt;{&lt;br /&gt;X509 *x;&lt;br /&gt;EVP_PKEY *pk;&lt;br /&gt;&lt;br /&gt;X509_NAME *name=NULL;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((pk=EVP_PKEY_new()) == NULL)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abort();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt;(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((x509p == NULL)  (*x509p == NULL))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ((x=X509_new()) == NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto err;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;x= *x509p;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!EVP_PKEY_assign_RSA(pk,rsa))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abort();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto err;&lt;br /&gt;}&lt;br /&gt;rsa=NULL;&lt;br /&gt;&lt;br /&gt;X509_set_version(x,2);&lt;br /&gt;ASN1_INTEGER_set(X509_get_serialNumber(x),serial);&lt;br /&gt;X509_gmtime_adj(X509_get_notBefore(x),0);&lt;br /&gt;X509_gmtime_adj(X509_get_notAfter(x),(&lt;span style=&quot;color:#000099;&quot;&gt;long&lt;/span&gt;)60*60*24*days);&lt;br /&gt;X509_set_pubkey(x,pk);&lt;br /&gt;&lt;br /&gt;name=X509_get_subject_name(x);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* This function creates and adds the entry, working out the&lt;br /&gt;* correct string type and performing checks on its length.&lt;br /&gt;* Normally we&#39;d check the return value for errors...&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;X509_NAME_add_entry_by_txt(name,&quot;C&quot;,&lt;br /&gt;MBSTRING_ASC, (&lt;span style=&quot;color:#000099;&quot;&gt;unsigned char&lt;/span&gt;*)&quot;ES&quot;, -1, -1, 0);&lt;br /&gt;X509_NAME_add_entry_by_txt(name,&quot;CN&quot;,&lt;br /&gt;MBSTRING_ASC, (&lt;span style=&quot;color:#000099;&quot;&gt;unsigned char&lt;/span&gt;*)&quot;MyCompany&quot;, -1, -1, 0);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Its self signed so set the issuer name to be the same as the&lt;br /&gt;* subject.&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;X509_set_issuer_name(x,name);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Add various extensions: standard extensions */&lt;/span&gt;&lt;br /&gt;add_ext(x, NID_basic_constraints, &quot;critical,CA:TRUE&quot;);&lt;br /&gt;add_ext(x, NID_key_usage, &quot;critical,keyCertSign,cRLSign&quot;);&lt;br /&gt;&lt;br /&gt;add_ext(x, NID_subject_key_identifier, &quot;hash&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Some Netscape specific extensions */&lt;/span&gt;&lt;br /&gt;add_ext(x, NID_netscape_cert_type, &quot;sslCA&quot;);&lt;br /&gt;&lt;br /&gt;add_ext(x, NID_netscape_comment, &quot;example comment extension&quot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#ifdef&lt;/span&gt; CUSTOM_EXT&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Maybe even add our own extension based on existing */&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; nid;&lt;br /&gt;nid = OBJ_create(&quot;1.2.3.4&quot;, &quot;MyAlias&quot;, &quot;My Test Alias Extension&quot;);&lt;br /&gt;X509V3_EXT_add_alias(nid, NID_netscape_comment);&lt;br /&gt;add_ext(x, nid, &quot;example comment alias&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!X509_sign(x,pk,EVP_md5()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goto err;&lt;br /&gt;&lt;br /&gt;*x509p=x;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt;(0);&lt;br /&gt;err:&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt;(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Add extension using V3 code: we can set the config file as NULL&lt;br /&gt;* because we wont reference any other sections.&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; add_ext(X509 *cert, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; nid, &lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; *value)&lt;br /&gt;{&lt;br /&gt;X509_EXTENSION *ex;&lt;br /&gt;X509V3_CTX ctx;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* This sets the &#39;context&#39; of the extensions. */&lt;br /&gt;/* No configuration database */&lt;/span&gt;&lt;br /&gt;X509V3_set_ctx_nodb(&amp;amp;ctx);&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Issuer and subject certs: both the target since it is self signed,&lt;br /&gt;* no request and no CRL&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;X509V3_set_ctx(&amp;amp;ctx, cert, cert, NULL, NULL, 0);&lt;br /&gt;ex = X509V3_EXT_conf_nid(NULL, &amp;amp;ctx, nid, value);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt; 0;&lt;br /&gt;&lt;br /&gt;X509_add_ext(cert,ex,-1);&lt;br /&gt;X509_EXTENSION_free(ex);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt; 1;&lt;br /&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to download the VC++ proyect &lt;a href=&quot;http://carlosenator.googlepages.com/ssl2.zip&quot;&gt;click here&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/7851737993840259189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/7851737993840259189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/7851737993840259189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/7851737993840259189'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/02/create-certificate-based-on-private-key.html' title='Create a certificate based on private key file'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-3058453890608161083</id><published>2008-01-25T09:39:00.000+01:00</published><updated>2008-01-25T12:49:40.240+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="code"/><category scheme="http://www.blogger.com/atom/ns#" term="download"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSSL"/><category scheme="http://www.blogger.com/atom/ns#" term="problem"/><category scheme="http://www.blogger.com/atom/ns#" term="source"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL"/><category scheme="http://www.blogger.com/atom/ns#" term="SSL_new"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>SSL OpenSSL with Visual C++</title><content type='html'>&lt;span style=&quot;font-family:verdana;&quot;&gt;Today I have another solution to work with SSL from Visual C++ using OpenSSL.&lt;br /&gt;&lt;br /&gt;Well, the OpenSSL compilation was described before, so I can’t described here again. &lt;a href=&quot;http://languageshelp.blogspot.com/2008/01/rsa-openssl-with-microsoft-visual-c.html&quot;&gt;Click here if you want to know more about OpenSSL compilation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To work with SSL is easy with OpenSSL, really is a layer to add to our Windows Socket Projects.&lt;br /&gt;&lt;br /&gt;The steps you’ll have to do are:&lt;br /&gt;&lt;br /&gt;1. Add the OpenSSL libs (libeay32.lib, ssleay32.lib) to your project in Link options. Well, and touch some different options in this sheet, download the projects to see more about this point.&lt;br /&gt;2. Add the OpenSSL header files to your main cpp.&lt;br /&gt;3. And the OpenSSL SSL commands.&lt;br /&gt;&lt;br /&gt;Here is the sample server code: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;font-size:80%&quot; &gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdlib.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltmemory.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;lterrno.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/types.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltwinsock.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/rsa.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/crypto.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/x509.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/pem.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/ssl.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/err.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* certificates root path */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; HOME &quot;./&quot;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* certificate and private key */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CERTF HOME &quot;micert.pem&quot;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; KEYF HOME &quot;mikey.key&quot;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* checking fuctions */&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_NULL(x) if ((x)==NULL) exit (1)&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); &lt;span style=&quot;color:#000099;&quot;&gt;exit&lt;/span&gt;(2); }&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; err;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; main ()&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; err;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; listen_sd;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; sd;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr_in sa_serv;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr_in sa_cli;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; client_len;&lt;br /&gt;SSL_CTX* ctx;&lt;br /&gt;SSL* ssl;&lt;br /&gt;X509* client_cert;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt;* str;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; buf [4096];&lt;br /&gt;SSL_METHOD *meth;&lt;br /&gt;WORD wVersionRequested;&lt;br /&gt;WSADATA wsaData;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* SSL init. Keep the Key and the certificate in the context. */&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SSL_load_error_strings();&lt;br /&gt;SSLeay_add_ssl_algorithms();&lt;br /&gt;meth = SSLv23_server_method();&lt;br /&gt;ctx = SSL_CTX_new (meth);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!ctx) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERR_print_errors_fp(stderr);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) &lt;= 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERR_print_errors_fp(stderr);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(3);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) &lt;= 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERR_print_errors_fp(stderr);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (!SSL_CTX_check_private_key(ctx)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(stderr,&quot;The private Key don’t match with the certificate\n&quot;);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(5);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Socket Initialitation */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wVersionRequested = MAKEWORD( 1, 1 );&lt;br /&gt;err = WSAStartup(wVersionRequested, &amp;amp;wsaData );&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ( err != 0 )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;///Error in WSAStartup//%d\n&quot;,err);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(err);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;listen_sd = socket (AF_INET, SOCK_STREAM, 0);&lt;br /&gt;printf(&quot;socket() return 0x%X (%d)\n&quot;, listen_sd, listen_sd);&lt;br /&gt;CHK_ERR(listen_sd, &quot;socket&quot;);&lt;br /&gt;&lt;br /&gt;memset (&amp;amp;sa_serv, &#39;\0&#39;, &lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(sa_serv));&lt;br /&gt;sa_serv.sin_family = AF_INET;&lt;br /&gt;sa_serv.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;sa_serv.sin_port = htons (9000); &lt;span style=&quot;color:#009900;&quot;&gt;/* Server listen Port */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;err = bind(listen_sd, (&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr*) &amp;amp;sa_serv,&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt; (sa_serv));&lt;br /&gt;CHK_ERR(err, &quot;bind&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* setting listening */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;printf(&quot;listening\n&quot;);&lt;br /&gt;err = listen (listen_sd, 5); CHK_ERR(err, &quot;listen&quot;);&lt;br /&gt;&lt;br /&gt;client_len = &lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(sa_cli);&lt;br /&gt;sd = accept (listen_sd, (&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr*) &amp;amp;sa_cli, &amp;amp;client_len);&lt;br /&gt;CHK_ERR(sd, &quot;accept&quot;);&lt;br /&gt;closesocket (listen_sd);&lt;br /&gt;&lt;br /&gt;printf (&quot;Connection from %lx, port %x\n&quot;,&lt;br /&gt;sa_cli.sin_addr.s_addr, sa_cli.sin_port);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* preparing SSL with the recived socket */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/ &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ssl = SSL_new (ctx); CHK_NULL(ssl);&lt;br /&gt;SSL_set_fd (ssl, sd);&lt;br /&gt;err = SSL_accept (ssl); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Showing cipher - optional */&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;printf (&quot;SSL connection using %s\n&quot;, SSL_get_cipher (ssl));&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Get Client cert, if exist - optional */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;client_cert = SSL_get_peer_certificate (ssl);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; (client_cert != NULL) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;Client Certificate:\n&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHK_NULL(str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;\t subject: %s\n&quot;, str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPENSSL_free (str);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHK_NULL(str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;\t issuer: %s\n&quot;, str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OPENSSL_free (str);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Here we could check all we want about client certificate. */&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509_free (client_cert);&lt;br /&gt;} &lt;span style=&quot;color:#000099;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&quot;The Client hasn’t certificate.\n&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Exchanging messages */&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;err = SSL_read (ssl, buf, &lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(buf) - 1); CHK_SSL(err);&lt;br /&gt;buf[err] = &#39;\0&#39;;&lt;br /&gt;printf (&quot;Read %d characters:&#39;%s&#39;\n&quot;, err, buf);&lt;br /&gt;&lt;br /&gt;err = SSL_write (ssl, &quot;I’m listening.&quot;, strlen(&quot;I’m listening.&quot;)); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Freeing resources */&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;closesocket (sd);&lt;br /&gt;SSL_free (ssl);&lt;br /&gt;SSL_CTX_free (ctx);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;Bellow is the SSL Client Code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltmemory.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;lterrno.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltsys/types.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltwinsock.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/crypto.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/x509.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/pem.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/ssl.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl/err.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_NULL(x) if ((x)==NULL) exit (1)&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#define&lt;/span&gt; CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); &lt;span style=&quot;color:#000099;&quot;&gt;exit&lt;/span&gt;(2); }&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; main ()&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; err=0;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; sd;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr_in sa;&lt;br /&gt;SSL_CTX* ctx;&lt;br /&gt;SSL* ssl;&lt;br /&gt;X509* scert;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt;* txt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; buff [4096];&lt;br /&gt;SSL_METHOD *meth;&lt;br /&gt;WORD wVersionRequested;&lt;br /&gt;WSADATA wsaData;&lt;br /&gt;SSLeay_add_ssl_algorithms();&lt;br /&gt;meth = SSLv2_client_method();&lt;br /&gt;SSL_load_error_strings();&lt;br /&gt;ctx = SSL_CTX_new (meth); CHK_NULL(ctx);&lt;br /&gt;&lt;br /&gt;CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Socket Init and connecting. */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;wVersionRequested = MAKEWORD( 1, 1 );&lt;br /&gt;err = WSAStartup(wVersionRequested, &amp;amp;wsaData );&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt; ( err != 0 )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&quot;///Error in WSAStartup //%d\n&quot;,err);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;/span&gt;(1);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sd = socket (AF_INET, SOCK_STREAM, 0);&lt;br /&gt;CHK_ERR(sd, &quot;socket&quot;);&lt;br /&gt;&lt;br /&gt;memset (&amp;amp;sa, &#39;\0&#39;, &lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(sa));&lt;br /&gt;sa.sin_family = AF_INET;&lt;br /&gt;sa.sin_addr.s_addr = inet_addr (&quot;127.0.0.1&quot;); &lt;span style=&quot;color:#009900;&quot;&gt;/* Server Ip */&lt;/span&gt;&lt;br /&gt;sa.sin_port = htons (9000); &lt;span style=&quot;color:#009900;&quot;&gt;/* Server port */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;err = connect(sd, (&lt;span style=&quot;color:#000099;&quot;&gt;struct&lt;/span&gt; sockaddr*) &amp;amp;sa,&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(sa)); CHK_ERR(err, &quot;connection&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Starting SSL connection */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;ssl = SSL_new (ctx); CHK_NULL(ssl);&lt;br /&gt;SSL_set_fd (ssl, sd);&lt;br /&gt;err = SSL_connect (ssl); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Get the cipher - optional */&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;printf (&quot;SSL connection using %s\n&quot;, SSL_get_cipher (ssl));&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Get Server certificate - optional */&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;scert = SSL_get_peer_certificate (ssl); CHK_NULL(scert);&lt;br /&gt;printf (&quot;Server Certificate:\n&quot;);&lt;br /&gt;&lt;br /&gt;txt = X509_NAME_oneline (X509_get_subject_name (scert),0,0);&lt;br /&gt;CHK_NULL(txt);&lt;br /&gt;printf (&quot;\t Subject: %s\n&quot;, txt);&lt;br /&gt;OPENSSL_free (txt);&lt;br /&gt;&lt;br /&gt;txt = X509_NAME_oneline (X509_get_issuer_name (scert),0,0);&lt;br /&gt;CHK_NULL(txt);&lt;br /&gt;printf (&quot;\t Issuer: %s\n&quot;, txt);&lt;br /&gt;OPENSSL_free (txt);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Here we can check what we wanted about the Server certificate */&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;X509_free (scert);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/*****************************************************/&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/* Exchanging messages */&lt;br /&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;/*****************************************************/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;err = SSL_write (ssl, &quot;Is someone there?&quot;, strlen(&quot;Is someone there?&quot;)); CHK_SSL(err);&lt;br /&gt;&lt;br /&gt;err = SSL_read (ssl, buff, &lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(buff) - 1); CHK_SSL(err);&lt;br /&gt;buff[err] = &#39;\0&#39;;&lt;br /&gt;printf (&quot;Read %d characters:&#39;%s&#39;\n&quot;, err, buff);&lt;br /&gt;SSL_shutdown (ssl); &lt;span style=&quot;color:#009900;&quot;&gt;/* sending the SSL/TLS end*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#009900;&quot;&gt;/* Freeing resources */&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;closesocket (sd);&lt;br /&gt;SSL_free (ssl);&lt;br /&gt;SSL_CTX_free (ctx);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:verdana;&quot;&gt;&lt;br /&gt;If you want to download the client and Server projects, click here. &lt;a href=&quot;http://carlosenator.googlepages.com/ssl.zip&quot;&gt;Source Files&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/3058453890608161083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/3058453890608161083' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/3058453890608161083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/3058453890608161083'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/01/ssl-openssl-with-visual-c.html' title='SSL OpenSSL with Visual C++'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-4226971060467262355</id><published>2008-01-24T16:38:00.000+01:00</published><updated>2008-01-25T09:38:14.839+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="compile"/><category scheme="http://www.blogger.com/atom/ns#" term="compiling"/><category scheme="http://www.blogger.com/atom/ns#" term="download"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenSSL"/><category scheme="http://www.blogger.com/atom/ns#" term="PEM_read_RSA_PUBKEY"/><category scheme="http://www.blogger.com/atom/ns#" term="PEM_read_RSAPrivateKey"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>RSA OpenSSL with Microsoft Visual C++</title><content type='html'>&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;Hi, buddies, how long time? JE JE JE&lt;br /&gt;&lt;br /&gt;Here I am newly with another solution.&lt;br /&gt;&lt;br /&gt;I have been working with RSA for some time with Java, but now I wanted to work with RSA in pure C.&lt;br /&gt;&lt;br /&gt;Well, there are several libraries to work with RSA in C, but I choose OpenSSL.&lt;br /&gt;&lt;br /&gt;Another time I only have a Windows System to try, I’m in a customer and here there aren’t UNIX machines.&lt;br /&gt;&lt;br /&gt;Well, I downloaded this OpenSSL version &lt;/span&gt;&lt;br&gt;&lt;a href=&quot;http://www.openssl.org/source/openssl-0.9.8g.tar.gz&quot;&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;http://www.openssl.org/source/openssl-0.9.8g.tar.gz&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;This package is a source code package, and you need to compile to work with it.&lt;br /&gt;&lt;br /&gt;To compile OpenSSL on Windows with Microsoft Visual C++, you have to read the install instructions (INSTALL.W32), located in the root. You’ll need Perl, and you’ll have to configure Perl correctly to work with Visual C++, in the file INSTALL.W32 you’ll find everything what you need. But, basically you’ll have to run these instructions from the root OpenSSL path:&lt;br /&gt;&lt;br /&gt;To configure Perl, don’t forget add the Perl bin path to your PATH environment variable:&lt;br /&gt;&gt;perl Configure VC-WIN32 --prefix=‘c:/some/openssl/dir ‘&lt;br /&gt;&lt;br /&gt;If you don&#39;t want to use the assembly language files at all then run&lt;br /&gt;&gt; ms\do_ms&lt;br /&gt;&lt;br /&gt;And finally, run the compilation:&lt;br /&gt;&lt;br /&gt;For get OpenSSL libs, run:&lt;br /&gt;&gt; nmake -f ms\nt.mak&lt;br /&gt;&lt;br /&gt;Or run this command to get OpenSSL dlls:&lt;br /&gt;&gt; nmake -f ms\ntdll.mak&lt;br /&gt;&lt;br /&gt;If you want to generate the libs or dlls with debugger information, you’ll need to edit do_nt.bat or do_ntdll.bat, to add debug option to the command line in these lines:&lt;br /&gt;&lt;br /&gt;perl util\mk1mf.pl no-asm debug VC-NT&gt;ms\nt.mak&lt;br /&gt;perl util\mk1mf.pl dll no-asm debug VC-NT&gt;ms\ntdll.mak&lt;br /&gt;&lt;br /&gt;These bats build the makes with DEBUG option; you’ll have to execute the nmake -f ms\nt.mak newly to get the new libraries.&lt;br /&gt;&lt;br /&gt;Maybe you’ll need unicows.lib for this last compilation. &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;If you don’t have it into your PC, it’s here.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;a href=&quot;http://surfnet.dl.sourceforge.net/sourceforge/libunicows/libunicows-1.1.1-msvc6.zip&quot;&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;http://surfnet.dl.sourceforge.net/sourceforge/libunicows/libunicows-1.1.1-msvc6.zip&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;br /&gt;Well, after the compilation you’ll get some exes and two dlls or libs, it depends if you compile nt.mak (libs) or ntdlls.mak (dlls), the output directory name begins with out32.&lt;br /&gt;&lt;br /&gt;Well, here is a sample source code that shows how to read private and public keys from files (private key file is encrypted), retrieving the keys, encrypting and decrypting.&lt;br /&gt;&lt;br /&gt;The bold lines are important, they showed the problems that I found&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;openssl&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstdio.h&amp;gt&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltstring.h&amp;gt&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &quot;e_os.h&quot;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl\crypto.h&amp;gt&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl\err.h&amp;gt&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl\rand.h&amp;gt&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl\bn.h&amp;gt&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &quot;applink.c&quot;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &quot;pem.h&quot;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;#include&lt;/span&gt; &amp;ltopenssl\rsa.h&amp;gt&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Callback for login information&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; pass_cb(&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; *buf, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; size, &lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; rwflag, &lt;span style=&quot;color:#000099;&quot;&gt;void&lt;/span&gt; *password)&lt;br /&gt;{&lt;br /&gt;strncpy(buf, &quot;carlos&quot;, size);&lt;br /&gt;buf[size - 1] = &#39;\0&#39;;&lt;br /&gt;return(strlen(buf));&lt;br /&gt;}&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; main(&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; *argv[])&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;RSA *rsaPrivKey = RSA_new();&lt;br /&gt;RSA *rsaPubKey = RSA_new();&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;unsigned char&lt;/span&gt; inText[256];&lt;br /&gt;FILE *pubKey = NULL;&lt;br /&gt;FILE *privKey = NULL;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;unsigned char&lt;/span&gt; sigBuffer[256];&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; size;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;unsigned char&lt;/span&gt; plainText[256];&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;int&lt;/span&gt; encSize;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt; pass[7]=&quot;carlos\n&quot;;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// OpenSSL Init&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;_fmode=_O_BINARY;&lt;br /&gt;CRYPTO_malloc_init();&lt;br /&gt;ERR_load_crypto_strings();&lt;br /&gt;OpenSSL_add_all_algorithms();&lt;br /&gt;ENGINE_load_builtin_engines();&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// End OpenSSL Init&lt;br /&gt;&lt;br /&gt;// Opening Files generated with openSSL&lt;br /&gt;&lt;/span&gt;pubKey=fopen(&quot;J:\\public.key&quot;, &quot;r&quot;);&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Private Key file, encrypted with 3DESC&lt;/span&gt;&lt;br /&gt;privKey=fopen(&quot;J:\\priv.key&quot;, &quot;r&quot;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Reading Keys&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt;(privKey){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsaPrivKey = PEM_read_RSAPrivateKey(privKey, &amp;amp;rsaPrivKey, &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(pem_password_cb *)pass_cb, pass);&lt;br /&gt;}&lt;br /&gt;ERR_print_errors_fp(stdout);&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;if&lt;/span&gt;(pubKey)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsaPubKey = PEM_read_RSA_PUBKEY(pubKey, &amp;amp;rsaPubKey, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL, NULL);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Encrypting&lt;/span&gt;&lt;br /&gt;strcpy(inText,&quot;Carlos&quot;);&lt;br /&gt;printf(&quot;String to encrypting: %s\n&quot;, inText );&lt;br /&gt;size = strlen((&lt;span style=&quot;color:#000099;&quot;&gt;char&lt;/span&gt;*)inText);&lt;br /&gt;encSize=RSA_public_encrypt(size, inText, &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;sigBuffer, rsaPubKey, RSA_PKCS1_OAEP_PADDING);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Decrypting&lt;/span&gt;&lt;br /&gt;printf(&quot;encrypted string size: %d\n&quot; ,encSize );&lt;br /&gt;encSize=RSA_private_decrypt(encSize, sigBuffer, plainText, &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;rsaPrivKey, RSA_PKCS1_OAEP_PADDING);&lt;br /&gt;memset(plainText+encSize,0,&lt;span style=&quot;color:#000099;&quot;&gt;sizeof&lt;/span&gt;(plainText)-encSize);&lt;br /&gt;printf(&quot;ret %s\n&quot;,plainText);&lt;br /&gt;ERR_print_errors_fp(stdout);&lt;br /&gt;printf(&quot;Decrypting result: %s\n&quot;, plainText );&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// Free keys&lt;/span&gt;&lt;br /&gt;RSA_free(rsaPubKey);&lt;br /&gt;RSA_free(rsaPrivKey);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#009900;&quot;&gt;// unload OpenSSL&lt;br /&gt;&lt;/span&gt;CRYPTO_cleanup_all_ex_data();&lt;br /&gt;ERR_remove_state(0);&lt;br /&gt;&lt;br /&gt;CRYPTO_mem_leaks_fp(stderr);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#000099;&quot;&gt;return&lt;/span&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Here is the Visual C++ Project &lt;br&gt;&lt;a href=&quot;http://carlosenator.googlepages.com/RSA.zip&quot;&gt;Source Files&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;justify&quot;&gt;&lt;span style=&quot;font-family:courier new;font-size:85%;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;CLEAR: both&quot;&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/4226971060467262355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/4226971060467262355' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/4226971060467262355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/4226971060467262355'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/01/rsa-openssl-with-microsoft-visual-c.html' title='RSA OpenSSL with Microsoft Visual C++'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7271472050035445247.post-5288396721150849106</id><published>2008-01-24T11:52:00.000+01:00</published><updated>2008-01-24T12:39:11.599+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="CSOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="download"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="example"/><category scheme="http://www.blogger.com/atom/ns#" term="Http"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft"/><category scheme="http://www.blogger.com/atom/ns#" term="Nano"/><category scheme="http://www.blogger.com/atom/ns#" term="NanoHttp"/><category scheme="http://www.blogger.com/atom/ns#" term="POST"/><category scheme="http://www.blogger.com/atom/ns#" term="source"/><category scheme="http://www.blogger.com/atom/ns#" term="Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual C++"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>CSoap and Visual Studio</title><content type='html'>&lt;span style=&quot;font-family:arial;&quot;&gt;First of all, I’m sorry for my English, but I want to improve it and this is a good way. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;Well, this is my first solution. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;Many times I have had to connect a c program to a Web Service, in Windows with MFC is too easy. I have a dll, which connects the c program with whatever Web Service only updating some xml files. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;But, when you need to connect a c program running in other OS, you&#39;ll need to try other solutions.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;The best, for me, it&#39;s CSoap.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;However when I had to develop that connection I only had Windows Systems and well, I tried to connect CSoap in a Visual Studio Project. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;It wasn&#39;t easy for me to find examples about CSOAP for Visual C++, and that is why I put that solution here.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Arial;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;Here is the original link to my source files &lt;/span&gt;&lt;a href=&quot;https://sourceforge.net/tracker/download.php?group_id=74977&amp;amp;atid=542567&amp;amp;file_id=250457&amp;amp;aid=1816455&quot;&gt;&lt;span style=&quot;font-family:arial;&quot;&gt;https://sourceforge.net/tracker/download.php?group_id=74977&amp;amp;atid=542567&amp;amp;file_id=250457&amp;amp;aid=1816455&lt;/span&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://languageshelp.blogspot.com/feeds/5288396721150849106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7271472050035445247/5288396721150849106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/5288396721150849106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7271472050035445247/posts/default/5288396721150849106'/><link rel='alternate' type='text/html' href='http://languageshelp.blogspot.com/2008/01/csoap-and-visual-studio.html' title='CSoap and Visual Studio'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/01762250203545242638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>