免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10868 | 回复: 17
打印 上一主题 下一主题

[函数] 无法通过编译,提示某函数没有定义,但该函数已经包含到头文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-12 10:34 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <unistd.h>
  10. #include <arpa/inet.h>
  11. #include <openssl/ssl.h>
  12. #include <openssl/err.h>

  13. #define MAXBUF 1024
  14. /************关于本文档********************************************
  15. *filename: ssl-server.c
  16. *purpose: 演示利用 OpenSSL 库进行基于 IP层的 SSL 加密通讯的方法,这是服务器端例子
  17. *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
  18. Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
  19. *date time:2007-02-02 19:40
  20. *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
  21. * 但请遵循GPL
  22. *Thanks to:Google
  23. *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
  24. * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
  25. *********************************************************************/
  26. int main(int argc, char **argv)
  27. {
  28.     int sockfd, new_fd;
  29.     socklen_t len;
  30.     struct sockaddr_in my_addr, their_addr;
  31.     unsigned int myport, lisnum;
  32.     char buf[MAXBUF + 1];
  33.     SSL_CTX *ctx;

  34.     if (argv[1])
  35.         myport = atoi(argv[1]);
  36.     else
  37.         myport = 7838;

  38.     if (argv[2])
  39.         lisnum = atoi(argv[2]);
  40.     else
  41.         lisnum = 2;

  42.     /* SSL 库初始化 */
  43.     SSL_library_init();
  44.     /* 载入所有 SSL 算法 */
  45.     OpenSSL_add_all_algorithms();
  46.     /* 载入所有 SSL 错误消息 */
  47.     SSL_load_error_strings();
  48.     /* 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text */
  49.     ctx = SSL_CTX_new(SSLv23_server_method());
  50.     /* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 单独表示 V2 或 V3标准 */
  51.     if (ctx == NULL) {
  52.         ERR_print_errors_fp(stdout);
  53.         exit(1);
  54.     }
  55.     /* 载入用户的数字证书, 此证书用来发送给客户端。 证书里包含有公钥 */
  56.     if (SSL_CTX_use_certificate_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0) {
  57.         ERR_print_errors_fp(stdout);
  58.         exit(1);
  59.     }
  60.     /* 载入用户私钥 */
  61.     if (SSL_CTX_use_PrivateKey_file(ctx, argv[5], SSL_FILETYPE_PEM) <= 0) {
  62.         ERR_print_errors_fp(stdout);
  63.         exit(1);
  64.     }
  65.     /* 检查用户私钥是否正确 */
  66.     if (!SSL_CTX_check_private_key(ctx)) {
  67.         ERR_print_errors_fp(stdout);
  68.         exit(1);
  69.     }

  70.     /* 开启一个 socket 监听 */
  71.     if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
  72.         perror("socket");
  73.         exit(1);
  74.     } else
  75.         printf("socket created\n");

  76.     bzero(&my_addr, sizeof(my_addr));
  77.     my_addr.sin_family = PF_INET;
  78.     my_addr.sin_port = htons(myport);
  79.     if (argv[3])
  80.         my_addr.sin_addr.s_addr = inet_addr(argv[3]);
  81.     else
  82.         my_addr.sin_addr.s_addr = INADDR_ANY;

  83.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
  84.         == -1) {
  85.         perror("bind");
  86.         exit(1);
  87.     } else
  88.         printf("binded\n");

  89.     if (listen(sockfd, lisnum) == -1) {
  90.         perror("listen");
  91.         exit(1);
  92.     } else
  93.         printf("begin listen\n");

  94.     while (1) {
  95.         SSL *ssl;
  96.         len = sizeof(struct sockaddr);
  97.         /* 等待客户端连上来 */
  98.         if ((new_fd =
  99.              accept(sockfd, (struct sockaddr *) &their_addr,
  100.                     &len)) == -1) {
  101.             perror("accept");
  102.             exit(errno);
  103.         } else
  104.             printf("server: got connection from %s, port %d, socket %d\n",
  105.                    inet_ntoa(their_addr.sin_addr),
  106.                    ntohs(their_addr.sin_port), new_fd);

  107.         /* 基于 ctx 产生一个新的 SSL */
  108.         ssl = SSL_new(ctx);
  109.         /* 将连接用户的 socket 加入到 SSL */
  110.         SSL_set_fd(ssl, new_fd);
  111.         /* 建立 SSL 连接 */
  112.         if (SSL_accept(ssl) == -1) {
  113.             perror("accept");
  114.             close(new_fd);
  115.             break;
  116.         }

  117.         /* 开始处理每个新连接上的数据收发 */
  118.         bzero(buf, MAXBUF + 1);
  119.         strcpy(buf, "server->client");
  120.         /* 发消息给客户端 */
  121.         len = SSL_write(ssl, buf, strlen(buf));

  122.         if (len <= 0) {
  123.             printf
  124.                 ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n",
  125.                  buf, errno, strerror(errno));
  126.             goto finish;
  127.         } else
  128.             printf("消息'%s'发送成功,共发送了%d个字节!\n",
  129.                    buf, len);

  130.         bzero(buf, MAXBUF + 1);
  131.         /* 接收客户端的消息 */
  132.         len = SSL_read(ssl, buf, MAXBUF);
  133.         if (len > 0)
  134.             printf("接收消息成功:'%s',共%d个字节的数据\n",
  135.                    buf, len);
  136.         else
  137.             printf
  138.                 ("消息接收失败!错误代码是%d,错误信息是'%s'\n",
  139.                  errno, strerror(errno));
  140.         /* 处理每个新连接上的数据收发结束 */
  141.       finish:
  142.         /* 关闭 SSL 连接 */
  143.         SSL_shutdown(ssl);
  144.         /* 释放 SSL */
  145.         SSL_free(ssl);
  146.         /* 关闭 socket */
  147.         close(new_fd);
  148.     }

  149.     /* 关闭监听的 socket */
  150.     close(sockfd);
  151.     /* 释放 CTX */
  152.     SSL_CTX_free(ctx);
  153.     return 0;
  154. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-05-12 10:37 |只看该作者
编译命令行?

论坛徽章:
0
3 [报告]
发表于 2007-05-12 10:44 |只看该作者
gcc -Wall ssl-server.c -o server

论坛徽章:
0
4 [报告]
发表于 2007-05-12 10:49 |只看该作者
原帖由 wangyunyin 于 2007-5-12 10:34 发表
[code]
*wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言

:em11:还来问这种问题。。。。。

论坛徽章:
0
5 [报告]
发表于 2007-05-12 10:50 |只看该作者
编译出现了什么现象???

论坛徽章:
0
6 [报告]
发表于 2007-05-12 10:56 |只看该作者
原帖由 wangyunyin 于 2007-5-12 10:44 发表
gcc -Wall ssl-server.c -o server


是置顶的帖子里的程序吧。

gcc -Wall ssl-server.c -o server -lssl -lcrypto

.

论坛徽章:
0
7 [报告]
发表于 2007-05-12 10:57 |只看该作者
原帖由 wangyunyin 于 2007-5-12 10:44 发表
gcc -Wall ssl-server.c -o server



gcc -Wall ssl-server.c -o server -lssl

另外, 你的机器上面要装openssl.

论坛徽章:
0
8 [报告]
发表于 2007-05-12 11:00 |只看该作者
[/code]
ssl-server.c.text+0x85): undefined reference to `SSL_library_init'
ssl-server.c.text+0x8a): undefined reference to `OPENSSL_add_all_algorithms_noconf'
ssl-server.c.text+0x8f): undefined reference to `SSL_load_error_strings'
ssl-server.c.text+0x94): undefined reference to `SSLv23_server_method'
ssl-server.c.text+0x9c): undefined reference to `SSL_CTX_new'
ssl-server.c.text+0xb2): undefined reference to `ERR_print_errors_fp'
ssl-server.c.text+0xe3): undefined reference to `SSL_CTX_use_certificate_file'
ssl-server.c.text+0xf4): undefined reference to `ERR_print_errors_fp'
ssl-server.c.text+0x125): undefined reference to `SSL_CTX_use_PrivateKey_file'
ssl-server.c.text+0x136): undefined reference to `ERR_print_errors_fp'
ssl-server.c:(.text+0x14d): undefined reference to `SSL_CTX_check_private_key'
ssl-server.c:(.text+0x15e): undefined reference to `ERR_print_errors_fp'
ssl-server.c:(.text+0x324): undefined reference to `SSL_new'
ssl-server.c:(.text+0x339): undefined reference to `SSL_set_fd'
ssl-server.c:(.text+0x344): undefined reference to `SSL_accept'
ssl-server.c:(.text+0x376): undefined reference to `SSL_CTX_free'
ssl-server.c:(.text+0x40a): undefined reference to `SSL_write'
ssl-server.c:(.text+0x4aa): undefined reference to `SSL_read'
ssl-server.c:(.text+0x50a): undefined reference to `SSL_shutdown'
ssl-server.c:(.text+0x515): undefined reference to `SSL_free'
[/code]
thanks

论坛徽章:
0
9 [报告]
发表于 2007-05-12 11:03 |只看该作者
是的,俺是新手,谢谢大家了,包括那位打击俺的朋友。

论坛徽章:
0
10 [报告]
发表于 2007-05-12 11:08 |只看该作者
原帖由 wangyunyin 于 2007-5-12 11:03 发表
是的,俺是新手,谢谢大家了,包括那位打击俺的朋友。

我没有打击你。如果你怎么认为的话。我道歉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP