Linux下基于socket的文件传输程序设计课程报告
socket编程实验报告
socket编程实验报告《Socket编程实验报告》在计算机网络通信中,Socket编程是一种常见的通信方式,它允许不同的计算机之间进行数据交换和通信。
通过实验,我们可以更深入地了解Socket编程的原理和应用。
实验目的:1. 了解Socket编程的基本原理和概念2. 掌握Socket编程的基本操作和使用方法3. 实现简单的客户端和服务器端通信实验环境:1. 操作系统:Windows或Linux2. 编程语言:C/C++或Python实验步骤:1. 理解Socket编程的基本原理和概念,包括TCP和UDP协议2. 编写客户端程序,建立与服务器端的连接3. 编写服务器端程序,接受客户端的连接并进行数据交换4. 测试客户端和服务器端的通信功能,包括发送和接收数据实验结果:通过实验,我们成功实现了简单的客户端和服务器端通信。
我们能够在客户端发送数据,服务器端接收并处理数据,然后再将处理结果返回给客户端。
这证明了Socket编程的可行性和实用性。
实验总结:Socket编程是一种强大而灵活的通信方式,它可以实现不同计算机之间的数据交换和通信。
通过本次实验,我们更加深入地了解了Socket编程的原理和应用,掌握了基本的操作和使用方法。
我们相信在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。
通过这次实验,我们对Socket编程有了更深刻的理解,也提升了我们的编程能力和实践能力。
我们相信,在今后的学习和工作中,Socket编程将会发挥重要的作用,为我们的网络通信提供更多的可能性和便利性。
计算机网络课程设计报告文件传输协议的简单实现
课程设计课程名称计算机网络课程设计题目名称文件传输协议的简单设计与实现学生学院专业班级___ _学号学生姓名______ _________指导教师______ _____2010 年 1 月 5 日设计摘要关键词:SOCKET编程,FTPclient/server程序摘要:本课程设计包含了文件传输协议的简单设计与实现。
文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),实现下述命令功能:get , put, pwd, dir, cd, ?, quit 等,利用了已有网络环境设计并实现简单应用层协议。
本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。
目录1、文件传输协议的简单设计与实现------------------------------181. 1 具体设计任务----------------------------------------------18 1.2 基本思路及所涉及的相关理论--------------------------------181.2.1基本思路-------------------------------------------------182.2.2 相关理论--------------------------------------------18 1.3设计流程图------------------------------------------------191.4实验运行情况----------------------------------------------191.5 核心程序--------------------------------------------------222.5.1 服务器(sever)程序---------------------------------222.5.2 客户(client)程序----------------------------------291.6心得体会-----------------------------------------------------------------------------37参考文献--------------------------------------------------------382、文件传输协议的简单设计与实现2. 1 具体设计任务计算机网络实验环境建立在TCP/IP 网络体系结构之上。
实验九Linux网络编程(报告)
实验九Linux网络编程(4课时)实验目的:了解嵌入式网络开发环境的组成,掌握嵌入式网络程序设计实验原理:linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个socket"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket 类型常见的socket有3种类型如下。
(1)流式socket(SOCK_STREAM )流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
(2)数据报socket(SOCK_DGRAM )数据报套接字定义了一种无连接的服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。
它使用数据报协议UDP。
(3)原始socket(SOCK_RAW)原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。
网络编程主要函数:1.socket:创建一个socketint socket(int family, int type, int protocol);//family指定协议族;type参数指定socket的类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;protocol通常赋值"0", socket()调用返回一个整型socket描述符。
2.bind:用于绑定IP地址和端口号到socketint bind(int sockfd, struct sockaddr *my_addr, int addrlen);//sockfd是一个socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的针; addrlen常被设置为sizeof(struct sockaddr),bind()函数在成功被调用时返回0;遇到错误时返回"-1"并将errno 置为相应的错误号。
基于SOCKET开发文本服务器客户端文本传输程序
一、实验目的与实验要求1、实验目的使用c++6.0或c#,基于SOCKET开发一个简单的C/S文本传输程序2、实验要求客户端能够发送由标准输入得到的文本,服务器能够接收并将其显示在标准输出上。
二、实验设备(环境)及要求计算机系统:windows 8.1软件环境:vc++6.0三、实验内容与步骤1、实验1(1)实验内容1、服务器端先初始化socket,并绑定端口,对端口进行监听,等待客户端的连接。
2、客户端初始化socket,连接服务器,并发送数据给服务器。
3、服务器接受客户端的数据,并返回回复信息。
(2)主要步骤工作原理:代码:服务器#include <stdio.h>#include <winsock.h>#pragma comment(lib,"ws2_32.lib")int main(){//初始化WORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0){return 0;}//创建套接字SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (slisten == INVALID_SOCKET){printf("socket error !");return 0;}//绑定IP和端口sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(55555);sin.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("bind error !");return 0;}//开始监听if (listen(slisten, 5) == SOCKET_ERROR){printf("listen error !");return 0;}SOCKET Client;sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);char revData[255];printf(" 等待连接...\n");Client = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);if (Client == INVALID_SOCKET){printf("accept error !");return 0;}printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//接收数据while (1){int ret = recv(Client, revData, 255, 0);if (ret > 0){revData[ret] = 0x00;printf("来自客户端的信息:");printf(revData);printf("\n");}//发送确认信息char * sendData = "发送成功。
socket网络课设报告
基于C/S结构的套接字程序设计----通过socket实现服务端功能学院:信息技术工程学院 _ 专业:计算机科学与技术 _ 班级: *班 _姓名:陈***学号: 0123456789指导老师: *** 开课时间:2014年1月12日到1月16日摘要基于C/S结构的套接字程序设计,采用了Client/Server模型, 程序基于TCP协议,通过socket接口来实现的。
服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。
当连接成功之后,客户端就可以向服务器端发送数据或接收来自服务器的的数据。
在传输过程中如果出现错误会返回错误信息,并对该信息做出诊断。
引言1、目的及要求(1)目的和意义通过编程了解C/S结构的网络通信模型;掌握基于C/S结构的Windows Socket TCP的程序设计方法。
(2)基本要求按照C/S模型编写两个程序。
一个为客户端程序,另一是服务器端程序;对于C/S两端都应输出必要的日志、出错或诊断信息。
2、研究设想能够实现当客户端向服务器端发送请求时,通过TCP协议(传输控制协议)服务器端能够响应,并能与客户端进行通信。
3、相关理论TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。
TCP协议在网络层IP 协议的基础上,向应用层用户进程提供可靠地全双工的数据流传输。
并且通过创建的流式套接字实现服务端与客户端的数据传送。
流式套接字(SOCK--STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。
而且发送的数据是按顺序接收的。
所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。
这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。
4、预期结果通过运用套接字,实现服务器端与客户端的数据传送。
基于SOCKET开发文本服务器客户端文本传输程序
一、实验目的与实验要求1、实验目的使用c++6.0或c#,基于SOCKET开发一个简单的C/S文本传输程序2、实验要求客户端能够发送由标准输入得到的文本,服务器能够接收并将其显示在标准输出上。
二、实验设备(环境)及要求计算机系统:windows 8.1软件环境:vc++6.0三、实验容与步骤1、实验1(1)实验容1、服务器端先初始化socket,并绑定端口,对端口进行监听,等待客户端的连接。
2、客户端初始化socket,连接服务器,并发送数据给服务器。
3、服务器接受客户端的数据,并返回回复信息。
(2)主要步骤工作原理:代码:服务器#include <stdio.h>#include <winsock.h>#pragma comment(lib,"ws2_32.lib")int main(){//初始化WORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0){return 0;}//创建套接字SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (slisten == INVALID_SOCKET){printf("socket error !");return 0;}//绑定IP和端口sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(55555);sin.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {printf("bind error !");return 0;}//开始监听if (listen(slisten, 5) == SOCKET_ERROR){printf("listen error !");return 0;}SOCKET Client;sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);char revData[255];printf(" 等待连接...\n");Client = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);if (Client == INVALID_SOCKET){printf("accept error !");return 0;}printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//接收数据while (1){int ret = recv(Client, revData, 255, 0);if (ret > 0){revData[ret] = 0x00;printf("来自客户端的信息:");printf(revData);printf("\n");}//发送确认信息char * sendData = "发送成功。
基于Linux下的Socket通信(操作系统课程设计)
基于Linux下的socket通信[开发平台]:LINUX[开发语言]:JA V A[开发工具]:ECLISPE[开发人员]:阚广稳(安徽理工大学计算机学院09-2班)I.系统描述:本系统含有一个服务器(Server.class)和多个客户端(Clinet.class),可以通过每个客户端查看和下载服务器端共享文件夹中的文件。
II.功能描述:A.查看服务器端共享文件夹列表操作:在Linux终端下输入java Clinet listfiles。
参数说明:listfiles是固定参数。
结果:列出所有共享文件。
B.下载服务器端共享文件夹中的文件操作:在Linux终端下输入java Clinet download filename dirpath。
参数说明:download是固定参数,filename是想要下载的文件名,dirpath是下载文件保存的路径。
结果:下载文件filename到地址dirpath。
III.功能分析以及实现:A.问题描述:如何创建可以用于多个客户端连接的服务器?分析解决:因为JA V A语言提供了对多线程的支持,所以我们可以把服务器设计为多线程的,对于每个客户端的连接单独开一条线程与之交互。
主要实现代码:服务器端:ServerSocket serversocket=new ServerSocket(5678);Socket socket;While(true){Socket=serversocket.accept();new ServerThread(socket).start();}Class ServerThread extends Thread{Socket socket;Public ServerThread(Socket socket){this.socket=socket;}}B.问题描述:如何把服务器端的文件列表发送到客户端分析解决:服务器端如果取得一个文件名就发给客户端也是可行的,但当文件较多的时显得不清晰,如果可以把所有文件名组成的文件列表保存起来,再统一发送到客户端,客户端再统一解析文件列表就显得更合理。
Linux网络文件传输系统实验报告
计算机科学与技术系
实验(项目)报告
一、基本信息
实验(项目)名称Linux网络文件传输系统
课程名称Linux系统编程学生层次本科
学生专业信息工程学生年级2014级
学生班级信工一班学生学号
学生姓名黎子涵完成日期2016年12月25日指导教师董祥千报告成绩
二、目的与要求
目的:
通过实验掌握并发服务器与客户端进行通信的功能。
要求:
1.Linux下项目开发工具;
2.命令行参数;
3.客户端文件名字定为为当前时间;
4.对关键函数或系统调用要进行必要的错误判断处理;
5.进程、线程;
6.客户端将接收到的数据写入文件;
7.进程间通信
三、完成实验(项目)过程和效果
内容:
1.程序结构设计;
2.程序数据设计;
3.程序基本流程。
4.编码、测试
图1.1 程序调试
步骤:
1.程序结构设计
1)采用流式套接字,即TCP套接字。
保证数据的可靠性。
图1.2 TCP套接字传输过程
2)采用多进程或多线程方式处理客户端问题。
(服务器可能要处理多个客户请求)
2.程序数据设计。
Linux下基于socket的文件传输程序设计要点
课程设计课程名称Linux下基于socket的文件传输程序设计学生学院信息工程学院专业班级学号学生姓名指导教师2013 年12月27日引言在互联网已经基本普及的情况下,人们越来越依赖于信息网络。
因为互联网的使用,我们可以大大的节省了我们的时间及成本。
所以文件、信息的传输已经是人们生活中不可缺少的东西。
而现在主流的应用软件都是基于WINDOWS平台上开发运行的。
Linux操作系统本身具有非常高的安全性,不易感染病毒(这是WINDOWS系统所不能比拟的),而且可移植性强,应用于大多数的服务器。
所以我们应该多开发出适合人们使用的应用软件,使得Linux更加好的为广大网民使用以保障自身的安全性。
本课设主要介绍在Linux下的文件传输原理及功能,虽然不能与主流传输软件的功能相比,但是却是占用的资源比它要少·1课设背景分析这次课程设计的要求是在以Linux为内核的操作系统下,实现多线程文件传输系统功能模块。
系统模块分为服务器和客户端两部分,客户端实现对文件的上传、下载和查看服务器默认路径下的文件列表;服务器可以对文件进行管理操作,包括创建、删除和重命名等。
多线程文件传输是一种一对多或者多对多的关系,一般是一个服务器对应着多个客户端。
客户端通过socket连接服务器,服务器要为客户端创建一个单独进程(线程)监听每个客户端的请求。
创建好连接之后文件就可以通过流的形式传输。
linux内核中为我们提供了两种不同形式的读写流,包括read()、write()和send()、recv()。
客户机对文件的查看指令也是通过流传递给服务器,服务器根据请求类型返回不同相应流。
根据socket原理和特点绘画出链接流程图,将客户机与服务器的相互通信划分为不同的模块,每个模块负责独立的功能项。
服务器输入指令管理目录下的文件,create filename是创建文件命令,rename oldname newname是删除文命令,delete filename 是删除文件命令,同时监听着客户端的请求;客户端向服务器发送上传、下载和查看请求,从而得到不同的相应,包括将文件下载到当前路径下,从当前路径下上传文件给服务器,列出服务器的文件列表。
计算机网络课程设计报告基于Socket在线数据传输的设计与实现
计算机网络课程设计报告基于Socket在线数据传输的设计与实现数据通信与计算机网络课程设计报告指导老师;苏军学院:运算机科学学院专业:2019级电子信息科学与技术组长:学号:组员:学号:2组员:学号:基于Socket在线数据传输的设计与实现摘要近年来随着运算机技术的飞速进展,专门是Internet技术的进展,差不多深刻的改变到了人们生活的方方面面。
这时过去的种种陈旧的通讯方式,都差不多不能满足现代生活的需要。
人们期望能够用更低廉的价格,更加方便快捷的方式,来实现即时通讯。
这时开发一套基于Internet技术的网络数据传输系统变得尤为重要。
Internet是目前世界上最大的运算机互联网络,它遍布全球,并将世界各地不同规模和大小的网络连接成为一个整体。
目前基于Internet的应用差不多专门多了,例如网上收发邮件、网上购物、网上看电影等等。
这些应用无不在改变人们的生活传统生活方式。
本课题要紧研究的是基于Socket的数据传输软件,此软件分为服务器程序和客户端程序,本课题的目标是能实现用户在客户端与服务器端传递信息。
要紧研究开发内容是:熟悉系统开发平台,探究在此开发平台下,利用Socket编程技术、TCP/IP协议等进行谈天软件的实际开发。
一.课程设计性质:独立课设二.课程设计目的和任务:1、把握数据通信和运算机网络的差不多原理2、把握数据通信和运算机网络设计、分析和实现方法3、提高学生编制网络通信程序、网络应用服务程序的能力三.课程设计差不多内容及要求:差不多内容:网络数据通信的差不多方法及实现。
差不多要求:依照选定的项目,课题小组成员认真查阅相关资料,发挥学生的主体作用,提出设计方案,老师参与,进行讨论和分析,最终确定设计方案。
在此基础上,合理分工,协同完成项目的设计与实现,最后完成课程设计的报告撰写。
四.课程设计平台基于Eclipse集成开发环境五.课程设计原理:1. TCP/IP协议TCP/IP是Transmission Control Protocol/Internet Protocol 的简写,中文译名为传输操纵协议/互联网络协议,该协议是Internet 最差不多的协议,简单地说,确实是由底层的IP协议和TCP协议组成的。
基于SOCKET开发文本服务器客户端文本传输程序
基于SOCKET开发文本服务器客户端文本传输程序服务器端程序:1.创建一个套接字对象,绑定IP地址和端口号,并监听客户端的连接请求。
2.当有客户端连接请求时,接受连接请求,并创建一个新的线程来处理该客户端的请求。
3.在新的线程中,首先接收从客户端发送的要传输的文本文件名。
4.打开该文件,并逐行读取文件内容。
5.将每行文本内容以字符串形式发送给客户端,直到文件内容全部发送完毕。
6.关闭文件和套接字。
客户端程序:1.创建一个套接字对象,连接服务器端的IP地址和端口号。
2.输入要传输的文本文件名,并将文件名发送给服务器端。
3.创建一个新的文件来保存从服务器端接收的文本内容。
4.循环接收从服务器端发送的文本内容,直到接收完整个文本文件。
5.将接收到的文本内容写入新创建的文件中。
6.关闭文件和套接字。
这是一个简单的文本传输程序,可以通过在客户端输入要传输的文件名,将文件内容发送给服务器端,服务器端接收到文件内容后保存到相应的文件中。
这里使用TCP协议进行文本传输,保证传输的可靠性。
在实际开发中,还可以对程序进行一些扩展和优化,例如:1.对传输进行分块,每次传输固定大小的数据块,优化传输效率。
2.添加文件校验机制,以保证文件传输的完整性。
3.支持多个客户端同时传输文件,可以通过多线程或多进程来处理。
4.添加文件压缩和解压功能,减少传输时间和带宽占用。
5.添加身份验证机制,确保只有授权用户才能进行文件传输。
以上是基于SOCKET开发的简单文本服务器客户端文本传输程序的简要介绍,实际开发中还需根据具体需求进行相应的功能扩展和优化。
Linux网络编程之socket文件传输示例
Linux⽹络编程之socket⽂件传输⽰例本⽂所述⽰例程序是基于Linux平台的socket⽹络编程,实现⽂件传输功能。
该⽰例是基于TCP流协议实现的socket⽹络⽂件传输程序。
采⽤C语⾔编写。
最终能够实现传输任何格式⽂件的⽂件传输程序。
具体实现代码如下:Server端代码如下:/*************************************************************************> File Name: Server.c> Author: SongLee************************************************************************/#include<netinet/in.h> // sockaddr_in#include<sys/types.h> // socket#include<sys/socket.h> // socket#include<stdio.h> // printf#include<stdlib.h> // exit#include<string.h> // bzero#define SERVER_PORT 8000#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(void){// 声明并初始化⼀个服务器端的socket地址结构struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(SERVER_PORT);// 创建socket,若成功,返回socket描述符int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);if(server_socket_fd < 0){perror("Create Socket Failed:");exit(1);}int opt = 1;setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));// 绑定socket和socket地址结构if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))){perror("Server Bind Failed:");exit(1);}// socket监听if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE))){perror("Server Listen Failed:");exit(1);}while(1){// 定义客户端的socket地址结构struct sockaddr_in client_addr;socklen_t client_addr_length = sizeof(client_addr);// 接受连接请求,返回⼀个新的socket(描述符),这个新socket⽤于同连接的客户端通信// accept函数会把连接到的客户端信息写到client_addr中int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);if(new_server_socket_fd < 0){perror("Server Accept Failed:");break;}// recv函数接收数据到缓冲区buffer中char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0){perror("Server Recieve Data Failed:");break;}// 然后从buffer(缓冲区)拷贝到file_name中char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer)); printf("%s\n", file_name);// 打开⽂件并读取⽂件数据FILE *fp = fopen(file_name, "r");if(NULL == fp){printf("File:%s Not Found\n", file_name);}else{bzero(buffer, BUFFER_SIZE);int length = 0;// 每读取⼀段数据,便将其发送给客户端,循环直到⽂件读完为⽌while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0){if(send(new_server_socket_fd, buffer, length, 0) < 0){printf("Send File:%s Failed./n", file_name);break;}bzero(buffer, BUFFER_SIZE);}// 关闭⽂件fclose(fp);printf("File:%s Transfer Successful!\n", file_name);}// 关闭与客户端的连接close(new_server_socket_fd);}// 关闭监听⽤的socketclose(server_socket_fd);return 0;}Client端代码如下:/*************************************************************************> File Name: Client.c> Author: SongLee************************************************************************/#include<netinet/in.h> // sockaddr_in#include<sys/types.h> // socket#include<sys/socket.h> // socket#include<stdio.h> // printf#include<stdlib.h> // exit#include<string.h> // bzero#define SERVER_PORT 8000#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512int main(){// 声明并初始化⼀个客户端的socket地址结构struct sockaddr_in client_addr;bzero(&client_addr, sizeof(client_addr));client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = htons(INADDR_ANY);client_addr.sin_port = htons(0);// 创建socket,若成功,返回socket描述符int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);if(client_socket_fd < 0){perror("Create Socket Failed:");exit(1);}// 绑定客户端的socket和客户端的socket地址结构⾮必需if(-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr)))){perror("Client Bind Failed:");exit(1);}// 声明⼀个服务器端的socket地址结构,并⽤服务器那边的IP地址及端⼝对其进⾏初始化,⽤于后⾯的连接 struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) == 0){perror("Server IP Address Error:");exit(1);}server_addr.sin_port = htons(SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);// 向服务器发起连接,连接成功后client_socket_fd代表了客户端和服务器的⼀个socket连接if(connect(client_socket_fd, (struct sockaddr*)&server_addr, server_addr_length) < 0){perror("Can Not Connect To Server IP:");exit(0);}// 输⼊⽂件名并放到缓冲区buffer中等待发送char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:\t");scanf("%s", file_name);char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));// 向服务器发送buffer中的数据if(send(client_socket_fd, buffer, BUFFER_SIZE, 0) < 0){perror("Send File Name Failed:");exit(1);}// 打开⽂件,准备写⼊FILE *fp = fopen(file_name, "w");if(NULL == fp){printf("File:\t%s Can Not Open To Write\n", file_name);exit(1);}// 从服务器接收数据到buffer中// 每接收⼀段数据,便将其写⼊⽂件中,循环直到⽂件接收完并写完为⽌bzero(buffer, BUFFER_SIZE);int length = 0;while((length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0)) > 0){if(fwrite(buffer, sizeof(char), length, fp) < length){printf("File:\t%s Write Failed\n", file_name);break;}bzero(buffer, BUFFER_SIZE);}// 接收成功后,关闭⽂件,关闭socketprintf("Receive File:\t%s From Server IP Successful!\n", file_name);close(fp);close(client_socket_fd);return 0;}该程序备有较为详尽的注释,相信不难理解。
基于socket的文件传输软件的设计与实现
哈尔滨工业大学课程结业报告姓名:学陈琳09S003158计算机科学与技术网络程序设计2009-12-20目录1.基于TCP/IP及UDP的通信传输概述 (2)2.系统体系结构 (4)2.1面向TCP连接系统调用过程 (5)2.2面向UDP连接系统调用过程 (6)3.系统要求与功能实现 (6)3.1公共类设计 (6)3.1.1 IP地址操作类 (6)3.1.2 DNS相关类 (7)3.2 TCP文件传输 (8)3.2.1 服务器端 (8)3.2.2 客户端 (9)3.3 UDP文件传输 (10)3.3.1 服务器端 (11)3.3.2 客户端 (12)3.4线程池 (12)3.5其它 (13)4.试验结果 (13)5.思考 (15)6.结论和收获 (16)基于socket套接字的文件传输软件的设计与实现1.概述TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet 最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP 协议和传输层的TCP协议组成的。
TCP/IP协议使用范围极广,是目前异种网络通信使用的唯一协议体系,适用于连接多种机型,既可用于局域网,又可用于广域网,许多厂商的计算机操作系统和网络操作系统产品都采用或含有TCP/IP协议。
TCP/IP协议已成为目前事实上的国际标准和工业标准。
基于TCP/IP协议组的网络模型分为应用层、传输层、网络层、链路层和物理层这样五个层次。
TCP/IP 协议组位于应用程序和硬件之间,指挥数据在网络各层中传递。
其中传输层的协议包括传输控制协议(TCP)和用户数据报协议(UDP) ,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。
传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。
linux下基于Socket的文件传输程序课程设计
1需求分析1.1系统目的Linux 作为一个先进的操作系统,其发展越来越快,应用领域也越来越广泛。
在学习了《linux内核设计与实现》之后,亲自设计并实现linux下的编程,不仅有助于巩固学过的知识,更能扩宽自己的视野,增强动手实践能力。
1.2课程要求Linux下基于Socket的文件传输程序设计,包括对文件进行管理,包括上传,下载,删除文件,重命名,支持多线程等。
1.3开发工具与开发平台开发工具:C语言开发平台:Linux2系统设计2.1系统功能此软件的主要功能有:1.实现在linux环境下的基于socket文件传输;2.对linux环境下的文件进行简单管理。
其中客户端与服务器的所要完成的具体功能如下:客户端:(1)连接服务器,并发送指令给服务器;(2)接收并识别服务器发来的信息;(3)通过不同指令实现文件的查看,下载,和上传。
服务器:(1)能查看本地的文件,并进行简单的管理,如删除,重命名等(2)接收来自客户端的连接请求,并赋予客户端不同的操作权限;(3)识别客户端的发来的指令,实现与客户端间的文件下载和上传。
2.2系统结构软件由服务器端和客户端两部分组成,服务器端监听客户对某个特定端口的网络连接请求,并与之建立连接,这样,这个客户的数据就可以发送到服务器。
客户端的任务是将用户的指令发送给服务器,且客户端可以有多个。
客户端运行时将立即向服务器的某个端口发送连接请求,待连接建立后则由用户的发送线程发送该用户的指令到服务器。
服务器端的主线程负责监听某个端口,接收用户的发送线程发出的指令。
在客户端,用户接收线程接收服务器发送的数据,由用户端主线程进行处理后显示。
2.3客户端指令查看服务器下指定路径下的所有文件:look_up;下载服务器下指定路径下的指定文件:download filename;上传客户端下指定路径下的指定文件:senddata filename;退出连接:end ;2.4服务器指令运行服务器后,系统提示指令查看所有文件请输入 1 ;重命名文件请输入2 ;删除文件请输入3;开启服务监听模式4;2.5数据流设计3测试结果服务器进行文件管理的操作服务器监听多个客户端并相应其指令客户端0连接服务器客户端1连接服务器4总结这次课程设计是linux下的socket通信,以c为编程语言,并实现了文件管理与多线程开发。
linux操作系统_实验九-Linux多线程文件传输实现
9)完成通信以后,使用close()函数关闭socket连接。
四、实验结果、数据处理与过程截图
1.打开两个终端分别作为服务器端和客户端
2.在服务器端程序编译
gcc -o server server.c
4)客户机用socket()函数建立一个套接口,设定远程ip和端口
5)客户机调用connect()函数连接远程计算机指定的端口。
6)服务器调用accept()函数来接受远程计算机的连接请求,建立起与客户机之间的通信连接。
7)建立连接之后,客户机用write()函数(或send())想socket中写入数据。也可以用read()函数(或recv()函数)赌气服务器发送来的数据。
安装有Ubuntu系统的VMWare
三、实验内容与步骤
实验内容:Linux多线程文件传输实现
实验步骤:
包括服务器和客户端两部分。
•6.1服务器端创建监听与文件管理
服务器负责的功能模块主要有两部分,一是对连接进来客户端所有线程的管理和服务器目录下的文件管理;二是创建线程来单独监听客户端的动作。为了便于管理,创建两个user.txt和client.txt两个文档来分别负责服务器的连接和客户端的连接。user.txt中存放了服务器名和密码。client.txt存放了连接客户端名字和密码。
首先对服务器的创建有个监测,即在启动时先核实服务器的所有者username和密码password,将输入的用户、密码与user.txt中的用户密码比较,匹配成功则同意启动,否则return -1表失败。
接着创建一个socket套接口,绑定Ip设置客户端的最大连接数为10,然后创建一个sever线程来实现对服务器本身监听动作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux高级开发课程设计报告课程设计题目:Linux下基于socket的文件传输程序设计学院:________信息工程学院_____________专业班级:________网络工程_____________年级:________级_____________________姓名:____________________________学号:________201______________完成时间:___2015___年____12___月_____25__日成绩:__________________________________指导教师:____________________________指导教师评定成绩:指导教师签名:年月日指导教师评定成绩:指导教师签名:年月日摘要线程(thread)技术早在60年代就被提出,但真正应用线程到操作系统中去,是在80年代中期。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。
在Linux系统下,启动一个新的进程必须分配独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段。
而运行于一个进程中的多个线程,它们之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间所需要的时间。
使用多线程的理由之二是线程间方便的通信机制。
对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式费时且很不方便。
由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这样快且方便。
在计算机中,凡是提供服务的一方我们称为服务端(Server),而接受服务的另一方我们称作客户端(Client)。
不过客户端及伺服端的关系不见得一定建立在两台分开的机器上,提供服务的伺服端及接受服务的客户端也有可能都在同一台机器上,这样在同一台机器上就同时扮演伺服端及客户端。
线程间方便的通信机制可以使得在我们在服务端和客户端方便的进行通信传输与各种操作,可以通过运用多线程机制方便实现上传、下载文件;增加、删除用户;以及在服务端进行文件的管理。
关键字:多线程、socket通信、服务器和客户端·1需求分析这次课程设计的要求是在以Linux为内核的操作系统下,实现多线程文件传输系统功能模块。
系统模块分为服务器和客户端两部分,客户端实现对文件的上传、下载和查看服务器默认路径下的文件列表;服务器可以对文件进行管理操作,包括创建、删除和重命名等。
多线程文件传输是一种一对多或者多对多的关系,一般是一个服务器对应着多个客户端。
客户端通过socket连接服务器,服务器要为客户端创建一个单独进程(线程)监听每个客户端的请求。
创建好连接之后文件就可以通过流的形式传输。
linux内核中为我们提供了两种不同形式的读写流,包括read()、write()和send()、recv()。
客户机对文件的查看指令也是通过流传递给服务器,服务器根据请求类型返回不同相应流。
根据socket原理和特点绘画出链接流程图,将客户机与服务器的相互通信划分为不同的模块,每个模块负责独立的功能项。
服务器输入指令管理目录下的文件,create filename是创建文件命令,rename oldname newname是删除文命令,delete filename 是删除文件命令,同时监听着客户端的请求;客户端向服务器发送上传、下载和查看请求,从而得到不同的相应,包括将文件下载到当前路径下,从当前路径下上传文件给服务器,列出服务器的文件列表。
·2 socket 通信原理国际标准化组织(ISO)在1978年提出开放系统互连参考模型(OSI:open system interconnection reference mode),该模型是设计和描述网络通信的基本框架。
OSI 采用分层的额结构化技术将通信网络分为7层,从低到高为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP 参考模型是由美国国防部创建,且发展至今最成功的通信协议模型,与OSI 模型对应,它将网络功能分为4层,包括网络接口层、网络层、传输层和应用层,每一层都有对应的协议。
在传输层的主要协议是TCP 协议和UDP 协议。
socket 连接就是基于TCP 协议。
TCP 是一种可靠地数据传输协议。
socket 是一种套接口,它把网络地址和端口号信息放在一个结构体中,也就是套接字地址结构。
结构图如下:通用套接口地址数据结构定义在<sys/socket.h>头文件中,形式如下: struct sockaddr {uint8_t sa_len;sa_family_t sa_family; char sa_data[14]; };IPv4套接口地址数据结构以socketaddr_in 命名,定义在<netinet/in.h>头文件中,形式如下: struct socketaddr_in {unit8_t sin_len;sa_family_t sin_family; in_port_t sin_port;struct in_addr sin_addr; unsigned char sin_zero[8]; }下图是TCP 套接口通信工作流程图:通信工作的大致流程:1) 服务器先用socket()函数来建立一个套接口,用这个套接口完成通信的监听及数据的收发。
2) 服务器用bind()函数来绑定一个端口号和ip 地址,是套接口与指定的端口号和ip 关联。
3) 服务器调用linsten()函数,是服务器的端口和Ip 处于监听状态,等待网络中某一个客户机的连接请求。
4) 客户机用socket()函数建立一个套接口,设定远程ip 和端口 5) 客户机调用connect()函数连接远程计算机指定的端口。
6) 服务器调用accept()函数来接受远程计算机的连接请求,建立起与客户机之间的通信连接。
7) 建立连接之后,客户机用write()函数(或send())想socket 中写入数据。
也可以用read()函数(或recv()函数)赌气服务器发送来的数据。
8) 服务器用read()函数(或recv()函数)来读取客户机发来的数据,也可以用write()函数(或send()函数)来发送数据。
9) 完成通信以后,使用close()函数关闭socket 连接。
·3详细设计过程·3.1服务器端创建监听与文件管理服务器负责的功能模块主要有两部分,一是对连接进来客户端所有线程的管理和服务器目录下的文件管理;二是创建线程来单独监听客户端的动作。
为了便于管理,我们创建两个user.txt和client.txt两个文档来分别负责服务器的连接和客户端的连接。
user.txt中存放了服务器名和密码。
client.txt存放了连接客户端名字和密码。
我们首先对服务器的创建有个监测,即在启动时先核实服务器的所有者username和密码password,将输入的用户、密码与user.txt中的用户密码比较,匹配成功则同意启动,否则return -1表失败。
接着创建一个socket套接口,绑定Ip设置客户端的最大连接数为10,然后创建一个sever线程来实现对服务器本身监听动作。
主体代码见最后接下来创建线程完成对客户端的监听监听等待连接:while(1){sockdata = accept(sockfd,(struct sockaddr*)0,(int*)0);…………….我们定义结构体:struct client_t{pthread_t tid;int conn_fd;int used;char name[20];}p_client[10];来存放每个客户端的socket信息、线程标识、使用号、连接号和客户名。
创建线程实现单独监听:p_client[i].conn_fd = sockdata;p_client[i].used = i;strcpy(p_client[i].name , client_name);pthread_create(&p_client[i].tid,NULL,&client_conn,&p_client[i])接下来是线程client_conn()的功能监听客户端的功能完成。
·3.2客户端连接与文件传输在客户端这边我们同样适用了检测机制,运行客户机时要将用户名、密码以及ip地址和端口号作为参数输进来,先建立与服务器的连接,然后将用户名和密码发送到服务端检测,如果检测失败则接收到一条拒绝信息,连接断开,如果检测成功则接收到一条确认信息,双方通信开始。
主体代码见最后:·4结果演示创建,改名,与删除客服端响应并连接服务器上传下载具体代码如下:服务器:#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<sys/stat.h>#include<arpa/inet.h>#include <sys/resource.h>#include <sys/types.h>#include <dirent.h>#define MAXBUF 256/*-------start of fileList functions----------*/ int fileSize(char fileName[]);//文件信息typedef struct fileinfo{char name[256];char fullName[1024];int size;time_t mod_time;char type[10];}fileinfo;//文件列表typedef struct filelist{fileinfo file;struct filelist* nextfile;}fileList;//function getfilelist//输入目录名//输出目录下的文件列表头指针fileList * getFileList(char name[1024]){fileList *head=NULL;fileList *cur=NULL;char name_temp[1024];//目录DIR * dir;//目录环境struct dirent *dir_env;//文件描述struct stat stat_file;//初始化headhead =(fileList*)malloc(sizeof(fileList));head->nextfile = NULL;//打开目录dir=opendir(name);while(dir_env=readdir(dir))//读文件描述表{//排除.和..if(strcmp(dir_env->d_name,".")==0 || strcmp(dir_env->d_name,"..")==0)continue;//把文件全名保存到新变量strcpy(name_temp,name);strcat(name_temp,dir_env->d_name);stat(name_temp,&stat_file);//获取文件描述信息//将文件信息存放到链表中//产生临时节点cur=(fileList*)malloc(sizeof(fileList));//cur赋值//文件名,fullName=cur_dir+"name";strcpy(cur->,dir_env->d_name);strcpy(cur->file.fullName,name_temp);//文件大小//文件类型if( S_ISDIR(stat_file.st_mode)){cur->file.size = 0;strcpy(cur->file.type,"mulu");strcat(cur->file.fullName,"/");}else{cur->file.size = stat_file.st_size;strcpy(cur->file.type,"file");}//修改日期cur->file.mod_time = ctime(&stat_file.st_mtime); //将临时节点插入head中if(head->nextfile ==NULL){head->nextfile = cur;cur->nextfile = NULL;}else{cur->nextfile = head->nextfile;head->nextfile = cur;}}return head;}//showAllNode//输入:目录//输出:次目录下所有的文件,和所有目录之下的文件void showAllNode(fileList *head){fileList * temp;//数组索引int i=0,j=0;//如果head为空,直接返回fileList * headArray[1024];if(head == NULL)return ;//输出当前目录printf("%s ",head->file.fullName);printf("\n");//输出head中的文件temp =head->nextfile;char fileListString[MAXBUF];FILE *file;char _temp[30];strcpy(_temp,"temp.txt");file=fopen(_temp,"w");if(file==NULL){printf("The file is created failed!");exit(1);}while(temp){//判断是否为文件,是文件显示文件//若为目录,将目录名放入队列,求队列目录if (strcmp(temp->file.type,"file")==0){bzero(fileListString,MAXBUF);printf("file:%s ",temp->file.fullName);strcat(fileListString,temp->file.fullName);strcat(fileListString,"\n");while ((strlen(fileListString)) > 0){int write_length = fwrite(fileListString, sizeof(char), strlen(fileListString), file);if (write_length < strlen(fileListString)){printf("File Write into Failed\n");break;}bzero(fileListString, MAXBUF);}}else{if(i>=1024){printf("there are too many direcotry\n");return;}//头节点初始化headArray[i] = getFileList(temp->file.fullName);//头节点名称strcpy(headArray[i]->file.fullName,temp->file.fullName); i++;}temp=temp->nextfile;}fclose(file);//对目录队列中目录使用递归,直到结束for(j=0;j<i;j++)showAllNode(headArray[j]);return ;}//showList//输入:列表头//输出:显示列表,返回voidvoid showList(fileList * head){//判断head 是否为空,若为空直接返回if(head == NULL)return;//若不为空则显示它的内容while(head){printf("%s\n",head->file.fullName);head = head->nextfile;}return ;}/*----------end of fileList functions-----------*/void main(){int opt=1;while(opt!=0){printf("Please choose your choice bellow:\n");printf("1:Manage the files.\n");printf("2:Connect the clients.\n");char window[2];scanf("%s",window);if((strncmp(window,"1",1))==0){printf("Please input your choice bellow:\n");printf("1: Create a new file.\n");printf("2: Delete a file.\n");printf("3: Rename a known file.\n");char choice[2];scanf("%s",choice);if((strncmp(choice,"1",1))==0){printf("Please input the new file name:");char filename[20];scanf("%s",filename);FILE *file;file=fopen(filename,"w");if(file==NULL){printf("The file created failed!\n");}else{printf("The file has created successfully.\n");}continue;}else if((strncmp(choice,"2",1))==0){printf("Please input the file name with the file path you want to delete:\n");char filename[20];scanf("%s",filename);remove(filename);printf("The file has been deleted successfully.\n");continue;}else{printf("Please input the file name you want to rename:\n");char _old[20];scanf("%s",_old);printf("Please input the new file name:\n");char _new[20];scanf("%s",_new);int result = rename( _old, _new );if( result != 0 )printf( "Could not rename '%s'\n", _old );elseprintf( "File '%s' renamed to '%s'\n", _old, _new );continue;}}else{int ssock;int clen;struct sockaddr_in client_addr,server_addr;char buf[MAXBUF];if((ssock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0){ perror("socket error:");exit(1);}printf("Run the server successfully.\nAnd now waiting the client comming...\n");memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");server_addr.sin_port=htons(6669);if(bind(ssock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){perror("bind error:");exit(1);}int window=1;while(window!=0){clen=sizeof(client_addr);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);printf("%s\n",buf);if((strncmp(buf, "0", 1)) == 0){if((strncmp(buf, "0yy", 7)) == 0){strcpy(buf,"yes");printf("It's username and right.\n");}else{strcpy(buf,"no");printf("It's username but wrong.\n");}sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr));}else if((strncmp(buf, "1", 1)) == 0){if((strncmp(buf, "1123", 4)) == 0){strcpy(buf,"yes");sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr));printf("It's password and right.\n");recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);if((strncmp(buf, "upload", 5)) == 0){printf("The client is going to upload file...\n");recvfrom(ssock,(void *)buf,MAXBUF,0,(structsockaddr*)&client_addr,&clen);//get filenameprintf("The filename of the file uploaded by user is:%s\n",buf);FILE *file;char temp[30];strcpy(temp,"recieve/");strcat(temp,buf);file=fopen(temp,"w");if(file==NULL){printf("The file is created failed!");exit(1);}bzero(buf, MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);while (strlen(buf) > 0){int write_length = fwrite(buf, sizeof(char), strlen(buf), file);if (write_length < strlen(buf)){printf("File Write into Failed\n");break;}bzero(buf, MAXBUF);}fclose(file);printf("Recieve file already success.\n");}else{printf("The client wants to download file.\n");printf("Send the filelist to the client...\n");//filelistfileList *mylist;//显示的目录char name[1024]="recieve/";//取得目录下文件//头指针传递的目录或者文件名mylist =getFileList(name);strcpy(mylist->file.fullName,name);//显示目录下文件//showList(mylist);//显示目录下所有文件showAllNode(mylist);//send fileListFILE *file;char temp[30];strcpy(temp,"temp.txt");file=fopen(temp,"r");if(file==NULL){printf("The file cannot open!");exit(1);}else{printf("\nThe fileListString open successfully!\n");bzero(buf,MAXBUF);int lengsize = 0;while((lengsize = fread(buf,1,MAXBUF,file)) > 0){printf("lengsize = %d\n",lengsize);sendto(ssock,(void*)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr));printf("%s\n",buf);bzero(buf, MAXBUF);}printf("The fileListString has been sent to the client already.\n");}fclose(file);bzero(buf, MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr,&clen);printf("The client choosen file: %s\n",buf);strcpy(temp,"recieve/");strcat(temp,buf);file=fopen(temp,"r");if(file==NULL){printf("The file is created failed!");exit(1);}else{printf("The file open successfully!\n");printf("The file is downloading to theclient now...\n");bzero(buf,MAXBUF);int lengsize = 0;while((lengsize = fread(buf,1,MAXBUF,file)) > 0){printf("lengsize = %d\n",lengsize);sendto(ssock,(void*)buf,MAXBUF,0,(struct sockaddr*)&client_addr,sizeof(server_addr));bzero(buf, MAXBUF);}printf("The file has been downloaded already.\n");}fclose(file);exit(1);//还可以显示此时的文件目录信息,检查是否完成了上传}close(ssock);window=0;}else{strcpy(buf,"no");sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&client_addr ,sizeof(client_addr));printf("It's password but wrong.\n");}}}}}}客服端:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<strings.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#define PORT 6669#define MAXBUF 256int check_passwd(int sockfd);int tra_file(int sockfd);void main ( int argc, char *argv[]){char username[20];char password[20];char temp[21];char window;printf("Please input your selections bellow:\n");printf("1:Login the server with your username and password\n");printf("2:Registe a newly user now.\n");printf("0:Exit the system.\n");window=getchar();while(window>0){if(window=='1'){int key=0;printf("Please input your username:");scanf("%s",username);printf("%s\n",username);int ssock;int clen;struct sockaddr_in client_addr,server_addr;char buf[MAXBUF];if((ssock = socket(AF_INET,SOCK_DGRAM,0))<0){perror("socket error:你暂时不能登录服务器server,请稍后再登录...\n");exit(1);}else{while(key==0){memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family =AF_INET;server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");server_addr.sin_port=htons(PORT);strcpy(temp,"0");strcat(temp,username);strcpy(buf,temp);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));printf("你已经发送username(%s)给server请等待响应...\n",buf);clen=sizeof(client_addr);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);printf("你已经得到了server的响应:%s\n",buf);if((strncmp(buf, "yes", 3)) != 0){printf("The username you inputed is wrong!\n");window='1';close(ssock);printf("Please input your username:");scanf("%s",username);printf("%s\n",username);}else{close(ssock);key=1;}}}printf("Please input your password:");scanf("%s",password);printf("%s\n",password);if((ssock = socket(AF_INET,SOCK_DGRAM,0))<0){perror("socket error:你暂时不能登录服务器server,请稍后再登录...\n");exit(1);}else{key=0;while(key==0){memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family =AF_INET;server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");server_addr.sin_port=htons(PORT);bzero(temp,21);strcpy(temp,"1");printf("%s\n",temp);strcat(temp,password);strcpy(buf,temp);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));printf("你已经发送password(%s)给server请等待响应...\n",buf);clen=sizeof(client_addr);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);printf("你已经得到了server的响应:%s\n",buf);if((strncmp(buf, "yes", 3)) != 0){printf("The password you inputed is wrong!\n");window='1';close(ssock);printf("Please input your password:");scanf("%s",password);printf("%s\n",password);}else{//file list display and file chooseprintf("Please choose eithor upload file or download file bellow:\n");printf("1:upload file.\n");printf("2:download file.\n");char choose[2];scanf("%s",choose);char path[20];char filename[20];if((strncmp(choose,"1",1))==0){printf("please input the path you want to upload end with '/':\n");scanf("%s",path);printf("Please input the file you want to upload:\n");strcpy(buf,"upload");sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));scanf("%s",filename);strcat(path,filename);strcpy(buf,filename);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));FILE *file;file=fopen(path,"r");if(file==NULL){perror("The file open failed!");exit(1);}else{printf("The file open successfully!\n");printf("The file is uploading now...\n");bzero(buf,MAXBUF);int lengsize = 0;while((lengsize = fread(buf,1,MAXBUF,file)) > 0){printf("lengsize = %d\n",lengsize);sendto(ssock,(void*)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));bzero(buf, MAXBUF);}printf("The file has been uploaded already.\n");exit(1);//还可以显示此时的文件目录信息,检查是否完成了上传}}else{bzero(buf,MAXBUF);strcpy(buf,"download");sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));printf("The filelist supported by server is bellow:\n");bzero(buf,MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);printf("%s\n",buf);printf("Please input the file you want to download :\n");scanf("%s",filename);strcpy(buf,filename);sendto(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,sizeof(server_addr));bzero(buf,MAXBUF);FILE *file;char temp[30];strcpy(temp,"download/");strcat(temp,filename);file=fopen(temp,"w");if(file==NULL){printf("The file is created failed!");exit(1);}bzero(buf, MAXBUF);recvfrom(ssock,(void *)buf,MAXBUF,0,(struct sockaddr*)&server_addr,&clen);while (strlen(buf) > 0){int write_length = fwrite(buf, sizeof(char), strlen(buf), file);printf("The write_length is:%d\n",write_length);if (write_length < strlen(buf)){printf("File Write into Failed\n");break;}bzero(buf, MAXBUF);}fclose(file);printf("Download file already success.\n");}close(ssock);key=1;window=0;}}}}else if(window=='2'){printf("Please input your newly username:");scanf("%s",username);printf("Please input your newly password:");scanf("%s",password);}else {break;}}}·5总结体会为期一周的Linux课程设计结束了,从中获益匪浅。