Linux环境下基于TCPIP及Socket技术的远程文件传送控制编程报告

上传人:简****9 文档编号:25482373 上传时间:2021-07-25 格式:DOCX 页数:23 大小:357.39KB
返回 下载 相关 举报
Linux环境下基于TCPIP及Socket技术的远程文件传送控制编程报告_第1页
第1页 / 共23页
Linux环境下基于TCPIP及Socket技术的远程文件传送控制编程报告_第2页
第2页 / 共23页
Linux环境下基于TCPIP及Socket技术的远程文件传送控制编程报告_第3页
第3页 / 共23页
点击查看更多>>
资源描述
Linux环境下基于TCP/IP及Socket技术的远程文件传送控制编程报告2013年5月Linux环境下基于TCP/IP及Socket技术的远程文件传送控制编程报告目录一、编程目的3二、通信原理3(一)TCP/IP 3(二)Socket 4三、Linux虚拟环境安装 7(一)VMware 简介7(二)Linux 简介8(三)Linux虚拟环境安装9四、设计过程11(一)服务器端创建监听与文件管理 11(二)客户端连接与文件传输 12五、结果演示12六、代码开发13(一)服务器端13(二)客户端18七、结束语20第23页共21页这次程序设计的目标是在以Linux为内核的操作系统下,实现多线程文件传输系统功能模块。系统模块分为服务器和客户端两部分,客户端实现对文件的上传、下载和查看服务器默认路径下的文件列表;服务器可以对文件进行管理操作,包括创建、删除和重命名等。多线程文件传输是一种一对多或者多对多的关系,一般是一个服务器对应着多个客户端。客户端通过socket连接服务器,服务器要为客户端创建一个单独进程(线程)监听每个客户端的请求。创建好连接之后文件就可以通过流的形式传输。linux内核中为我们提供了两种不同形式的读写流,包括 read()、write()和send()、recv()。客户机对文件的查看指令也是通过流传 递给服务器,服务器根据请求类型返回不同相应流。根据socket原理和特点绘画出链接流程图,将客户机与服务器的相互通信划分为不同的模块,每个模块负责独立的功能项。服务器输入指令管理目录下的文件,create filename是创建文件命令,rename oldname newname是删除文命令,delete filename是删除文件命令, 同时监听着客户端的请求;客户端向服务器发送上传、下载和查看请求,从而得到不同的相 应,包括将文件下载到当前路径下,从当前路径下上传文件给服务器,列出服务器的文件列表。:、通信原理Linux是计算机使用的主流操作系统之一,TCP/IP是广为应用的互联网协议,Linux为TCP/IP网络编程提供了一种网络进程通信机制:套接字接口 (Sockets Interface) o以下将介绍Linux环境下套接字的基本概念及编程技术,并结合实例说明在Linux下如何用套接字实现客户机/服务器方式的进程通信。(一)TCP/IPTCP/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报头中,设有一个“协议”域 (Protocol)。通过该域的值,即可判明其上层协议类型。传 输层与网络层在功能上的最大区别是前者提供进程通信能力,而后者则不能。在进程通信的意义上,网络通信的最终地址不仅仅是主机地址,还包括可以描述进程的某种标识符。为此,TCP/UDP提出了协议端口 (Protocol Port)的概念,用于标识通信的进程。例如, Web服务器 进程通常使用端口 80,在/etc/services文件中有这些注册了的端口地址。对于TCP传输,传输节点问先要建立连接,然后通过该连接传输已排好序的报文,以 保证传输的正确性。IP层中的代码用于实现网际协议,这些代码将IP头增加到传输数据中,同时也把收到的IP报文正确地转送到 TCP层或UDP层。TCP是一个面向连接协议,而UDP 则是一个非面向连接协议,当一个UDP报文发送出去后,Linux并不知道也不去关心他是否成功地到达了目的主机。IP层之下,是支持所有 Linux网络应用的网络设备层,例如:点到点协议(Point to Point Protocol , PPP却以太网层。网络设备并非总代表物理设备,其中有 一些(例如回送设备)则是纯粹的软件设备,网络设备与标准的Linux设备不同,他们不是通过Mknod命令创建的,必须是底层软件找到并进行了初始化之后,这些设备才被创建并可 用。因此只有当启动了正确设置的以太网设备驱动程序的内核后,才会有 /dev/eth0文件。 ARP协议位于IP层和支持地址解析的协议层之间。(二)Socket1、套接字简介套接字(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)服务进程和客户进程通过调用5)服务进程和客户进程通过调用read()和write()交换数据;close()撤消套接字并中断连接。阻塞直到俵收到客户连楂请求协洞连接数据 (请求)敝据f响应)结束连倭图1面向连接协议的字节流套接字调用数据套接字的服务进程客户进程通信前不必建立连接,通信的步骤见图2。1)服务进程首先调用Socket()创建一个数据套接字,并调用Bind()将服务器地址捆扎在该套接字上,然后调用Recvfrom()等待客户进程发来的请求;2)客户进程在调用 Socket()创建一个数据报套接字后, 调用Bind()将客户机地址捆扎在 此套接字上,接着调用 Sendto()向服务进程发送请求,然后调用 Recvfrom()等待服务进程返 回该请求的处理结果;3)服务进程在执行客户进程所请求的任务后,调用Sendto()将处理结果返回给客户进程;Close()撤消套接字。4)服务进程和客户进程通过调用数据(请求)数据响应图2非连接协议的报套接字调用3、套接字编程示例下面给出一个运用字节流套接字在TCP/IP网络上实现客户机/服务器方式进程通信的实例。在此例中,服务进程先于客户进程运行,当双方建立连接后, 服务进程通过该连接向客户进程不断发送一个连续增长的序列数,客户进程每接收到50个序列数就在屏幕上显示一个.,显示至20个点后换行,直至任意一方进程被中断为止。# include # include # include # include # include main() int sock,namelen,seq,netint;struct sockaddr-in server;存服务器的internet地址 char msgsock;char buf1024;创建internet域的TCP协议的字节流套接字sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP);if(sock0) 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) 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所示。Unux formlTSO - W,ar* W-orklNtion文件旧嘛S旧ftSM 直投叫MbD(W)常览时.国叩,霾is E出口国国i全国楣电拦芋 LiriiiX for fYilJSCI“已打开电源际突由 Red Hart Enterprise Urn.Linux for ml7501?K5:美萌通堤住和宫,RiJ Kst l.inru15.DA99 Fr* Ln :h皿(如1竟人费科1触目,胡究生-北上大、和腐缺软件审用桢泳【.如d Hit Urm.pmIKX:Yorkst.liun 5.x虚狙.机I打开读虚版如比理般旋密自1也机受方口 自用*C珀前LfF2M MZEfJ1a就他用爸音P.祜捺存在使用俞名直道U. plp4cai-L使用俞名哲道U.PLPCM L注杼在这里为谈虚限机片人.母图3 VMware安装截图2、第二步:安装 Red Hat Linux ,安装过程不再赘述,安装后如图4所示。图4 Linux安装截图3、第三步:点击“打开虚拟机电源”,运行Linux,用root登录系统(如图5所示),进彳X X Windows。Linux -formlTSO - VMufflr* WrksHtionI 口 1a图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线程来实现对服务器本身监听动作。主体代码见最后接下来创建线程完成对客户端的监听监听等待连接:while(1) sockdata = accept(sockfd,(struct sockaddr*)0,(int*)0);我们定义结构体:struct client_tpthread_t tid;int conn_fd;int used;char name20;p_client10;来存放每个客户端的socket信息、线程标识、使用号、连接号和客户名。创建线程实现单独监听:p_clienti.conn_fd = sockdata;p_clienti.used = i;strcpy(p_clienti.name , client_name);pthread_create(&p_clienti.tid,NULL,&client_conn,&p_clienti)接下来是线程client_conn()的功能,监听客户端的功能完成。(二)客户端连接与文件传输在客户端这边我们同样适用了检测机制,运彳T客户机时要将用户名、密码以及ip地址和端口号作为参数输进来,先建立与服务器的连接,然后将用户名和密码发送到服务端检测, 如果检测失败则接收到一条拒绝信息,连接断开,如果检测成功则接收到一条确认信息,双方通信开始。主体代码见最后:到此为止我们已经实现了服务器和客户端的主体功能,具体代码查看附录文件夹。五、结果演示r 1筑列27iwirh 怕 J曰*运行服务器端程序,等待文件传诵文件编辐()(V)终端CD 转到帮助01)root19 rgtj# ./fiJeA.out Scan d i $k. List ou I put: Sran enda a t t t sTOTOfiE 打开 保存 rifti Ittifl#inchjde It include tfimcliidc Oinc ludeZhingBcwFnTeu-BJ.其$”/0tkeLh mm)燃& aifitV? 怦器用D 转建房 帮附IV reotrhll i)S Jfi MH.out ZhinkucnTtiE. rki l-i Ie nunfar- II rc irhld r im i J A |操作的函效/运行客户端 程序,传送 ZhangBowen Test.txt 文件nllractroar Jr h J?!Q Xnl/iik-Ajre呼曲六、代码开发(一)服务器端#include #include /包含套接字函数库A#include #include / 包含 AF_INET 相关结构#include / 包含 AF_INET 相关操作的函数#include #include#include#include#include#include#define PORT 9999#define BUFFSIZE 1000#define MAXPATH 32#define LEN sizeof(struct list)int count=0;/计量歌曲数double filesize;文件总大小struct list char pathname1024;char filename512;struct list *next;struct list *head,*p1,*p2;void scan_dir(char *dir,int depth)/定义目录扫描函数DIR *dp;struct dirent *entry;struct stat statbuff;int l;if(!(dp=opendir(dir) /puts(cant open);return;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) continue;printf(%*s%s八n,depth,entry-d_name);scan_dir(entry-d_name,depth+4);调用自身,扫描下一级 else l=strlen(entry-d_name); l-=4;if(strcmp(entry-d_name+l,.mp3)=0|strcmp(entry-d_name+l,.MP3)=0) char path_buffMAXPATH;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; count+;if(count=1) head=p2=p1;else p2-next=p1; /p2=p2-next; p2=p1; /printf(hello); int tem;tem = statbuff.st_size; filesize+=tem; chdir(.);回到上一级目录closedir(dp); int print() struct list *temp; temp=head; /printf(here1);if(head!=NULL) do printf(%s %sn,temp-pathname,temp-filename);temp=temp-next;while(temp!=NULL);return ;int main()puts(Scan disk.);scan_dir(/home,0);printf(List output: n);print();puts(Scan endn);printf(Total %d Filesn,count);printf(Total%3.2gMBn,filesize/1024/1024);int server_sockfd,client_sockfd;int server_len,client_len;struct sockaddr_in server_sockaddr,client_sockaddr;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);/允许重复使用本地地址和套接字绑定int j=1;setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j);/绑定端口if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)=-1)perror(bind:);exit(1);监听端口if(listen(server_sockfd,5)=-1)perror(listen:);exit(1);printf(Listeningn);pid_t pid;client_len=sizeof(client_sockaddr);while(1)if(client_sockfd=accept(server_sockfd,(structsockaddr*)&client_sockaddr,&client_len)=-1) perror(accept error:);exit(1);printf(%sConnect to the servern,inet_ntoa(client_sockaddr.sin_addr);printf(Ready to send a filen);pid=fork();创建子进程if(pid=0)子进程发送数据发送文件数目int countbyte;countbyte=send(client_sockfd,&count,4,0);/ printf(countbyte=%dn,countbyte);char fileinfo100;定义文件信息,包括文件路径和文件名memset(fileinfo,0,100);char filename50;memset(filename,0,50);struct stat statbuff;struct list *temp;temp=head;if(head!=NULL)do / printf(%s %sn,temp-pathname,temp-filename);char c2=/;strcat(temp-pathname,c);strcat(temp-pathname,temp-filename);/ printf(temp-pathname=%sn,temp-pathname);strcpy(fileinfo,temp-pathname);strcpy(filename,temp-filename);printf(fileinfo=%sn,fileinfo);/ printf(filename=%sn,filename);int sendbytes=0;sendbytes=send(client_sockfd,filename,50,0); printf(sendbytes=%dn,sendbytes);发送文件大小int filesize=0;int sendfsize;lstat(fileinfo,&statbuff);filesize=statbuff.st_size;printf(filesize =%dn,filesize);sendfsize=send(client_sockfd,&filesize,4,0);/ printf(sendfsize=%dn,sendfsize);char buffBUFFSIZE;memset(buff,0,BUFFSIZE);FILE * fp = fopen(fileinfo,r);if(NULL = fp ) printf(File:Not Foundn); else int file_block_length = 0;while( (file_block_length = fread(buff,sizeof(char),BUFFSIZE,fp)0) / printf(file_block_length = %dn,file_block_length);if(send(client_sockfd,buff,file_block_length,0)next;while(temp!=NULL); printf(Files sent Overn);/end of child processif(pid0)close(client_sockfd); /end of while(1)(二)客户端#include #include #include #include #include #include #include #include #include #include #define IP_ADDR ”127.0.0.1int main()unsigned char filename50;int filesize;unsigned char databuf1000;int sockfd;struct sockaddr_in serv_addr;/ struct hostent *host;int i;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);exit(1);接收文件数目int count=0;int countbyte;countbyte=recv(sockfd,&count,4,0);printf(File number=in,count);while(count-)i=recv(sockfd,filename,sizeof(filename),0);/ printf(recv %d bytesn,i);printf(file name=%sn,filename);i=recv(sockfd,&filesize,sizeof(filesize),0);/ printf(recv %d bytesn,i);printf(filesize=%dn,filesize);lastsize=filesize;接收文件内容FILE *fp = fopen(filename,w);if(NULL = fp )printf(File: Can Not Open To Writen); exit(1);i=0;while(lastsize0)接收文件名接收文件大小/文件大小赋给变量printf(lastsize=%dn,lastsize);if(lastsizesizeof(databuf) i=recv(sockfd,databuf,sizeof(databuf),0); printf(Bytes received i=%dn,i);int write_length = fwrite(databuf,sizeof(char),i,fp); if (write_lengthi)printf(File:Write Failedn); break;/ if(lastsize5000) printf(recv %d bytesn,i); else printf(ill recv %d byte onlyn,lastsize); i=recv(sockfd,databuf,lastsize,0);printf(Bytes received i=%dn,i); int write_length = fwrite(databuf,sizeof(char),i,fp);if (write_lengthi) printf(File:Write Failedn); break;/ printf(*recv %d bytesn,i); lastsize=lastsize-i; fclose(fp);printf(该文件接收完毕n); return 0;七、结束语通过报告的编制,我一方面是检查了这一个学期来linux内核编程学习成果,将软件综合开发案例教程 的理论知识运用到实践中,另一方面在实践中加深了对理论知识的理解,与此同时够让我认清自己在学习Socket编程方面的不足之处和薄弱环节,并加以弥补和巩固,通过对线程同步程序设计,进一步的巩固用Socket编程的能力,并且也有利于更好的掌握C语言。我从编程中体会颇多,学到了很多东西,懂得了怎样建立TCP套接字以及加锁解锁和条件变量的作用。也懂得了网络通信中服务器需要循环等待客户端连接进来,然后创立一个单独的线程来监听该客户端的行为动作。同时加强了我对TCP/IP Socket编程这门课程的认识,并且也复习了以前学习到的知识,自己的逻辑思维能力也得到了一定的提高。通过这次程序设计, 懂得了理论与实际相结合是很重要的, 只有理论是远远不够的, 只 有把所学的理论知识与实践相结合起来, 从理论知识与实践相结合, 从理论中得出结论, 才 是真正的知识,才能提高自己的事迹动手能力和独立思考的能力。同时,最重要的是在本报告编制过程中,XXX老师对该报告从选题,构思到最后定稿的各个环节给予细心指引与教导,使 我得以最终完成报告编制。在学习中,您严谨的治学态度、丰富 渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不 倦的师者风范将永远激励着我。在此,谨向您致以衷心的感谢和 崇高的敬意!
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 其他分类 > 其它学术


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!