LINUX下如何创建TCP客户端和FTP服务器和客户端的设计与实现,实现通

&>&linux下TCP协议的一个简单客户端和服务器的例子
linux下TCP协议的一个简单客户端和服务器的例子
上传大小:2KB
linux下TCP协议的一个简单客户端和服务器的例子
综合评分:3
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有10条
不会使用呀
不错的东西,拿来改改就可以用了
在linux下可以能用
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
linux下TCP协议的一个简单客户端和服务器的例子
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
linux下TCP协议的一个简单客户端和服务器的例子linux环境下基于tcpip及socket技术的远程文件传送控制编程报告- 道客巴巴
Linux 环境下基于 TCP/IP 及 Socket技术的远程文件传送控制 编程报告
2013 年 5 月
录 一、编程目的 ................................................................................................................................... 3 二、通信原理 ................................................................................................................................... 3 (一)TCP/IP ........................................................................................................................... 3 (二)Socket ............................................................................................................................ 4 三、Linux 虚拟环境安装 ................................................................................................................ 7 (一)VMware 简介 ............................................................................................................... 7 (二)Linux 简介 .................................................................................................................... 8 (三)Linux 虚拟环境安装 .................................................................................................... 9 四、设计过程 ................................................................................................................................. 11 (一)服务器端创建监听与文件管理 ................................................................................. 11 (二)客户端连接与文件传输 ............................................................................................. 12 五、结果演示 ................................................................................................................................. 12 六、代码开发 ................................................................................................................................. 13 (一)服务器端 ..................................................................................................................... 13 (二)客户端 ........................................................................................... 错误! 未定义书签。 七、结束语 ..................................................................................................................................... 19
一、编程目的 这次程序设计的目标是在以 Linux 为内核的操作系统下,实现多线程文件传输系统功能模块。系统模块分为服务器和客户端两部分,客户端实现对文件的上传、下载和查看服务器默认路径下的文件列表;服务器可以对文件进行管理操作,包括创建、删除和重命名等。 多线程文件传输是一种一对多或者多对多的关系,一般是一个服务器对应着多个客户端。客户端通过 socket 连接服务器,服务器要为客户端创建一个单独进程(线程)监听每个客户端的请求。 创建好连接之后文件就可以通过流的形式传输。linux 内核中为我们提供了两种不同形式的读写流,包括 read()、write()和 send()、recv()。客户机对文件的查看指令也是通过流传递给服务器,服务器根据请求类型返回不同相应流。 根据 socket 原理和特点绘画出链接流程图,将客户机与服务器的相互通信划分为不同的模块,每个模块负责独立的功能项。服务器输入指令管理目录下的文件,create filename是创建文件命令,rename oldname newname 是删除文命令,delete filename 是删除文件命令,同时监听着客户端的请求;客户端向服务器发送上传、下载和查看请求,从而得到不同的相应,包括将文件下载到当前路径下,从当前路径下上传文件给服务器,列出服务器的文件列表。 二、通信原理 Linux 是计算机使用的主流操作系统之一,TCP/IP 是广为应用的互联网协议,Linux 为TCP/IP 网络编程提供了一种网络进程通信机制:套接字接口(Sockets Interface)。以下将介绍Linux 环境下套接字的基本概念及编程技术,并结合实例说明在 Linux 下如何用套接字实现客户机/服务器方式的进程通信。 (一)TCP/IP TCP/IP 即传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol),是一个由多种协议组成的协议族,他定义了计算机通过网络互相通信及协议族各层次之间通信的规范。 TCP 是一种面向连接的、可靠的、双向的通信数据流,说他可靠,是因为他使用 3 段握手协议传输数据,并且在传输时采用&重传肯定确认&机制保证数据的正确发送:接收端收到数据后要发出一个肯定确认,而发送端必须要能接收到这个肯定信号,否则就要将数据重发。在此原理基础之上,设计了基于 Linux 操作系统下 TCP/IP 编程实现文件传输的实例。我们采用客户机/务器模式通信时,通信双方发送/接收数据的工作 Linux 支持 BSD 的套接字和全部的 TCP/IP 协议,是通过网络协议将其视为一组相连的软件层来实现的。BSD 套接字(BSD Socket)由通用的套接字管理软件支持,该软件是 INET套接字层,用来管理基于 IP 的 TCP 与 UDP 端口到端口的互联问题。从协议分层来看,IP是网络层协议,TCP 是一个可靠的端口到端口的传输层协议,他是利用 IP 层进行传接报文的;同时也是面向连接的,通过建立一条虚拟电路在不同的网络问传输报文,保证所传输报文的无丢失性和无重复性。用户数据报文协议(User Datagram Protocol,UDP)也是利用 IP 层
传输报文,但他是一个非面向连接的传输层协议。利用 IP 层传输报文时,当目的方网际协议层收到 IP 报文后,必须能够识别出该报文所使用的上层协议(即传输层协议)。因此,在IP 报头中,设有一个&协议&域(Protoco1)。通过该域的值,即可判明其上层协议类型。传输层与网络层在功能上的最大区别是前者提供进程通信能力,而后者则不能。在进程通信的意义上,网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种标识符。为此,TCP/UDP 提出了协议端口(Protocol Port)的概念,用于标识通信的进程。例如,Web 服务器进程通常使用端口 80,在/etc/serv~ices 文件中有这些注册了的端口地址。 对于 TCP 传输,传输节点问先要建立连接,然后通过该连接传输已排好序的报文,以保证传输的正确性。IP 层中的代码用于实现网际协议,这些代码将 IP 头增加到传输数据中,同时也把收到的 IP 报文正确地转送到 TCP 层或 UDP 层。TCP 是一个面向连接协议,而 UDP则是一个非面向连接协议,当一个 UDP 报文发送出去后,Linux 并不知道也不去关心他是否成功地到达了目的主机。IP 层之下,是支持所有 Linux 网络应用的网络设备层,例如:点到点协议(Point to Point Protocol,PPP)和以太网层。网络设备并非总代表物理设备,其中有一些(例如回送设备)则是纯粹的软件设备,网络设备与标准的 Linux 设备不同,他们不是通过 Mknod 命令创建的,必须是底层软件找到并进行了初始化之后,这些设备才被创建并可用。因此只有当启动了正确设置的以太网设备驱动程序的内核后,才会有/dev/eth0 文件。ARP 协议位于 IP 层和支持地址解析的协议层之间。 (二)Socket 1、套接字简介 套接字(Socket)是网络通信的基本操作单元,它提供了不同主机间进程双向通信的端点,这些进程在通信前各自建立一个 Socket,并通过对 Socket 的读/写操作实现网络通信功能。 套接字分为以下 3 种类型。 1) 字节流套接字 这是最常用的套接字类型,TCP/IP 协议簇中的 TCP(Transport Control Protocol)协议使用此类接口,它提供面向连接的(建立虛电路)、无差错的、发送先后顺序一致的、包长度不限和非重复的网络信包传输。 2) 数据报套接字 TCP/IP 协议族中的 UDP(User Datagram Protocol)协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为 32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。 3) 原始数据报套接字 提供对网络下层通讯协议(如 IP 协议)的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。 2、套接字编程方法 这里将分别介绍面向连接协议的字节流套接字与非连接协议的数据报套接字的编程方法,因原始数据报套接字在实际工作中较少,在此不作讨论。不论何种套接字编程均采用客户机/服务器的协作模式,即由客户进程向服务器进程发出请求,服务器进程执行被请求的任务并将结果返回给客户进程。字节流套接字的服务进程和客户进程在通信前必须建立连接。建立连接及通信的步骤见图 1。 1) 服务进程首先调用 Socket()创建一个字节流套接字,并调用 bind()将服务器地址捆扎在该套接字上,接着调用 listen()监听连接请求 ,随后调用 accept()做好与客户进程建立连接的准备,无连接请求时,服务进程被阻塞;
2) 客户进程调用 Socket()创建字节流套接字,然后调用 connect()向服务进程发出连接请求; 3) 当连接请求到来后,服务进程被唤醒,生成一个新的字节流套接字,并用新套接字同客户进程的套接字建立连接,而服务进程最早生成的套接字则继续用于监听网络上的服务请求; 4) 服务进程和客户进程通过调用 read()和 write()交换数据; 5) 服务进程和客户进程通过调用 close()撤消套接字并中断连接。
数据套接字的服务进程客户进程通信前不必建立连接, 通信的步骤见图 2。 1) 服务进程首先调用 Socket()创建一个数据套接字,并调用 Bind()将服务器地址捆扎在该套接字上,然后调用 Recvfrom()等待客户进程发来的请求; 2) 客户进程在调用 Socket()创建一个数据报套接字后,调用 Bind()将客户机地址捆扎在此套接字上,接着调用 Sendto()向服务进程发送请求,然后调用 Recvfrom()等待服务进程返回该请求的处理结果; 3) 服务进程在执行客户进程所请求的任务后,调用 Sendto()将处理结果返回给客户进程;
4) 服务进程和客户进程通过调用 Close()撤消套接字。
3、套接字编程示例 下面给出一个运用字节流套接字在TCP/IP网络上实现客户机/服务器方式进程通信的实例。在此例中,服务进程先于客户进程运行,当双方建立连接后,服务进程通过该连接向客户进程不断发送一个连续增长的序列数,客户进程每接收到 50 个序列数就在屏幕上显示一个&.&,显示至 20 个点后换行,直至任意一方进程被中断为止。 # include &sys/types.h& # include &sys/socket.h& # include &netinet/in.h& # include &netdb.h& # include &stdio.h& main() { int sock,namelen,seq, struct sockaddr- //存服务器的 internet 地址
char buf[1024]; //创建 internet 域的 TCP 协议的字节流套接字 sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP); if(sock&0) { perror(&socket&); exit(1); } //将本地主机(服务器)的地址捆扎到创建的套接字上 server.sinfamily=AF-INET; //internet 域 sevrer.sinaddr.s-addr=INADDR-ANY; //使用任意合法地址 sevrer.sinport=htons(1032); //公认的服务端口号 if(bind(sock,&server,sizeof(server))&0){ perror(&bind&); exit(2); } //阻塞至客户方有连接请求到来,建立一新套接字用于通信 namelen=sizeof(server); if((msgsock=accept(sock,&server,&namelen))&0){ perror(&accept&); exit(4); } //此时连接已建立,可以进行通信 seq=0; for(;;){ netint=htonl(seq); //主机字节顺序转为网络字节顺序 write(msgsock,&netint,4); //向客户方写序列数 seq++; } } 三、Linux 虚拟环境安装 为了便于程序的开发和测试,本次利用虚拟机软件 VMware 在同一台计算机上安装Linux 操作系统,实现程序开发环境的搭建。 (一)VMware 简介 美国VMware公司推出的虚拟计算平台&&VMware提供了一种在一台计算机上同时运
行各种 Linux 和 Windows 操作系统的具有创新意义的解决方案。VMware 支持的系统包括:各种 Linux 发行版、DOS、Windows 3.1、Windows 95、Windows 98、Windows NT,Windows 2000、Windows Me 以及 FreeBSD 等。 1、VMware 的特点 在本书后续章节中,使用 Guest 来表示 VMware 虚拟的客户机,Guest OS 指运行在虚拟机上的操作系统;Host 指物理存在的计算机,Host OS 指在 Host 上运行的操作系统。例如,在操作系统为 Windows 的计算机上安装了 VMware,并虚拟了 Linux。那么,Host 是安装Windows 的这台计算机,Host OS 是 Windows,虚拟机上运行的 Linux 就是 Guest OS。 VMware 具有以下特点: VMware 为虚拟计算机提供了 BIOS,你可以像对独立的计算机那样更改虚拟机的 BIOS参数设置。可以在窗口模式下运行 Guest,也可以在全屏模式下运行。当你从 Guest OS 切换到 Host OS 屏幕之后,系统将自动保存 Guest OS 上运行的所有任务,以避免由于 Host OS的崩溃而损失 Guest OS 应用程序中的数据。 每一个虚拟机操作系统都是相对独立的,并拥有独立的网络地址。 Guest 和 Host 之间支持 TCP/IP、Novell Netware、Microsoft 虚拟网络以及 Samba 文件共享等协议。4.2 节将详细介绍 Windows Host 与 Linux Guest 之间的文件共享方式。 VMware 支持 Guest OS 和 Host OS 之间以及不同 Guest OS 操作环境下的剪切、复制和粘贴操作。 在硬件方面,VMware 支持 CD-ROM、软驱以及音频的输入输出,从 VMware 2.03 开始增加了对 SCSI 设备、SVGA 图形加速卡以及 ZIP 驱动器的支持。 VMware 窗口提供了打开虚拟机电源、关闭虚拟机电源以及复位键等按钮,这些按钮就如同虚拟机机箱上的按钮一样。例如,对 Windows Guest 来说,如果在运行过程中非正常关机或者 VMware 崩溃,下次启动 Guest 的时候,它会自动进行文件系统的检查和修复。 2、VMware 的运行原理 借助 VMware 提供的虚拟功能,可以在同一个窗口运行多个全功能的操作系统。VMware中的 Guest OS 直接在 X86 保护模式下运行,使所有的虚拟机操作系统就像运行在单独的计算机上一样。 VMware 运行在主机的操作系统之上,它在 Guest OS 与 Host OS 之间加了一层虚拟操作平台(VMware Virtual Platform),对下层的硬件和相关软件进行了虚拟,形成独立的计算机系统,所有的 Guest OS 都运行在一个独立的虚拟计算机之上。 (二)Linux 简介 Linux 是一种自由和开放源代码的类 UNIX 操作系统。定义 Linux 的组件是 Linux 内核,该操作系统内核由林纳斯&托瓦兹在 1991 年 10 月 5 日首次发布。 严格来讲,术语 Linux 只表示操作系统内核本身,但通常采用 Linux 内核来表达该意思。Linux 则常用来指基于 Linux 内核的完整操作系统,包括 GUI 组件和许多其他实用工具。由于这些支持用户空间的系统工具和库主要由理查德&斯托曼于 1983 年发起的 GNU 计划提供,自由软件基金会提议将该组合系统命名为 GNU/Linux。 Linux 最初是作为支持英特尔 x86 架构的个人电脑的一个自由操作系统。目前 Linux 已经被移植到更多的计算机硬件平台,远远超出其他任何操作系统。Linux 是一个领先的操作系统,可以运行在服务器和其他大型平台之上,如大型主机和超级计算机。世界上 500 个最快的超级计算机 90%以上运行 Linux 发行版或变种,包括最快的前 10 名超级电脑运行的都是基于 Linux 内核的操作系统[10]。 Linux 也广泛应用在嵌入式系统上,如手机,平板电脑,
路由器,电视和电子游戏机等。在移动设备上广泛使用的 Android 操作系统就是创建在 Linux内核之上。 Linux 也是自由软件和开放源代码软件发展中最著名的例子。只要遵循 GNU 通用公共许可证,任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。通常情况下,Linux 被打包成供个人计算机和服务器使用的 Linux 发行版,一些流行的主流 Linux 发布版,包括 Debian(及其派生版本 Ubuntu,Linux Mint),Fedora(及其相关版本 Red Hat Enterprise Linux,CentOS)和 openSUSE 等。Linux 发行版包含 Linux 内核和支撑内核的实用程序和库 ,通常还带有大量可以满足各类需求的应用程序。个人计算机使用的 Linux 发行版通常包 X Window 和一个相应的桌面环境,如 GNOME 或 KDE。桌面 Linux 操作系统常用的应用程序,包括 Firefox 网页浏览器,LibreOffice 办公软件, GIMP图像处理工具等。由于 Linux 是自由软件,任何人都可以创建一个符合自己需求的 Linux 发行版。 (三)Linux 虚拟环境安装 1、第一步:安装 VMware 虚拟机,安装过程不再赘述,安装后如图 3 所示。
图 3 VMware 安装截图 2、第二步:安装 Red Hat Linux,安装过程不再赘述,安装后如图 4 所示。
图 4 Linux 安装截图 3、第三步:点击&打开虚拟机电源&,运行 Linux,用 root 登录系统(如图 5 所示),进行 X Windows。
图 5 Linux 登录截图 4、第四步:在 X Windows 下点击左下角的小红帽图标,然后选择&系统工具& - &终端&,打开终端,开始程序编制,如图 6 所示。
图 6 Linux 终端窗口截图 至此 Linux 环境已安装完成,具备程序开发条件。 四、设计过程 (一)服务器端创建监听与文件管理 服务器负责的功能模块主要有两部分,一是对连接进来客户端所有线程的管理和服务器目录下的文件管理;二是创建线程来单独监听客户端的动作。为了便于管理,我们创建两个user.txt 和 client.txt 两个文档来分别负责服务器的连接和客户端的连接。user.txt 中存放了服务器名和密码。client.txt 存放了连接客户端名字和密码。 我们首先对服务器的创建有个监测,即在启动时先核实服务器的所有者 username 和密码 password,将输入的用户、密码与 user.txt 中的用户密码比较,匹配成功则同意启动,否则 return -1 表失败。 接着创建一个socket套接口,绑定Ip设置客户端的最大连接数为10,然后创建一个sever线程来实现对服务器本身监听动作。主体代码见最后 接下来创建线程完成对客户端的监听 监听等待连接:
sockdata = accept(sockfd,(struct sockaddr*)0,(int*)0);
我们定义结构体:
struct client_t
char name[20];
}p_client[10]; 来存放每个客户端的 socket 信息、线程标识、使用号、连接号和客户名。创建线程实现单独监听:
p_client[i].conn_fd =
p_client[i].used =
strcpy(p_client[i].name , client_name);
pthread_create(&p_client[i].tid,NULL,&client_conn,&p_client[i])
接下来是线程 client_conn()的功能,监听客户端的功能完成。 (二)客户端连接与文件传输 在客户端这边我们同样适用了检测机制,运行客户机时要将用户名、密码以及 ip 地址和端口号作为参数输进来,先建立与服务器的连接,然后将用户名和密码发送到服务端检测,如果检测失败则接收到一条拒绝信息,连接断开,如果检测成功则接收到一条确认信息,双方通信开始。 主体代码见最后:
到此为止我们已经实现了服务器和客户端的主体功能,具体代码查看附录文件夹。 五、结果演示
flieA.c 为服务器端程序文件 fileB.c 为客户端程序文件 ZhangBowenTest.txt 为传送文件
六、代码开发 (一)服务器端 #include &sys/types.h& #include &sys/socket.h&
// 包含套接字函数库 编译服务器和客户端源文件 运行服务器端程序,等待文件传诵 运行客户端程序,传送ZhangBowenTest.txt 文件 服务器端程序接收文件
#include &stdio.h& #include &netinet/in.h&
// 包含 AF_INET 相关结构 #include &arpa/inet.h&
// 包含 AF_INET 相关操作的函数 #include &unistd.h& #include&string.h& #include&stdlib.h& #include&fcntl.h& #include&sys/stat.h& #include&dirent.h& #define PORT 9999 #define BUFFSIZE 1000 #define MAXPATH 32 #define LEN sizeof(struct list) int count=0;
//计量歌曲数
//文件总大小 struct list {
char pathname[1024];
char filename[512];
struct list * }; struct list *head,*p1,*p2; void scan_dir(char *dir,int depth)
//定义目录扫描函数 {
struct dirent *
if(!(dp=opendir(dir)))
//puts(&can't open&);
chdir(dir);
//切换到当前目录中去
while((entry=readdir(dp))!=NULL)
lstat(entry-&d_name,&statbuff); //获取下一级成员属性
if(S_IFDIR&statbuff.st_mode)
//判断下一级成员是否是目录
if(strcmp(&.&,entry-&d_name)==0||
strcmp(&..&,entry-&d_name)==0)
//printf(&%*s%s/\n&,depth,&&,entry-&d_name);
scan_dir(entry-&d_name,depth+4);
//调用自身,扫描下一级
l=strlen(entry-&d_name);
if(strcmp(entry-&d_name+l,&.mp3&)==0||
strcmp(entry-&d_name+l,&.MP3&)==0)
char path_buff[MAXPATH];
getcwd(path_buff, MAXPATH);
p1= malloc(LEN);
strcpy(p1-&pathname,path_buff);
strcpy(p1-&filename,entry-&d_name);
//printf(&%s hello %s&,p1-&pathname,p1-&filename);
p1-&next=0;
if(count==1)
head=p2=p1;
p2-&next=p1;
//printf(&hello&);
tem = statbuff.st_
filesize+=
chdir(&..&);
//回到上一级目录
closedir(dp); } int print() {
struct list *
//printf(&......here1&);
if(head!=NULL)
printf(&%s %s\n&,temp-&pathname,temp-&filename);
temp=temp-&
}while(temp!=NULL);
} int main() {
puts(&Scan disk...&);
scan_dir(&/home&,0);
printf(&List output: \n&);
puts(&Scan end\n&);
printf(&Total %d Files\n&,count);
printf(&Total%3.2gMB\n&,filesize/);
int server_sockfd,client_
int server_len,client_
struct sockaddr_in server_sockaddr,client_
server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(PORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
server_len=sizeof(server_sockaddr);
//允许重复使用本地地址和套接字绑定
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
//绑定端口
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1)
perror(&bind:&);
//监听端口
if(listen(server_sockfd,5)==-1)
perror(&listen:&);
printf(&Listening...\n&);
client_len=sizeof(client_sockaddr);
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1)
perror(&accept error:&);
printf(&%sConnect to the server\n&,inet_ntoa(client_sockaddr.sin_addr));
printf(&Ready to send a file...\n&);
pid=fork();
//创建子进程
if(pid==0)
//子进程发送数据
//发送文件数目
countbyte=send(client_sockfd,&count,4,0);
// printf(&countbyte=%d\n&,countbyte);
char fileinfo[100];
//定义文件信息,包括文件路径和文件名
memset(fileinfo,0,100);
char filename[50];
memset(filename,0,50);
struct list *
if(head!=NULL)
printf(&%s %s\n&,temp-&pathname,temp-&filename);
char c[2]={'/'};
strcat(temp-&pathname,c);
strcat(temp-&pathname,temp-&filename);
printf(&temp-&pathname=%s\n&,temp-&pathname);
strcpy(fileinfo,temp-&pathname);
strcpy(filename,temp-&filename);
printf(&fileinfo=%s\n&,fileinfo);
printf(&filename=%s\n&,filename);
int sendbytes=0;
sendbytes=send(client_sockfd,filename,50,0);
printf(&sendbytes=%d\n&,sendbytes);
//发送文件大小
int filesize=0;
lstat(fileinfo,&statbuff);
filesize=statbuff.st_
printf(&filesize =%d\n&,filesize);
sendfsize=send(client_sockfd,&filesize,4,0);
printf(&sendfsize=%d\n&,sendfsize);
char buff[BUFFSIZE];
memset(buff,0,BUFFSIZE);
FILE * fp = fopen(fileinfo,&r&);
if(NULL == fp )
unsigned char filename[50];
unsigned char databuf[1000];
struct sockaddr_in serv_
struct hostent *
int lastsize=0; //
host = gethostbyname(&localhost&);
sockfd=socket(AF_INET,SOCK_STREAM,0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9999);
//serv_addr.sin_addr = *((struct in_addr*)host-&h_addr);
serv_addr.sin_addr.s_addr = inet_addr(IP_ADDR);
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(struct sockaddr))==-1){
perror(&connect&);
//接收文件数目
int count=0;
countbyte=recv(sockfd,&count,4,0);
printf(&File number=i\n&,count);
while(count--)
i=recv(sockfd,filename,sizeof(filename),0);
//接收文件名
printf(&recv %d bytes\n&,i);
printf(&file name=%s\n&,filename);
i=recv(sockfd,&filesize,sizeof(filesize),0);
//接收文件大小
printf(&recv %d bytes\n&,i);
printf(&filesize=%d\n&,filesize);
//文件大小赋给变量
//接收文件内容
FILE *fp = fopen(filename,&w&);
if(NULL == fp )
printf(&File: Can Not Open To Write\n&);
while(lastsize&0)
printf(&lastsize=%d\n&,lastsize);
if(lastsize&sizeof(databuf))
i=recv(sockfd,databuf,sizeof(databuf),0);
printf(&Bytes received i=%d\n&,i);
int write_length = fwrite(databuf,sizeof(char),i,fp);
if (write_length&i)
printf(&File:Write Failed\n&);
if(lastsize&5000) printf(&recv %d bytes\n&,i);
printf(&i'll recv %d byte only\n&,lastsize);
i=recv(sockfd,databuf,lastsize,0);
printf(&Bytes received i=%d\n&,i);
int write_length = fwrite(databuf,sizeof(char),i,fp);
if (write_length&i)
printf(&File:Write Failed\n&);
printf(&*******recv %d bytes\n&,i);
lastsize=lastsize-i;
fclose(fp);
printf(&该文件接收完毕\n&);
return 0; } 七、结束语 通过报告的编制,我一方面是检查了这一个学期来 linux 内核编程学习成果,将《软件综合开发案例教程》的理论知识运用到实践中,另一方面在实践中加深了对理论知识的理解,与此同时够让我认清自己在学习 Socket 编程方面的不足之处和薄弱环节,并加以弥补和巩固,通过对线程同步程序设计,进一步的巩固用 Socket 编程的能力,并且也有利于更好的掌握 C 语言。 我从编程中体会颇多,学到了很多东西,懂得了怎样建立 TCP 套接字以及加锁解锁和
条件变量的作用。也懂得了网络通信中服务器需要循环等待客户端连接进来,然后创立一个单独的线程来监听该客户端的行为动作。同时加强了我对 TCP/IP Socket 编程这门课程的认识,并且也复习了以前学习到的知识,自己的逻辑思维能力也得到了一定的提高。 通过这次程序设计,懂得了理论与实际相结合是很重要的,只有理论是远远不够的,只有把所学的理论知识与实践相结合起来,从理论知识与实践相结合,从理论中得出结论,才是真正的知识,才能提高自己的事迹动手能力和独立思考的能力。 同时,最重要的是在本报告编制过程中, XXX 老师对该报告从选题,构思到最后定稿的各个环节给予细心指引与教导老师对该报告从选题,构思到最后定稿的各个环节给予细心指引与教导 , 使我得以最终完成报告编制。在学习中,您严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范将永远激励着我。在此,谨向您致以衷心的感谢和崇高的敬意!使我得以最终完成报告编制。在学习中,您严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范将永远激励着我。在此,谨向您致以衷心的感谢和崇高的敬意!}

我要回帖

更多关于 udp服务器客户端实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信