﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-路的尽头</title><link>http://www.cppblog.com/tangxinfa/</link><description>开发者之旅</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:09:06 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:09:06 GMT</pubDate><ttl>60</ttl><item><title>SSL双方系统时间不一致导致的SSL连接失败及其解决方案</title><link>http://www.cppblog.com/tangxinfa/archive/2008/07/25/57164.html</link><dc:creator>唐新发</dc:creator><author>唐新发</author><pubDate>Fri, 25 Jul 2008 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/tangxinfa/archive/2008/07/25/57164.html</guid><wfw:comment>http://www.cppblog.com/tangxinfa/comments/57164.html</wfw:comment><comments>http://www.cppblog.com/tangxinfa/archive/2008/07/25/57164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tangxinfa/comments/commentRss/57164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tangxinfa/services/trackbacks/57164.html</trackback:ping><description><![CDATA[　　在产品使用中，实施人员常常报告服务器与客户端无法连接．究其原因是因为客户端机器与服务端机器系统时间不一致．原因在于系统使用了OpenSSL，证书中有一个有效时间段，当客户端或服务器的系统时间不在这个时间段内时SSL会因证书验证失败而无法连接．在实施中系统时间错误是很常见的，因不能上网而未开时间自动同步，bios没电了，客户疏忽等原因都会导致系统时间设置有误．如果连接失败后再查看系统时间设置总是一项麻烦的事情，那么有哪些办法可以自动避免这个问题呢？<br>　　一，将证书的有效期设得够大：如：1970-2099<br>　　　这样估计可以在一定程度上解决这个问题，不过这也是个馊主意．<br>　　二，检测及必要时自动同步客户端与服务器的时间<br>　　通过用wireshake抓包分析SSL建立连接的过程，发现在SSL握手过程中，会向对方传送本机的系统时间．因此一个显而易见的办法就是获取对方的时间，然后在必要时将本机的系统时间改为对方的系统时间，失败后再连一次．下面是具体的示例代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">openssl</span><span style="color: #000000;">/</span><span style="color: #000000;">ssl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">openssl</span><span style="color: #000000;">/</span><span style="color: #000000;">bio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">openssl</span><span style="color: #000000;">/</span><span style="color: #000000;">err.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">winsock2.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">time.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;_TimeInfo<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;client;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">客户端的时间</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;server;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">服务器的时间</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>}&nbsp;TimeInfo;<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br>*&nbsp;同步系统时间.<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>BOOL&nbsp;syncSystemTime(time_t&nbsp;t)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;st;<br>&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;&nbsp;&nbsp;ft;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;LONGLONG&nbsp;&nbsp;&nbsp;ll;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;ll&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Int32x32To64(t,&nbsp;</span><span style="color: #000000;">10000000</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">116444736000000000</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">1970.01.01&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;ft.dwLowDateTime&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(DWORD)ll;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;ft.dwHighDateTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(DWORD)(ll&nbsp;</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FileTimeToSystemTime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ft,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">st)&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;SetSystemTime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">st);<br>}<br><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br>*&nbsp;获取SSL握手过程中服务器与客户端双方的系统时间.<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;getSSLHandleShakeTimeInfo(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;write_p,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;version,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;content_type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;buf,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;len,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSL&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ssl,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeInfo&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ti)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(content_type&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">22</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">require&nbsp;handshake&nbsp;message</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(len&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">42</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(buf[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ClientHello&nbsp;Message&nbsp;send&nbsp;from&nbsp;client&nbsp;to&nbsp;server</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">client&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htonl(</span><span style="color: #000000;">*</span><span style="color: #000000;">((u_long</span><span style="color: #000000;">*</span><span style="color: #000000;">)(buf&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(buf[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">ServerHello&nbsp;Message&nbsp;send&nbsp;from&nbsp;server&nbsp;to&nbsp;client</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ti</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">server&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htonl(</span><span style="color: #000000;">*</span><span style="color: #000000;">((u_long</span><span style="color: #000000;">*</span><span style="color: #000000;">)(buf&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">)));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;BIO&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;bio;<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ssl;<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ctx;<br>&nbsp;&nbsp;&nbsp;&nbsp;TimeInfo&nbsp;timeInfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;timeSynced&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;result;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Set&nbsp;up&nbsp;the&nbsp;library&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_library_init();<br>&nbsp;&nbsp;&nbsp;&nbsp;ERR_load_BIO_strings();<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_load_error_strings();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Set&nbsp;up&nbsp;the&nbsp;SSL&nbsp;context&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SSL_CTX_new(SSLv3_client_method());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ctx&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;new&nbsp;SSL_CTX\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_print_errors_fp(stderr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_free(ctx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Get&nbsp;Server&nbsp;and&nbsp;Client&nbsp;system&nbsp;time&nbsp;via&nbsp;SSL&nbsp;Handshake&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_set_msg_callback(ctx,&nbsp;getSSLHandleShakeTimeInfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_set_msg_callback_arg(ctx,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">timeInfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Load&nbsp;the&nbsp;trust&nbsp;store&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">&nbsp;SSL_CTX_load_verify_locations(ctx,&nbsp;</span><span style="color: #000000;">".</span><span style="color: #000000;">\\certs\\cacert.pem</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;NULL))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;loading&nbsp;trust&nbsp;store\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_print_errors_fp(stderr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_free(ctx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Setup&nbsp;the&nbsp;connection&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;bio&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;BIO_new_ssl_connect(ctx);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Set&nbsp;the&nbsp;SSL_MODE_AUTO_RETRY&nbsp;flag&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;BIO_get_ssl(bio,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;ssl);<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_set_mode(ssl,&nbsp;SSL_MODE_AUTO_RETRY);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Create&nbsp;and&nbsp;setup&nbsp;the&nbsp;connection&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;BIO_set_conn_hostname(bio,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">192.168.1.5:5555</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(BIO_do_connect(bio)&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;attempting&nbsp;to&nbsp;connect\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_print_errors_fp(stderr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free_all(bio);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_free(ctx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Check&nbsp;the&nbsp;certificate&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(SSL_get_verify_result(ssl))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;X509_V_OK:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;X509_V_ERR_CERT_NOT_YET_VALID:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;X509_V_ERR_CERT_HAS_EXPIRED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(timeInfo.server&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;timeInfo.client&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">当前客户端时间:&nbsp;%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;ctime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">timeInfo.client));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">当前服务器时间:&nbsp;%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;ctime(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">timeInfo.server));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">尝试与服务器时间同步<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(syncSystemTime(timeInfo.server))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">成功\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">失败\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">请重试连接服务器！\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Certificate&nbsp;verification&nbsp;error:&nbsp;%i\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;SSL_get_verify_result(ssl));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free_all(bio);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_free(ctx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Close&nbsp;the&nbsp;connection&nbsp;and&nbsp;free&nbsp;the&nbsp;context&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;BIO_free_all(bio);<br>&nbsp;&nbsp;&nbsp;&nbsp;SSL_CTX_free(ctx);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span></div><img src ="http://www.cppblog.com/tangxinfa/aggbug/57164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tangxinfa/" target="_blank">唐新发</a> 2008-07-25 17:45 <a href="http://www.cppblog.com/tangxinfa/archive/2008/07/25/57164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>emacs用于在c/c++头文件中生成包含保护头（include guard）的lisp函数</title><link>http://www.cppblog.com/tangxinfa/archive/2008/05/21/50705.html</link><dc:creator>唐新发</dc:creator><author>唐新发</author><pubDate>Wed, 21 May 2008 15:40:00 GMT</pubDate><guid>http://www.cppblog.com/tangxinfa/archive/2008/05/21/50705.html</guid><wfw:comment>http://www.cppblog.com/tangxinfa/comments/50705.html</wfw:comment><comments>http://www.cppblog.com/tangxinfa/archive/2008/05/21/50705.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/tangxinfa/comments/commentRss/50705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tangxinfa/services/trackbacks/50705.html</trackback:ping><description><![CDATA[这东东好像有很多人写过，不过看了几个都觉得不怎么漂亮，花了点时间实现了下面的函数，用起来还不错。<br>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>;; c/c++ header include guard<br>(defun insert-include-guard ()<br>&nbsp; "insert include guard for c and c++ header file.<br>for file filename.ext will generate:<br>#ifndef FILENAME_EXT_<br>#define FILENAME_EXT_<br><br>original buffer content<br><br>#endif//FILENAME_EXT_<br>"<br>&nbsp; (interactive)<br>&nbsp; (setq file-macro<br>&nbsp;&nbsp;&nbsp; (concat (replace-regexp-in-string "\\." "_" (upcase (file-name-nondirectory buffer-file-name))) "_"))<br>&nbsp; (setq guard-begin (concat "#ifndef " file-macro "\n"<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "#define " file-macro "\n\n"))<br>&nbsp; (setq guard-end<br>&nbsp;&nbsp;&nbsp; (concat "\n\n#endif//" file-macro "\n"))<br>&nbsp; (setq position (point))<br>&nbsp; (goto-char (point-min))<br>&nbsp; (insert guard-begin)<br>&nbsp; (goto-char (point-max))<br>&nbsp; (insert guard-end)<br>&nbsp; (goto-char (+ position (length guard-begin))))<br><br><br><img src ="http://www.cppblog.com/tangxinfa/aggbug/50705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tangxinfa/" target="_blank">唐新发</a> 2008-05-21 23:40 <a href="http://www.cppblog.com/tangxinfa/archive/2008/05/21/50705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>