




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程名:Linux下c语言编程专业:08嵌入式系统工程 专试验1:Linux系统基本shell指令试验2:gcc编译器与多文件交叉包含试验3:库文件的创建与使用试验4:linux系统程序调试行列式求值程序试验5:进程与线程程序调试试验6:TCP程序与试验7:UDP程序试验1 Linux系统基本shell指令实验一 Linux系统基本文件操作试验目的:掌握Linux系统常见的文件操作指令;掌握Linux系统常见的文件形式;试验设备PC机、虚拟机、redhat9,桌面环境KDE试验原理一、Linux系统常见的文件形式(一)为便于用户识别文件形式,操作系统一般使用扩展名来标示文件类型。文件扩展名是文件名的最后一个点之后的部分(在文件 sneakers.txt 中,“txt”是文件的扩展名)。下面简单列出了一些文件扩展名和它们的含义:1. 压缩的和归档的文件.bz2 使用 bzip2 压缩的文件.gz 使用 gzip 压缩的文件.tar 使用 tar(tape archive,磁带归档的简写)压缩的文件,又称 tar 文件.tbz 用 tar 和 bzip 压缩的文件.tgz 用 tar 和 gzip 压缩的文件.zip 使用 ZIP 压缩的文件,在 MS-DOS 应用程序中常见。多数为 Linux 压缩的文件使用 gzip 压缩,因此 Linux 文件中的 .zip 归档较少见。 2. 文件格式.au 音频文件.gif GIF 图像文件.html/.htm HTML 文件.jpg JPEG 图像文件.pdf 文档的电子映像;PDF 代表 Portable Document Format(可移植文档格式) .png PNG 图像文件(Portable Network Graphic 的简写,可移植网络图形) .ps PostScript 文件,为打印而格式化过的文件.txt 纯 ASCII 文本文件.wav 音频文件.xpm 图像文件3. 系统文件.conf 一种配置文件。配置文件有时也使用 .cfg。 .lock 锁(lock) 文件;用来判定程序或设备是否正在被使用.rpm Red Hat 用来安装软件的软件包管理器文件4. 编程和脚本文件.c C 程序语言的源码文件.cpp C+ 程序语言的源码文件.h C 或 C+ 程序语言的头文件.o 程序的对象文件.pl Perl 脚本.py Python 脚本 .so 库文件.sh shell 脚本 .tcl TCL 脚本文件扩展名不总是被使用或被一致地使用。那么,如果一个文件没有扩展名,或者它与它的扩展名不符时怎么办呢?这个时候,file 命令就会对你有所帮助。譬如,你找到了一个叫做 saturday 的文件,它没有扩展名。使用 file 命令,你就可以判定这个文件的类型: file saturday(二)为便于系统磁盘和文件系统的管理,Linux系统将所有Linux 对目录和设备都当作文件来进行处理,这样就简化了对各种不同类型设备的处理,提高了效率。Linux中主要的文件类型分为4种:普通文件、目录文件、链接文件和设备文件。 (1)普通文件 普通文件如同Windows中的文件一样,是用户日常使用最多的文件。它包括文本文件、shell脚本(shell的概念在第2章会进行讲解)、二进制的可执行程序和各种类型的数据。 (2)目录文件 在 Linux 中,目录也是文件,它们包含文件名和子目录名以及指向那些文件和子目录的指针。目录文件是 Linux 中存储文件名的惟一地方,当把文件和目录相对应起来时,也就是用指针将其链接起来之后,就构成了目录文件。因此,在对目录文件进行操作时,一般不涉及对文件内容的操作,而只是对目录名和文件名的对应关系进行了操作。(3)链接文件 链接文件有些类似于 Windows 中的“快捷方式”,但是它的功能更为强大。它可以实现对不同的目录、文件系统甚至是不同的机器上的文件直接访问,并且不必重新占用磁盘空间。 (4)设备文件 Linux 把设备都当作文件一样来进行操作,这样就大大方便了用户的使用(在后面的Linux编程中可以更为明显地看出)。在 Linux 下与设备相关的文件一般都在/dev目录下,它包括两种,一种是块设备文件,另一种是字符设备文件。 块设备文件是指数据的读写,它们是以块(如由柱面和扇区编址的块)为单位的设备,最简单的如硬盘(/dev/hda1)等。字符设备主要是指串行端口的接口设备。Linux中的文件属性Linux中的文件属性如图如示。首先,Linux中文件的拥有者可以把文件的访问属性设成 3 种不同的访问权限:可读(r)、可写(w)和可执行(x)。文件又有 3 个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)。 第一个字符显示文件的类型: “-”表示普通文件; “d”表示目录文件; “l”表示链接文件; “c”表示字符设备; “b”表示块设备; “p”表示命名管道比如FIFO 文件(First In First Out,先进先出); “f”表示堆栈文件比如LIFO 文件(Last In First Out,后进先出)。 第一个字符之后有3个三位字符组: 第一个三位字符组表示对于文件拥有者(u)对该文件的权限; 第二个三位字符组表示文件用户组(g)对该文件的权限; 第三个三位字符组表示系统其他用户(o)对该文件的权限; 若该用户组对此没有权限,一般显示“-”字符。目录权限和文件权限有一定的区别。对于目录而言,r代表允许列出该目录下的文件和子目录,w代表允许生成和删除该目录下的文件,x代表允许访问该目录二、Linux系统常见文件操作指令(一)DOS 和 Linux 常用命令的对比命令的目的MS-DOSLinuxLinux 的简单实例复制文件Copycpcp thisfile.txt /home/thisdirectory转移文件Movemvmv thisfile.txt /home/thisdirectory列举文件DirlsLs清除屏幕ClsclearClear关闭 shell 提示ExitexitExit显示或设置日期DatedateDate删除文件Delrmrm thisfile.txt把输出“回响”到屏幕上Echoechoecho this message用简单文本编辑器来编辑文件Editgedit(a)gedit thisfile.txt比较文件内容Fcdiffdiff file1 file2在文件中寻找字串Findgrepgrep 词或词组 thisfile.txt格式化软盘format a:(如果软盘是在 A: 中的话)mke2fs 或 mformat(b)/sbin/mke2fs /dev/fd0(/dev/fd0 是 Linux 中与 A: 等同的驱动器)显示命令帮助命令 /?man(c)man 命令创建目录Mkdirmkdirmkdir 目录查看文件Moreless(d)less thisfile.txt重新命名文件Renmv(e)mv thisfile.txt thatfile.txt显示你在文件系统中的位置ChdirpwdPwd用指定的路径(绝对路径,absolute path)来改换目录cd 路径名cd 路径名cd /directory/directory用一个相对路径(relative path)来改换目录cd .cd .cd .显示时间TimedateDate显示已被使用的内存数量MemfreeFree注:a. Gedit 是图形化文本编辑器;你可以使用其它文本编辑器来代替 Gedit,包括 Emacs 和 vi。b. 这个命令为 DOS 文件系统格式化软盘。c. 某些命令你还 可以使用 info。d. more 分页器也可以用来一个屏幕一个屏幕地在文件中逐页查看。e. mv 命令可以转移文件或重新命名在同一目录下的文件。如果你想重新命名文件,如例中所示,把这个文件“转移”到同一目录中的新名称。(二)几点说明1、关于帮助help命令用于查看所有Shell内置命令的帮助信息。用户可以通过该命令寻求Shell命令的用法,只需在所查找的命令后输入help命令,就可以看到所查命令的内容了。 例如:查看cd命令的使用方法。 $ cd -helpman命令用于用于格式化并显示某一命令的联机帮助手册页。格式:man 选项 命令名如果在用户是在纯文本下登录,可能帮助信息显示太快使用户来不及看清,可使用管道连接指令 如 man gcc |less(使用q退出,可按上下箭头查看)2、关于ls指令和创建链接文件的指令默认情况下,系统不显示隐藏文件及文件属性,如果想显示文件的详细信息,可以使用如下命令 ls al链接文件的指令为:ln -S3、系统管理指令显示系统进程的指令:ps关闭进程的指令 kill关闭系统的指令 poweroff用户管理程序 redhat-config-users /KDE/system settings/users and groups系统日志 redhat-logviewer /KDE/system tools/system logs删除自安装文件:(1) 查看当时安装的时候的文件的详细名字 rmp -qa 查看所有安装的文件,也可以在系统日志中查看(2) 删除 rmp -e系统文本登录方式及图形用户方式配置文件/etc/inittab 方式3 命令行登录;方式5 x-window登录从X-Windows退出 ctrl +art+backspace从文本方式进入x-window startx4、文件压缩和归档压缩文件使用较少磁盘空间,并且比未压缩的大文件下载速度要快。在 Red Hat Linux 中,你可以使用的文件压缩工具有:gzip、bzip2、和 zip。推荐你使用 bzip2 压缩工具,因为它提供了最大限度的压缩,并且可在多数类似 UNIX 的操作系统上找到。gzip 压缩工具也可以在类似 UNIX 的操作系统上找到。如果你需要在 Linux 和其它操作系统如 MS Windows 间传输文件,你应该使用 zip,因为该命令与 Windows 上的压缩工具最兼容。压缩工具文件扩展名解压工具Gzip.gzgunzipbzip2.bz2bunzip2Zip.zipunzip试验2:makefile创建与使用试验目的:1、掌握桌面环境KDE的基本使用方法2、掌握KDE代码编辑器kwrite的基本使用方法3、掌握多源文件编译链接的方式4、掌握makefile的写法试验原理(1)多源文件编译链接的方式编译:狭义的编译是指将高级语言代码翻译成汇编代码;汇编:狭义的汇编是将汇编代码翻译成二进制(机器语言代码)代码,对于出现子程序调用的语句,如果该函数是主文件外部实现的,则在主文件汇编的时候,该调用并不真正去实现该调用。链接:将各个函数的实现文件所汇编成的机器码和主程序链接到一起。形成最终的可执行文件。头文件功能:函数类型声明,全局结构体声明,宏声明。(2)makefile的写法依赖关系:依赖关系主要靠表达符号“:”表示,含义指冒号左侧的符号依赖右侧的符号,或由右侧的符号生成。命令规则:命令规则的第一个符号为TAB符号,一般为编译汇编指令(gcc)或其他shell指令。当命令规则上面的一条依赖文件出现更新时,系统将执行本行代码(3)试验过程使用编辑器kwrite创建相关源文件,各个源文件代码如下:/main.c#include mytool1.h#include mytool2.h#include int main(void)putchar(n);mytool1_print(hello);mytool2_print(hello);return 0;/mytool1.c#include void mytool1_print(char *psz)printf(this is mytool1 print:%sn,psz);/mytool1.hvoid mytool1_print(char *);/mytool2.c#include void mytool2_print(char *psz)printf(this is mytool2 print:%sn,psz);/mytool2.hvoid mytool2_print(char *);/makefilemain:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c -g main.cmytool1.o:mytool1.c mytool1.hgcc -c -g mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c -g mytool2.c试验报告要求写出各个源文件试验3:linux系统程序调试行列式求值程序试验目的:掌握使用gdb调试程序的方法试验器材:PC机器、redhat9,kde试验原理(1)程序可以被调试的原因程序编译的时候,使用特殊的指令在目标文件之间加入特殊的信息,建立程序目标码和程序源代码之间的联系,调试程序利用这些信息控制程序的流程,帮助程序员分析程序实际执行过程与程序员设计执行过程之间的联系,进而找出程序的错误。(2)调试程序的流程1、编程程序的时候使用-g指令,生成调试版程序;2、在gdb中调入调试版程序;3、在程序的起始位置加入断点 break main4、运行程序5、使用step指令,next指令单步运行程序,使用continue指令运行到程序的下一个断点,使用display,print指令查看和更改变量的数值,分析程序的实际运行过程和设计过程之间的差别。(3)要调试程序如下:#include stdio.h#include time.h#define MUCH_ZEROtypedef int Type;Type* JZyzs(Type *b,Type *a,int nn,int i,int j ) int m,n,N=nn-1; for(m=0; mi; m+) for(n=0; nj; n+) bm*N+n=am*nn+n; for(; nN; n+) bm*N+n=am*nn+n+1; for(; mN; m+) for(n=0; nj; n+) bm*N+n=am*nn+nn+n; for(; nN; n+) bm*N+n=am*nn+nn+n+1; return b;Type HLSabsDigui(Type *a, unsigned int n) unsigned int i,j,k; Type T=0,t; Type *p=NULL; if(n=1) return (*a)*n; p=(Type*) malloc(sizeof(Type)*(n-1)*(n-1); if(!p) puts(Err); return 0; for(i=0,t=1; in; i+,t*=-1) JZyzs(p,a,n,0,i); #ifdef MUCH_ZERO if(ai) #endif T+=(HLSabsDigui(p,n-1)*t*ai); free(p); return T;int main() Type a400=8,1,-5,1,9,-3,0,-6,-5,2,-1,2,0,4,-7,6; int n=4; clock_t start ,end; clrscr(); start=clock(); printf(n# %dn,HLSabsDigui(a,n); end=clock(); printf(%lfn%fn,(end-start)/CLK_TCK,(end-start)/CLK_TCK); getch();试验报告要求:单步运行程序,分析程序执行过程,写出程序流程图试验4 进程与线程程序调试试验目的:通过程序清晰进程与线程的概念;试验器材:PC机、redhat9 ,kde试验过程(1)进程程序如下:#include #include #include int main(void)pid_t pid;unsigned long i;int j=printf(ju bu bian liangn);for(i=0;i100000000;i+) ;if (pid=fork()0)printf(fork error!n);exit(1);else if(pid=0)printf(Child process is printing.n);elseprintf(Parent process is printing.n);exit(0);提示:调节循环次数,使循环次数接近系统默认时间片轮转时间,查看父进程和子进程不同次序的输出情况。(2)线程线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。使用多线程的理由之一是和进程相比,它是一种非常节俭的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种昂贵的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。下面我们先来尝试编写一个简单的多线程程序。2 简单的多线程编程Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序example1.c。 /* example.c*/#include #include void thread(void)int i;for(i=0;i3;i+)printf(This is a pthread.n); int main(void)pthread_t id;int i,ret;ret=pthread_create(&id,NULL,(void *) thread,NULL);if(ret!=0)printf (Create pthread error!n);exit (1);for(i=0;i3;i+)printf(This is the main process.n);pthread_join(id,NULL);return (0); 我们编译此程序:gcc example1.c -lpthread -o example1试验报告要求;写出进程和线程的调试程序试验5:库文件的创建与使用试验目的:掌握库文件工作的原理,库文件的创建和使用方法试验器材:试验原理:一、为什么要使用库文件我们在实际编程工作中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码。比如,很多项目里都有一个用户验证的功能。代码段如下: /UserLogin.h文件,提供函数声明 int IsValidUser(char* username, int namelen); /UserLogin.c文件,实现对用户信息的验证 int IsValidUser(char* username, int namelen) int IsValid = 0; /*下面是具体的处理代码,略去*/ return IsValid 如果每个项目都保存着这两个UserLogin.h和UserLogin.c文件,会有以下几个弊端: 1、每个项目里都有重复的模块,造成代码重复。 2、代码的重用性不好,一旦IsValidUser的代码发生了变化,为了保持设计的一致性,我们还要手工修改其他项目里的UserLogin.c文件,既费时又费力,还容易出错。 库文件就是对公共代码的一种组织形式。 为了解决上面两个弊端,就提出了用库文件存放公共代码的解决方案,其要点就是把公共的(也就是可以被多次复用的)目标代码从项目中分离出来,统一存放到库文件中,项目要用到这些代码的时候,在编译或者运行的时候从库文件中取得目标代码即可。库文件又分两种:静态库和动态库。二、静态库与动态库 如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代码,就成为动态库。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。 静态库的原则是“以空间换时间”,增加程序体积,减少运行时间; 动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。 下面我们就以实际例子来看看如何使用这两种库.三、静态库的编写和使用1、概述 静态库文件的扩展名一般为.a,其编写步骤很简单。编写函数代码编译生成各目标文件用ar文件对目标文件归档,生成静态库文件。 注意归档文件名必须以lib打头。 使用要点: 在gcc 的-I参数后加上静态库头文件的路径。 在gcc 的-L参数后加上库文件所在目录 在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名。 比如库文件名是libtest.a 那么参数就是 -l test2、编写最简单的静态库文件 编写如下两个文件,注意放在同一目录中 myalib.h /静态库头文件 myalib.c /静态库实现文件 /myalib.h 文件的内容void test();/myalib.c 文件的内容#inlcude void test() printf(testn);3、制作库文件生成目标文件gcc -c myalib.c执行完后会生成一个myalib.o文件用ar命令归档,格式为ar -rc 再次提醒,归档文件名一定要以lib打头, .a结尾。ar -rc libtest.a myalib.o执行完后会生成一个libtest.a文件4、使用库文件 编写一个测试程序main.c,内容为/main.c 测试静态库调用的程序#include myalib.h /要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv) test(); return 0; 编译目标文件,注意要把静态库头文件的路径加到-I参数里面 gcc -I /root/exercise -o main.o -c main.c现在生成了一个main.o文件生成可执行文件,注意要把静态库文件的路径加到-L参数里面,把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面。如下面所示gcc -o main -L/root/exercise main.o -ltest此时就会生成一个名为main的可执行文件另外,注意- l参数好象应该加到输入文件名的后面,否则会报错。比如gcc -o main -L/root/exercise -ltest main.o就会提示main.o(.text+0x11): In function main: : undefined reference to test collect2: ld returned 1 exit status执行可执行文件查看效果 执行./main, 输出 test 说明执行成功。四、动态库的编写1、概述 动态库一般以.so结尾,就是shared object的意思. 其基本生成步骤为 编写函数代码 编译生成动态库文件,要加上 -shared 和 -fpic 选项 , 库文件名以lib开头, 以.so 结尾。 使用方式分为两种: 隐式调用和显示调用 隐式调用类似于静态库的使用,但需修改动态链接库的配置文件/etc/ld.so.conf; 显示调用则是在主程序里使用dlopen、dlsym、dlerror、dlclose等系统函数。 具体的调用方式会在 五、动态库的调用 中详细说明.2、编写最简单的动态库文件 为了便于对照, 我们仍然采用静态库中的文件做例子. 编写如下两个文件,注意放在同一目录中 myalib.h /静态库头文件 myalib.c /静态库实现文件 /myalib.h 文件的内容void test();/myalib.c 文件的内容#inlcude void test() printf(testn);3、编译生成动态库 ,库文件名以lib开头, 以.so 结尾。gcc -fpic -shared -o libtest.so myalib.c此时就生成一个libtest.so文件五、动态库的隐式调用隐式调用的含义是代码里不出现库文件名,就是说这个代码和调用静态库的代码是类似的。1、编写测试文件/main.c 测试动态库隐式调用的程序#include myalib.h /要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv) test(); return 0; 2、 编译测试程序,与静态库类似,要把头文件的路径加到-I参数里面gcc -I /root/exercise -o main.o -c main.c现在生成了一个main.o文件3、连接生成测试程序 gcc -o main -L/root/exercise main.o -ltest现在生成了一个main文件4、执行测试程序./main此时出现提示 ./main: error while loading shared libraries: libtest.so: cannot open shared object file: No uch file or directory。 这个原因就是程序运行时并不知道动态库所在的路径,因此自然找不到。 解决这个问题的办法有三种。见下节六、使动态库被系统共享的三种办法 (再次说明: 本节参考了计算机世界网雨亦奇的文章LINUX动态链接库高级应用 地址/htm/center/prog/02_3_13_3_2.asp) (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库 建立连接(硬连接或符号连接均可,常用符号连接).这里说的系统共享目录, 指的是LINUX动态链接库存放的目录,包括 /lib,/usr/lib以及/etc/ld.so.conf文件内所列的一系列目录.(2)将动态链接库所在目录名追加到动态链接库配置文件/etc/ld.so.conf中.# pwd /etc/ld.so.conf# ldconfig此时再执行main,即可成功.(3)利用动态链接库管理命令ldconfig,强制其搜索指定目录,并更新缓存文件,便于动态装入.# ldconfig pwd试验6:TCP程序与UDP程序试验目的:掌握TCP程序和UDP程序的不同编写方法试验器材:PC机器、redhat9,KDE试验原理:TCP服务器端的编写步骤: 1. 首先,你需要创建一个用于通讯的套接口,一般使用socket调用来实现。这等于你有了一个用于通讯的电话:) 2. 然后,你需要给你的套接口设定端口,相当于,你有了电话号码。这一步 一般通过设置网络套接口地址和调用bind函数来实现。 3. 调用listen函数使你的套接口成为一个监听套接字。 以上三个步骤是TCP服务器的常用步骤。4. 调用accept函数来启动你的套接字,这时你的程序就可以等待客户端的连接了。 5. 处理客户端的连接请求。 6. 终止连接。 现在让我们来看看网络程序客户端的编程步骤:1. 和服务器的步骤一样。 2. 通过设置套接口地址结构,我们说明,客户端要与之通讯的服务器的IP地址和端口。 3. 调用connect函数来连接服务器。 4. 发送或者接收数据,一般使用send和recv函数调用来实现。 5. 终止连接。Tcp程序如下:int main(int argc,char *argv) int listensock,connsock; /定义两个socket套接字,一个用于监听,一个用于通讯struct sockaddr_in serveraddr; /定义网络套接字地址结构const char buff = Hello! Welcome here!rn; /定义要发送的数据缓冲区; listensock = socket(AF_INET,SOCK_STREAM,0); /创建一个套接字,用于监听 bzero(&serveraddr,sizeof(servaddr); /地址结构清零 serveraddr.sin_family = AF_INET; /指定使用的通讯协议族serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /指定接受任何连接,因为服务器不知道谁会要求连接 serveraddr.sin_port = htons(5000); /指定监听的端口bind(listensock,(sockaddr *)&serveraddr,sizeof(serveraddr); /给套接口邦定地址 listen(listensock,1024); /开始监听 connsock = accept(listensock,(sockaddr *)NULL, NULL); /建立通讯的套接字,accept函数,等待客户端程序使用connect函数的连接send(connsock,buff,sizeof(buff), 0); /向客户端发送数据 close(connsock); /关闭通讯套接字 close(listensock); /关闭监听套接字这是客户端的程序: int main(int argc,char *argv) char recvbuff100; /定义要接收的数据缓冲区int sockfd; /定义一个socket套接字,用于通讯struct sockaddr_in serveraddr;/定义网络套接字地址结构if(argc != 2) printf(Usage: echo ip地址); exit(0); sockfd = socket(AF_INET,SOCK_STREAM,0); /创建一个套接字bzero(&serveraddr,sizeof(serveraddr);serveraddr.sin_family = AF_INET; /指定使用的通讯协议族 serveraddr.sin_port = htons(5000);/指定要连接的服务器的端口 inet_pton(AF_INET, argv1, &serveraddr.sin_addr);connect(sockfd,(sockaddr *)&serveraddr,sizeof(serveraddr); /连接服务器recv(sockfd,recvbuff,sizeof(recvbuff),0); /接收服务器的数据printf(%sn,recvbuff); /打印接收到的数据close(sockfd); /关闭套接字udp程序如下:int port = 5500;void main()int sockfd; int count = 0;int flag;char buf80;struct sockaddr_in address; sockfd = socket(AF_INET, SOCK_DGRAM, 0); /看到不同的地方了吗?memset(&address, 0, sizeof(address);address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr();address.sin_port = htons(port); flag = 1; dosprintf(buf,Packet %dn, count);if(count 30) sprintf(buf,overn); flag = 0; sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address, sizeof(address); / 发现了吗使用的函数不一样,它也是发送数据 count+; while (flag); 这是接收数据的程序: char *hostname = ; /这个特殊的ip表示本的计算机 void main() int sinlen; int port =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黑龙江省齐齐哈尔市梅里斯区2024-2025学年八年级下学期期末考试语文试题(含解析)
- 社区消防员安全知识培训课件
- 项目聘用 长期合同范本
- 与焊接厂合同范本
- 看仓库人员合同范本
- 12333劳动合同范本
- 房屋全款转让合同范本
- 厂房代理合同范本
- 购买建材石材合同范本
- 蔬菜店经营合同范本
- 2025劳动合同范本【模板下载】
- 以课程标准为导向:上海市初中信息科技教学设计的探索与实践
- 2025年公共基础知识考试试题(附完整答案)
- 北川羌族自治县农业农村局北川羌族自治县测雨雷达建设项目环评报告
- 2025社区工作者必考试题库(含答案)
- 友邦资讯面试题目及答案
- 2025年山东青岛海关缉私局辅警招聘考试笔试试卷【附答案】
- 2025年社区工作者考试真题库及答案
- 飞灰处置再生资源化利用项目可行性研究报告模板-立项备案
- 2025年中国药典试题及答案
- 昆明一中实验班数学试卷
评论
0/150
提交评论