第一项 C/S Socket实现文件上传

第一项 C/S Socket实现文件上传

一、C/S是什么?
(Client/Server)结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。C/S要求客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。PS:相对于的是B/S结构。

二、Socket是什么?
TCP/IP常见五层网络模型:应用层 传输层 网络层 数据链路层 物理层。应用层一般是基于tcp之上的通信协议包括http等,传输层包括tcp、udp协议、网络层包括ip协议。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

三、网络编程
TCP连接C/S三次握手
这里写图片描述
代码逻辑:
这里写图片描述
服务器:

int   listenfd, connfd;    
struct sockaddr_in     servaddr;    
char    buff[4096];    
int   n; 

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{    
    printf("create socket error: %s(errno: %d)\n",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(6666);    

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{    
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);    
    exit(0);    
}   

if( listen(listenfd, 10) == -1)
{    
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);    
    exit(0);    
}    

printf("======waiting for client's request======\n");   

while(1)
{    
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
    {       
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno); 
        continue;    
    }    

    n = recv(connfd, buff, MAXLINE, 0);   
    buff[n] = '\0';    
    printf("recv msg from client: %s\n", buff);    
    close(connfd);    
}    

close(listenfd);

客户端:

int   sockfd, n;   
char    recvline[4096], sendline[4096];    
struct sockaddr_in    servaddr;    
if( argc != 2)
{    
    printf("usage: ./client <ipaddress>\n");    
    exit(0);    
}    

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{    
    printf("create socket error: %s(errno: %d)\n",
    strerror(errno),errno);   
    exit(0);    
}    

memset(&servaddr, 0, sizeof(servaddr));    
servaddr.sin_family = AF_INET;    
servaddr.sin_port = htons(6666);    

if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{    
    printf("inet_pton error for %s\n",argv[1]);    
    exit(0);    
}    
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{    
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);    
}    
printf("send msg to server: \n");    
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
}
close(sockfd);
exit(0);

  
四、参考链接
http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

五、实现文件上传
  1、文件内容匹配使用MD5加密算法
  MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。
  
2、文件读写操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值