Linux课程设计

更新时间:2024-06-22 22:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

滨江学院

课程设计报告

题 目 Linux 课程设计

院 系 计 算 机 系 专 业 软 件 工 程 学生姓名 学 号 20112344

2014年6月11日

一、 Shell编程题

(1) 编写一个shell脚本,求费波纳奇数列的前20项及总和。

程序源码如下:

运行结果如图:

(2) 在根目录下有四个文件 m1.txt,m2.txt,m3.txt,m4.txt,用 Shell 编程,实现自动 创建 m1,m2,m3,m4

四个目录,并将 m1.txt,m2.txt,m3.txt,m4.txt 四个文件分别拷贝到各自相应的目录下。

程序运行之前目录结果如下:

程序源码如下:

运行之后目录结构如下:

(3) 编写shell程序,使得使用者输入一个文档名,做出以下判断:

a) 这个文件是否存在,若不存在则给予一个“Filename does not exist”的信息,并中断程序; b) 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regular file”或“Filename is

directory”;

c) 判断一下,运行者的身份对这个文件或目录所拥有的权限,并输出权限数据! 输入一个不存在的目录结果如下:

程序源码如下:

输入一个已存在的目录,得到权限信息如下:

(4) 设计一个shell程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范

围的数据,n和m都是整数。即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如: $cuts 11 14

This is a test of cuts program (键盘输入) test (显示结果)

程序源码如下:

程序运行结果如下:

二、

Linux下C语言程序设计—课程设计

1.课题简介

基于Socket和多线程编程的聊天程序实现,网络聊天程序设计非常复杂,允许多个人同时聊天更加需要多线程技术的支持,请实现一个简单的多线程网络聊天程序模拟。

2设计概要

2.1 设计思路分析

1.在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多人生活中必不可少的一部分,基于这样的需求,出现了许多网络聊天通信工具,像QQ,MSN等等,但是人们已经不再满足于单一的两个人之间的聊天,而是对多人同时聊天产生了兴趣,于是出现了网络聊天室,不同地方的人可以在那个虚拟的聊天室里面热烈聊天。基于这样的想法,我们用shell编程设计一个多人同时聊天的小程序,用Socket编程实现网络通讯,面向连接的,采用多线程的实现技术。

2. 在程序中,可以设置加入连接的最大数目,通过更改IP地址和端口号,成为不同的客户端,与服务器端连接,进行多用户聊天。

2,2 概要设计

该网络聊天程序大致分为三个主要部分:客户端、服务器端和用户图形界面。各个部分的初步设计思想、流程及存储结构如下:

1.程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。

1.打开Socket 2,命名 3.监听端口 4.建立连接 5.接收消息 6.关闭连接 7.打开Socket 8.打开Socket 8.连接服务器 9.收发消息 10。关闭连接

2. 客户端功能模块

客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。

(1)连接服务器

连接服务器之前需要解析服务器地址,创建套接字,设置相关参数。

2)发送功能

3. 服务器端功能模块(Server)

服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

3.代码实现

(1)客户端代码

#include #include #include #include #include #include #include #include

#define TRUE 1 #define PORT 1000

static int sockfd;

void recvfromserver() //接受服务器消息线程入口函数 { char mes[1024]; int nbytes=0;

while(1) { memset(mes,0,sizeof(mes)); nbytes=read(sockfd,mes,sizeof(mes)); if(nbytes>0) { mes[nbytes]='\\0'; printf(\

}

}

pthread_exit(NULL);

}

int main(int argc, char *argv[]) {

// int sockfd; char buffer[1024];

struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char *strhost=\ char clientname[20]; char password[20]; char mes[1024];

int thr_id; /* thread ID for the newly created thread */

pthread_t p_thread; /* thread's structure */

if(argc!=1) { }

if((host=gethostbyname(strhost))==NULL) { }

/* 客户程序开始建立 sockfd 描述符 */ printf(\正在建立套接口...\\n\

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { }

/* 客户程序填充服务端的资料 */ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT);

server_addr.sin_addr=*((struct in_addr *)host->h_addr); printf(\套接口创建成功,正在链接服务器...\\n\/* 客户程序发起连接请求 */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { }

/* 连接成功了 */

printf(\链接服务器成功\\n欢迎来到聊天室!\\n\printf(\请输入你的用户昵称:\\n\scanf(\printf(\请输入登录密码:\\n\scanf(\

fprintf(stderr,\exit(1);

fprintf(stderr,\exit(1);

fprintf(stderr,\exit(1);

fprintf(stderr,\exit(1);

printf(\登陆成功\

// write(sockfd,clientname,sizeof(clientname)); }

(2)服务器代码 #include #include #include #include #include #include #include

thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL); while(1) { }

/* 结束通讯 */ close(sockfd); exit(0);

memset(buffer,0,sizeof(buffer)); memset(mes,0,sizeof(mes)); scanf(\ strcat(mes,clientname); strcat(mes,\strcat(mes,buffer);

if((write(sockfd,mes,sizeof(mes)))==-1) { }

if(strcmp(buffer,\{ }

break;

fprintf(stderr,\exit(1);

printf(\开始聊天@(\\\断开连接)\\n\\n\

// printf(\

#include

#define MAXLINE 1000 //在一条消息中最大的输出字符数 #define LISTENQ 20 //最大监听队列 #define PORT 1000 //监听端口

#define MAXFD 20 //最大的在线用户数量 void *get_client(void *); int sockfd,i;

static int maxi=0;//maxi表示当前client数组中最大的用户的i值 static int client[MAXFD];

void recvandsend(void) //监听转发线程入口函数 {

int index=0; int nbytes=0; char buffer[1024]; int len; int outindex=0; while(1) {

if(maxi>0) {

memset(buffer,0,sizeof(buffer)); nbytes=0;

//index++;

nbytes=read(client[index++],buffer,sizeof(buffer)); printf(\if(nbytes>0) {

buffer[nbytes]='\\0'; printf(\outindex=0;

while(outindex

if(write(client[outindex++],buffer,sizeof(buffer))==-1) {

fprintf(stderr,\exit(1);

//

}

}

}

if(index>=maxi)

index=0;

}

pthread_exit(NULL);

}

int main(int argc, char *argv[]) {

// int client_fd[LISTENQ],clientnum=0;; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber;

char hello[]=\

int thr_id; /* thread ID for the newly created thread */ pthread_t p_thread; /* thread's structure int new_fd=0;

memset(client,0,sizeof(client)); if(argc!=1) { fprintf(stderr,\ exit(1);

}

/* 服务器端开始建立 socket 描述符 */

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,\ exit(1);

}

/* 服务器端填充 sockaddr 结构 */

bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(PORT);

*/ }

/* 捆绑 sockfd 描述符 */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { }

printf(\服务器监听端口%d...\\n\/* 监听 sockfd 描述符 */ if(listen(sockfd,LISTENQ)==-1) { }

thr_id = pthread_create(&p_thread, NULL, recvandsend, NULL); printf(\欢迎来到聊天室!!!\\n\while(1) { }

close(sockfd); exit(0);

/* 服务器阻塞,直到客户程序建立连接 */ if(maxi>=20) { }

sin_size=sizeof(struct sockaddr_in);

if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) { }

/*fprintf(stderr,\client[maxi++]=new_fd;

printf(\新用户进入聊天室%d\\n\

fprintf(stderr,\exit(1);

printf(\以达到人数上线\\n\continue;

fprintf(stderr,\exit(1);

fprintf(stderr,\exit(1);

4调试分析与测试结果

1.Server端

打开server端

2.客户端打开,新用户登录并输入了地址,昵称

3.服务端显示

4.客户端显示

第二个用户登录

四 课程设计总结

通过本次试验,我了解了网络通信的基本知识,同时对于Linux中网络通信编程也有了初步的了解,实验过程中基本理解了网络通信中服务器端、客户端的工作过程。这次试验主要是在Linux环境下完成的,所以操作的并不是非常的顺利,平时还需要多做此方面的练习。

本文来源:https://www.bwwdw.com/article/qhf3.html

Top