设计一个linux c语言,Http协议的服务器,用socket收发消息,简单点,求代码and注释。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计一个linux c语言,Http协议的服务器,用socket收发消息,简单点,求代码and注释。相关的知识,希望对你有一定的参考价值。

RT 好了会加分 有注释

OK
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char *argv[])

int sockfd,new_socket;
int sock_value;
char buf[] = "hello! China!I Love You\n";

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 2)
fprintf(stderr,"The two number!\n");
exit(1);


if((sock_value = atoi(argv[1])) < 0)
fprintf(stderr,"socket error!\n");
exit(1);


if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1)
perror("socket");
exit(1);


bzero(&server_,SIZE);

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = INADDR_ANY;

if(bind(sockfd,(struct sockaddr *)(&server_),SIZE) == -1)
perror("bind");
exit(1);


if(listen(sockfd, 12) == -1)
perror("listen");
exit(1);


printf("Waiting ... ...\n");

while(1)
if((new_socket = accept(sockfd,(struct sockaddr *)(&client_),&SIZE)) == -1)
perror("accept");
exit(1);


printf("The client IP is %s\n",inet_ntoa(client_.sin_addr));
printf("The socket is %d\n",ntohs(client_.sin_port));

if(write(new_socket,buf,strlen(buf)) == -1)
perror("write");
exit(1);


int my;
char mybuf[1024];

if((my = read(new_socket, mybuf,1024)) == -1)
perror("read");
exit(1);


mybuf[my] = '\0';
printf("#++++#++++#:%s\n",mybuf);

close(new_socket);



close(sockfd);

return 0;


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>

int main(int argc,char *argv[])

int sockfd;
int sock_value;
char buf[1024];
char mybuf[] = "Linux\n";
int read_count;

struct sockaddr_in client_;
struct sockaddr_in server_;

int SIZE = sizeof(struct sockaddr_in);

if(argc != 3)
fprintf(stderr,"The two number!\n");
exit(1);


if((sock_value = atoi(argv[2])) < 0)
fprintf(stderr,"socket error!\n");
exit(1);


if((sockfd = socket(PF_INET,SOCK_STREAM, 0)) == -1)
perror("socket");
exit(1);


bzero(&client_,SIZE);
bzero(&server_,SIZE);

client_.sin_family = PF_INET;
client_.sin_port = htons(52252);
client_.sin_addr.s_addr = INADDR_ANY;

server_.sin_family = PF_INET;
server_.sin_port = htons(sock_value);
server_.sin_addr.s_addr = inet_addr(argv[1]);

if(connect(sockfd,(struct sockaddr *)(&server_),SIZE) == -1)
perror("connect");
exit(1);


if((read_count = read(sockfd,buf,1024)) == -1)
perror("read");
exit(1);


buf[read_count] = '\0';
printf("#----#----#:%s\n",buf);

if(write(sockfd, mybuf,6) == -1)
perror("write");
exit(1);


close(sockfd);

exit(0);

return 0;
追问

来点注释吧

追答

是我自己写的,没得错误。你就自己写注释吧

参考技术A ramming》这本书吧,第11章讲的就是怎么用C语言实现一Http服务器。
这里有下载地址(英文的):

英文看起来不顺的话可以上网找找有没有中文版的这本书,应该叫Linux高级编程吧~~~
另外,虚机团上产品团购,超级便宜
参考技术B 去csdn下载。。

2017-2018-1 20155215 实验五 通讯协议设计

1

作业内容:

  • 两人一组
  • 基于Socket实现TCP通信,一人实现服务器,一人实现客户端
  • 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
  • 选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。
  • 学有余力者,对系统进行安全性分析和改进。

Linux下OpenSSL的安装与使用

OpenSSL简介

OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。
OpenSSL最早的版本在1995年发布,1998年后开始由OpenSSL项目组维护和开发。当前最新的版本是1.1.0 alpha版本,完全实现了对SSLv1、SSLv2、SSLv3和TLS的支持。。目前,OpenSSL已经得到了广泛的应用,许多类型的软件中的安全部分都使用了OpenSSL的库,如VOIP的OpenH323协议、Apache服务器、Linux安全模块等等。

OpenSSL整个软件包大概可以分成三个主要的功能部分:

  • 密码算法库
  • SSL协议库
  • 应用程序

OpenSSL源码的目录结构也是围绕这三个功能部分进行规划的。
密码算法库是一个强大完整的密码算法库,它是OpenSSL的基础部分,也是很值得一般密码安全技术人员研究的部分,它实现了目前大部分主流的密码算法和标准。主要包括对称算法、非对称算法、散列算法、数字签名和认证、X509数字证书标准、PKCS12、PKCS7等标准。其他两个功能部分SSL协议和应用程序都是基于这个库开发的。

在密码算法库的基础上实现的,SSL协议部分完全实现和封装了SSL协议的三个版本和TLS协议。使用协议库,你完全可以建立一个SSL服务器和SSL客户端。

应用程序是基于密码算法库和SSL协议库实现的命令,熟悉OpenSSL可以从使用这些应用程序开始。应用程序覆盖了密码技术的应用,主要包括了各种算法的加密程序和各种类型密钥的产生程序(如RSA、Md5、Enc等等)、证书签发和验证程序(如Ca、X509、Crl等)、SSL连接测试程序(如S_client和S_server等)以及其它的标准应用程序(如Pkcs12和Smime等)。

实验步骤

  • 下载安装包:

  • 安装指令

 ./config
 make
 make test
 sudo make install
  • 编写测试代码:

#include <stdio.h>
#include <openssl/evp.h>

int main(){
    OpenSSL_add_all_algorithms();
    return 0;
}

实验结果

2

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

运行程序命令:

  • 编译
gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
  • 生产私钥和证书
openssl genrsa -out privkey.pem 1024
openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
  • 程序运行方式:
./server 7838 1 CAcert.pem privkey.pem
./telent 127.0.0.1 7838

实验结果

实验中遇到的问题

问题1:

  • **首先遇到的问题,就是在OpenSSL的安装时,我发现我输入了make install 的指令之后,显示了安装错误。然后我搜索了一下, 还发现我的虚拟机上本来就有OpenSSL。但我后面试了一下,改成了sudo make install 指令就正常了 。 **

问题2:

  • 实验一中要求我们研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5。我发现我在OPENSSL的指令上不太会使用。

  • 让我们了解一下OpenSSL

  • 我找到了一些关于OpenSSL的指令内容:

  • 对称算法

使用的标准命令为 enc
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]
   [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]
   [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

-in filename:指定要加密的文件存放路径

-out filename:指定加密后的文件存放路径

-salt:自动插入一个随机数作为文件内容加密,默认选项

-e:可以指明一种加密算法,若不指的话将使用默认加密算法

-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致

-a/-base64:使用-base64位编码格式

  • AES
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456 //密码123456
  • RSA
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
   [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项:

-in filename:指明私钥文件

-out filename:指明将提取出的公钥保存至指定文件中 

-pubout:根据私钥提取出公钥
  • MD5
openssl passwd -1 -in test.txt -salt 12345678    

生成密码需要使用的标准命令为 passwd ,用法如下:

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:

-1:使用md5加密算法

-salt string:加入随机数,最多8位随机数

-in file:对输入的文件内容进行加密

-stdion:对标准输入的内容进行加密

实验的感想

  • 这次的实验让我对于Openssl有了更深入的认识,学会了更多的东西,另外,也觉得通过OpenSSL来测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5等,这种学科之间交融的感觉很奇妙,也让我认识到学习之间都是互相有联系的,每一门课程的学习,都为未来的内容打下基础。

以上是关于设计一个linux c语言,Http协议的服务器,用socket收发消息,简单点,求代码and注释。的主要内容,如果未能解决你的问题,请参考以下文章

C 语言在Linux下发送HTTP 请求

C 语言网络编程 — 轻量级 HTTP 服务器设计与实现

2017-2018-1 20155215 实验五 通讯协议设计

# 2017-2018-1 20155318 《信息安全系统设计基础》 实验五 通讯协议设计

2017-2018-1 20155227 《信息安全系统设计基础》 实验五 通讯协议设计

# 2017-2018-1 20155324 实验五 通信协议设计