试验项目1综述_第1页
试验项目1综述_第2页
试验项目1综述_第3页
试验项目1综述_第4页
试验项目1综述_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验项目 1 Linux 开发环境及网络编程基础实验编号: CS06083011.1 实验目的本次实验的主要目的是在于帮助学生熟悉 Linux 平台的开发环境, 了解 Linux 的套接字 基本编程方法及 API 。本课程是在 Linux 环境下进行的,因此需要学生对 Linux 的基本操作 环境和基本命令有所了解,并在能够操作的基础上完成对通信小程序的编写。1.2 实验内容1 、编写两个通用过程 connectSock 及 passiveSock ,放于文件 sockutil.c 中;2、使用 TCP协议编写通信小程序,客户机向服务器发送连接请求( 请求信息任意 ),服务器返回客户机的进程

2、pid 信息。客户机进程通过服务器进程 fork 产生;编写 makefile 进行编译运行。1.3 实验基础知识1 、 TCP/IP 协议提供了传输数据的基本机制,允许程序员在两个应用程序之间建立通信 并传递数据。2 、 Linux 提供系统函数对设备或文件进行I/O 操作: open close read writelseek ioctl等。如: desc = open (filename ”, O-RDWR, 0);read (desc, buffer, 128);close(desc);3 、套接字 API应用程序使用open 来创建文件描述符;使用 socket 创建套接字描述符。类

3、属地址结构:地址族,该族中的端点地址)socket 用法: retcode =socket( family, type, protocol ); 回该套接字的整数描述符。用于创建套接字,返Family int PF-INET(TCP/IP)Type int SOCK-STREAM(TCP)SOCK-DGRAM(UDP)返回值: 成功 描述符失败 -1 errno 记录错误代码4 、消息传递基本操作: send , receive.信道:可靠信道, 不可靠信道。通信方式: 面向连接,非连接。面向连接的消息传递: connect , disconnect .5 、客户 / 服务器范型:最常用的网络

4、应用范型服务器进程:角色 - 服务提供者,被动等待服务请求的到达。客户进程:角色 - 客户,主动向服务器发出请求,并等待服务器的响应。6 、连接请求 connect用法: retcode = connect( socket, addr, addrlen);Addr &sockaddr-in返回值: 成功 0失败 -17 、绑定本地地址 bind用法: recode= bind( socket, localaddr, addrlen );localaddr &sockaddrIP 地址参数和端口值的含义:IP 地址 端口 含义INADDR_ANY内核选择 IP 地址和端口INADDR_ANY非0

5、内核选择IP ,应用确定端口本地 IP 0应用确定IP ,内核选择临时端口本地 IP非0应用选择IP 和端口8 、并发进程Fork 函数:将运行的程序分为两个几乎完全一样的进程。描述:用户执行该并行程序, OS创建一个含单线程的进程执行代码; 当线程执行到 fork 调用时, OS复制进程,在新进程中创建一个线程,并让原来的线程和新创建的线程继续执 行。虽然一个进程可以包含多个线程, fork 调用新创建的进程都是单线程的。操作系统 shell 在执行一个命令时只创建一个进程, 而该进程也只启动一个线程执行命令除非程序员 明确创建了多个线程,否则每个进程都是单线程的。由 fork 创建的进程与

6、原进程不同: 作为函数的 fork 向调用者返回一个值。 在新创建的 进程里, fork 返回零;在原进程里, fork 返回一个小整数标识新进程;这个返回值称为进 程标识符或进程 id 。在原来的进程和新创建的进程里, fork 所返回的值是不同的;并发程 序利用这个区别让新进程执行与原来进程不一样的代码。9 、 Makefile 文件描述了整个工程的编译、连接等规则。为工程编写 Makefile 的好处 是能够使用一行命令来完成“自动化编译” 。简单 makefile 脚本格式:目标 : 源命令1.4 实验步骤1 、进入 Linux 编程环境;下载 putty 软件并按以下步骤登录远程主机

7、。1) 运 行 put ty 就 可 以 看 到 如 下 界 面(2)在 Host Name 里输入 IP 地址 49.123.81.251 ,并选择 SSH协议。点击 Open。(3)输入所登录的主机的用户名和密码, 即可进入 Linux 系统。( 提示:输 入密码时光标不会发生变化,输入完毕后按回车即可 )2、在当前环境下创建保存本次试验内容的文件夹。( 1)执行命令 mkdir first 创建目录( 2)执行命令 ls 列出当前存在的目录,若有 first 存在,则创建成功( 2)执行命令 cd first 进入创建的目录3、通过 nano 编辑器创建 sockutil.c 文件,编写

8、通用过程 connectSock 及 passiveSock 代码并保存。执行命令 nano sockutil.c 创建 sockutil.c 文件并进入编辑环境。 (提示:退出 nano 编辑器的方式为【 Ctrl 】+X,并按下 Y即可保存修改,按下 N则为不保存,直接退出)示例代码如下: #include sockutil.h #include #include #include #include #include #include int connectSock( char* host, char * service, char* protocol) structhostent*pHo

9、st;structservent*pServ;structprotoent*pProto;structsockaddr_inaddr;ints,type;memset(&addr,0, sizeof (addr);addr.sin_family=AF_INET;if (pHost=gethostbyname(host)!=NULL) memcpy(&addr.sin_addr,pHost-h_addr,pHost-h_length);else if (addr.sin_addr.s_addr=inet_addr(host)=INADDR_NONE) errexit( cant get %s h

10、ost entry ,host);if (pServ=getservbyname(service,protocol)!=NULL) addr.sin_port=pServ-s_port;else if (addr.sin_port=htons( unsigned short )atoi(service)=0) errexit( cant get %s service entry ,service);if (pProto=getprotobyname(protocol)=0)errexit( cant get %s protocol entry ,protocol);if (strcmp(pro

11、tocol, tcp )=0)type=SOCK_STREAM;elsetype=SOCK_DGRAM;s=socket(PF_INET,type,pProto-p_proto);if (s0)errexit( cant create socket );if (connect(s,( struct sockaddr*)&addr, sizeof (addr)s_port;else if (addr.sin_port=htons( unsigned short )atoi(service)=0) errexit( cant get %s service entry,service);if (pP

12、roto=getprotobyname(protocol)=0)errexit( cant get %s protocol entry,protocol);if (strcmp(protocol, tcp )=0) type=SOCK_STREAM;elsetype=SOCK_DGRAM; s=socket(PF_INET,type,pProto-p_proto); if (s0)errexit( cant create socket);if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&reuses,izeof (int )0) errexit( setsoc

13、kopt err );if (bind(s,( struct sockaddr*)&addr, sizeof (addr)0) errexit( cant bind to %s port,service);if (type=SOCK_STREAM & listen(s,qlen)0)errexit( cant to listen on %s port,service);return s;void errexit( char * fmt,.)va_list arg_ptr; va_start(arg_ptr,fmt);vfprintf(stderr,fmt,arg_ptr);fprintf(st

14、derr, :%s.n ,strerror(errno); va_end(arg_ptr);exit(errno);4、通过 nano 编辑器编写头文件 sockutil.h.执行命令 nano sockutil.h 创建 sockutil.h 文件 示例代码如下:#ifndef SOCKUTIL_H#define SOCKUTIL_H#include #include #include #include #include #ifndef INADDR_NONE#define INADDR_NONE 0xFFFFFFFF#endifint connectSock( char* host, ch

15、ar * service, char* protocol);int passiveSock( char* service, char* protocol, int qlen);void errexit( char * fmt,.);#endif5、通过 nano 编辑器编写 main.c 文件,实现客户机向服务器发送连接请求 ( 请求 信息任意 ) ,服务器返回客户机的进程 pid 信息。客户机进程通过服务器进程 fork 产生。执行命令 nano main.c 命令,创建 main.c 文件。 示例代码如下:#include #include #include #include #inclu

16、de #include sockutil.h#define BUFSIZE 30int main()int sock,serverSock,clientSock;struct sockaddr_in addr;char bufBUFSIZE=0;int n;pid_t pid;socklen_t len= sizeof ( struct sockaddr_in); sock=passiveSock( 8999 , tcp ,10);if (pid=fork()0)if (write(STDOUT_FILENO,buf,n)0)errexit( write err );if (n0)errexi

17、t( recv err );elseserverSock=accept(sock,( struct sockaddr*)&addr,&len); sprintf(buf, ChildPid=%dn ,pid);send(serverSock,buf, sizeof (buf),0);close(serverSock);wait(NULL);exit(0);6. 通过 nano 编辑器编写 makefile 文件,对已编写完成的代码进行编译运行。 执行命令 nano makefileMakefile 代码示例如下:OBJ=main.o sockutil.omain:$OBJgcc $OBJ -o

18、 main / 在 gcc 命令前加 Tabclean:rm -rf $OBJ / 在 rm 命令前加 Tab简要说明: Makefile 文件描述了整个工程的编译、连接等规则。为工程编写 Makefile 的好处是能够使用一行命令来完成“自动化编译” 。OBJ为定义的一个 变量, gcc 命令为编译变量 OBJ中的文件, -o 用来设置编译后的输出文件名称。 rm 命令用来删除指定的文件或目录 -r 表明同时删除目录下的所有子目录, -f 表明强行删除文件或目录,不提示任何信息。7:显示实验结果执行命令: make main 对文件进行编译。执行命令: ./main 运行文件显示实验结果。实验结果即为输出当前的 Childpid 号8. 保存文件并退出。执行 exit 命令注销当前用户。1.5 实验验收方式1、实验课签到为实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论