zoukankan      html  css  js  c++  java
  • 2019-2020-1-20175332-实验五通讯协议设计

    实验五 通讯协议设计-1

    • 实验要求:

    在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业
    提交运行结果截图

    • 实验截图
      1、参考博客安装OpenSSL,并运行测试代码,输出结果为0,则安装成功
      测试代码如下:
        #include <stdio.h>
        #include <openssl/evp.h>
        int main(){
          OpenSSL_add_all_algorithms();
          return 0;
        }
    

    截图:

    2、socket编程
    截图:

    实验代码如下:
    服务器端:

    #include<stdio.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #include<errno.h>  
    #include<sys/types.h>  
    #include<sys/socket.h>  
    #include<netinet/in.h>  
    #define DEFAULT_PORT 8000  
    #define MAXLINE 4096  
    int main(int argc, char** argv)  
    {  
        int    socket_fd, connect_fd;  
        struct sockaddr_in     servaddr;  
        char    buff[4096];  
        int     n;  
        if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  
        printf("create socket error: %s(errno: %d)
    ",strerror(errno),errno);  
        exit(0);  
        }  
        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(DEFAULT_PORT);
        if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){  
        printf("bind socket error: %s(errno: %d)
    ",strerror(errno),errno);  
        exit(0);  
        }  
        if( listen(socket_fd, 10) == -1){  
        printf("listen socket error: %s(errno: %d)
    ",strerror(errno),errno);  
        exit(0);  
        }  
        printf("======waiting for client's request======
    ");  
        while(1){  
            if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){  
            printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  
            continue;  
        }  
     n = recv(connect_fd, buff, MAXLINE, 0);  
        if(!fork()){ 
            if(send(connect_fd, "Hello,you are connected!
    ", 26,0) == -1)  
            perror("send error");  
            close(connect_fd);  
            exit(0);  
        }  
        buff[n] = '';  
        printf("recv msg from client: %s
    ", buff);  
        close(connect_fd);  
        }  
        close(socket_fd);  
    }
    

    客户端:

    #include<stdio.h>  
    #include<stdlib.h>  
    #include<string.h>  
    #include<errno.h>  
    #include<sys/types.h>  
    #include<sys/socket.h>  
    #include<netinet/in.h>  
    #define MAXLINE 4096   
    int main(int argc, char** argv)  
    {  
        int    sockfd, n,rec_len;  
        char    recvline[4096], sendline[4096];  
        char    buf[MAXLINE];  
        struct sockaddr_in    servaddr;  
        if( argc != 2){  
        printf("usage: ./client <ipaddress>
    ");  
        exit(0);  
        }  
        if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){  
        printf("create socket error: %s(errno: %d)
    ", strerror(errno),errno);  
        exit(0);  
        }  
        memset(&servaddr, 0, sizeof(servaddr));  
        servaddr.sin_family = AF_INET;  
        servaddr.sin_port = htons(8000);  
        if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){  
        printf("inet_pton error for %s
    ",argv[1]);  
        exit(0);  
        }  
        if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){  
        printf("connect error: %s(errno: %d)
    ",strerror(errno),errno);  
        exit(0);  
        }  
        printf("send msg to server: 
    ");  
        fgets(sendline, 4096, stdin);  
        if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
        {  
        printf("send msg error: %s(errno: %d)
    ", strerror(errno), errno);  
        exit(0);  
        }  
        if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {  
           perror("recv error");  
           exit(1);  
        }  
        buf[rec_len]  = '';  
        printf("Received : %s ",buf);  
        close(sockfd);  
        exit(0);  
    }
    

    实验五 通讯协议设计-2

    • 实验要求:

    在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
    提交测试截图
    实验代码如下:
    服务器:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    #include <openssl/evp.h>
    
    
    #define MAXBUF 1024
    
    int main(int argc, char **argv)
    {
        int sockfd, new_fd;
        socklen_t len;
        struct sockaddr_in my_addr, their_addr;
        unsigned int myport, lisnum;
        char buf[MAXBUF + 1];
        SSL_CTX *ctx;
    if (argv[1])
            myport = atoi(argv[1]);
        else
            myport = 7838;
    
    if (argv[2])
            lisnum = atoi(argv[2]);
        else
            lisnum = 2;
    
    SSL_library_init();
        OpenSSL_add_all_algorithms();
        SSL_load_error_strings();
        ctx = SSL_CTX_new(SSLv23_server_method());
        if (ctx == NULL) {
            ERR_print_errors_fp(stdout);
            exit(1);
        }
        if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) {
            ERR_print_errors_fp(stdout);
            exit(1);
        }
        if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0){
            ERR_print_errors_fp(stdout);
            exit(1);
        }
        if (!SSL_CTX_check_private_key(ctx)) {
            ERR_print_errors_fp(stdout);
            exit(1);
        }
        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        } else
            printf("socket created
    ");
        bzero(&my_addr, sizeof(my_addr));
        my_addr.sin_family = PF_INET;
        my_addr.sin_port = htons(myport);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
            == -1) {
            perror("bind");
            exit(1);
        } else
            printf("binded
    ");
        if (listen(sockfd, lisnum) == -1) {
            perror("listen");
            exit(1);
        } else
            printf("begin listen
    ");
        while (1) {
            SSL *ssl;
            len = sizeof(struct sockaddr);
            if ((new_fd =
                 accept(sockfd, (struct sockaddr *) &their_addr,
                        &len)) == -1) {
                perror("accept");
                exit(errno);
            } else
                printf("server: got connection from %s, port %d, socket %d
    ",
                       inet_ntoa(their_addr.sin_addr),
                       ntohs(their_addr.sin_port), new_fd);
            ssl = SSL_new(ctx);
            SSL_set_fd(ssl, new_fd);
            if (SSL_accept(ssl) == -1) {
                perror("accept");
                close(new_fd);
                break;
            }
            bzero(buf, MAXBUF + 1);
            strcpy(buf, "server->client");
            len = SSL_write(ssl, buf, strlen(buf));
            if (len <= 0) {
                printf
                    ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'
    ",
                     buf, errno, strerror(errno));
                goto finish;
            } else
                printf("消息'%s'发送成功,共发送了%d个字节!
    ",
                       buf, len);
            bzero(buf, MAXBUF + 1);
            len = SSL_read(ssl, buf, MAXBUF);
            if (len > 0)
                printf("接收消息成功:'%s',共%d个字节的数据
    ",
                       buf, len);
            else
                printf
                    ("消息接收失败!错误代码是%d,错误信息是'%s'
    ",
                     errno, strerror(errno));
          finish:
            SSL_shutdown(ssl);
            SSL_free(ssl);
            close(new_fd);
        }
        close(sockfd);
        SSL_CTX_free(ctx);
        return 0;
    }
    

    客户端:

    #include <stdio.h>  
    #include <string.h>  
    #include <errno.h>  
    #include <sys/socket.h>  
    #include <resolv.h>  
    #include <stdlib.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <unistd.h>  
    #include <openssl/ssl.h>  
    #include <openssl/err.h>
    #include <openssl/evp.h>
    #define MAXBUF 1024  
      
    void ShowCerts(SSL * ssl)  
    {  
        X509 *cert;  
        char *line;  
      
        cert = SSL_get_peer_certificate(ssl);  
        if (cert != NULL) {  
            printf("数字证书信息:
    ");  
            line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);  
            printf("证书: %s
    ", line);  
            free(line);  
            line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);  
            printf("颁发者: %s
    ", line);  
            free(line);  
           X509_free(cert);  
        } else  
            printf("无证书信息!
    ");  
    }  
      
    int main(int argc, char **argv)  
    {  
        int sockfd, len;  
        struct sockaddr_in dest;  
        char buffer[MAXBUF + 1];  
        SSL_CTX *ctx;  
        SSL *ssl;  
      
        if (argc != 3) {  
            printf("参数格式错误!正确用法如下:
    		%s IP地址 端口
    	比如:	%s 127.0.0.1 80
    此程序用来从某个"  
                 "IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息",  
                 argv[0], argv[0]);  
            exit(0);  
        }  
      
        //SSL 库初始化
        SSL_library_init();  
        OpenSSL_add_all_algorithms();  
        SSL_load_error_strings();  
        ctx = SSL_CTX_new(SSLv23_client_method());  
        if (ctx == NULL) {  
            ERR_print_errors_fp(stdout);  
            exit(1);  
        }  
      
        //创建一个 socket 用于 tcp 通信 
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
            perror("Socket");  
            exit(errno);  
        }  
        printf("socket created
    ");  
        bzero(&dest, sizeof(dest));  
        dest.sin_family = AF_INET;  
        dest.sin_port = htons(atoi(argv[2]));  
        if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {  
            perror(argv[1]);  
            exit(errno);  
        }  
        printf("address created
    ");  
      
        //连接服务器 
        if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {  
            perror("Connect ");  
            exit(errno);  
        }  
        printf("server connected
    ");  
      
        ssl = SSL_new(ctx);  
        SSL_set_fd(ssl, sockfd);  
        // 建立 SSL 连接 
        if (SSL_connect(ssl) == -1)  
            ERR_print_errors_fp(stderr);  
        else {  
            printf("Connected with %s encryption
    ", SSL_get_cipher(ssl));  
            ShowCerts(ssl);  
        }  
      
        bzero(buffer, MAXBUF + 1);  
        len = SSL_read(ssl, buffer, MAXBUF);  
        if (len > 0)  
            printf("接收消息成功:'%s',共%d个字节的数据
    ",  
                   buffer, len);  
        else {  
            printf  
                ("消息接收失败!错误代码是%d,错误信息是'%s'
    ",  
                 errno, strerror(errno));  
            goto finish;  
        }  
        bzero(buffer, MAXBUF + 1);  
        strcpy(buffer, "from client->server");  
        len = SSL_write(ssl, buffer, strlen(buffer));  
        if (len < 0)  
            printf  
                ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'
    ",  
                 buffer, errno, strerror(errno));  
        else  
            printf("消息'%s'发送成功,共发送了%d个字节!
    ",  
                   buffer, len);  
      
      finish:  
        SSL_shutdown(ssl);  
        SSL_free(ssl);  
        close(sockfd);  
        SSL_CTX_free(ctx);  
        return 0;  
    }
    

    问题:
    openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
    解决方法
    1 下载1.0版本------------无法解决问题
    2 经过百度找到类似问题:加载共享库时出错:libssl.so.1.1:无法打开共享对象文件:没有这样的文件或目录
    解决办法:
    使用ln命令构建文件件连接
    ln -s /usr/local/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
    ln -s /usr/local/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
    类比
    将命令改为:
    ln -s /usr/local/lib/libssl.so.3 /usr/lib/libssl.so.3
    ln -s /usr/local/lib/libcrypto.so.3 /usr/lib/libcrypto.so.3
    实验截图:

    实验结果

  • 相关阅读:
    算法训练 表达式计算
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    New ways to verify that Multipath TCP works through your network
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Multipath TCP Port for Android 4.1.2
    How to enable ping response in windows 7?
    NS3
    Multipath TCP Port for Android
  • 原文地址:https://www.cnblogs.com/20175332zm/p/11968647.html
Copyright © 2011-2022 走看看