Chinaunix首页 | 论坛 | 博客
  • 博客访问: 218358
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1506
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 10:52
文章分类
文章存档

2014年(22)

2013年(31)

我的朋友

分类: C/C++

2014-04-01 10:17:51

最近在学openssl,想动手体验下其强大的功能,写了个简单的C/S通信程序,算是练习吧。

服务端:
   
#include
#include
#include
#include
#include
#include
#include
#include
int main( int argc, char * argv[] )
{
    int servfd, connfd;
    socklen_t clilen;
    struct sockaddr_in servaddr, cliaddr;
    char buff[512];
    pid_t chipid;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons( 8888 );
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
    SSL_CTX * ctx;
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    if ( (ctx = SSL_CTX_new( SSLv23_server_method() )) == NULL )
    {
        printf( "error1" );
        return 0;
    }
    if ( SSL_CTX_use_certificate_file( ctx, argv[1], SSL_FILETYPE_PEM ) <= 0 )
    {
        printf( "error2" );
        return 0;
    }
    if ( SSL_CTX_use_PrivateKey_file( ctx, argv[2], SSL_FILETYPE_PEM ) <= 0 )
    {
        printf( "error3" );
        return 0;
    }
    if( !SSL_CTX_check_private_key( ctx ) )
    {
        printf( "keyerror" );
        return 0;
    }
    servfd = socket( AF_INET, SOCK_STREAM, 0 );
    bind( servfd, (struct sockaddr *)&servaddr, sizeof(servaddr) );
    listen( servfd, 10 );
    for ( ; ; )
    {
        SSL * ssl;
        clilen = sizeof(cliaddr);
        connfd = socket( AF_INET, SOCK_STREAM, 0 );
        connfd = accept( servfd, (struct sockaddr *)&cliaddr, &clilen );
        chipid = fork();
        if ( chipid != 0 )
            close( connfd );
        else
        {
            close( servfd );
            ssl = SSL_new( ctx );
            SSL_set_fd( ssl, connfd );
            SSL_accept( ssl );
            SSL_read( ssl, buff, 512 );
            printf( "%s\n", buff );
            SSL_shutdown( ssl );
            SSL_free( ssl );
            close( connfd );
            SSL_CTX_free( ctx );
            return 0;
        }
    }
}

客户端:
   
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
    int connfd;
    char buff[512] = {0};
    SSL_CTX * ctx;
    SSL * ssl;
    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons( 8888 );
    inet_pton( AF_INET, "127.0.0.1", &servaddr.sin_addr );
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    ctx = SSL_CTX_new( SSLv23_client_method() );
    connfd = socket( AF_INET, SOCK_STREAM, 0 );
    connect( connfd, (struct sockaddr *)&servaddr, sizeof(servaddr) );
    ssl = SSL_new( ctx );
    SSL_set_fd( ssl, connfd );
    SSL_connect( ssl );
    printf( "please input some words:" );
    scanf( "%s", buff );
    SSL_write( ssl, buff, 512 );
    return 0;
}
阅读(2308) | 评论(0) | 转发(0) |
0

上一篇:javaRandom类的常用方法

下一篇:没有了

给主人留下些什么吧!~~