资源描述
滨江学院
课程设计报告
题 目 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 <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#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("%s\n",mes);
}
}
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="127.0.0.1";
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)
{
fprintf(stderr,"Usage:%s \a\n",argv[0]);
exit(1);
}
if((host=gethostbyname(strhost))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
/* 客户程序开始建立 sockfd 描述符 */
printf("正在建立套接口...\n");
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(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)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/* 连接成功了 */
printf("链接服务器成功\n欢迎来到聊天室!\n");
printf("请输入你的用户昵称:\n");
scanf("%s",clientname);
printf("请输入登录密码:\n");
scanf("%s",password);
printf("\n登陆成功");
// write(sockfd,clientname,sizeof(clientname));
printf("\n开始聊天@(\"Quit\"断开连接)\n\n");
thr_id = pthread_create(&p_thread, NULL, recvfromserver, NULL);
while(1)
{
memset(buffer,0,sizeof(buffer));
memset(mes,0,sizeof(mes));
scanf("%s",buffer);
strcat(mes,clientname);
strcat(mes,":");
strcat(mes,buffer);
// printf("main thread %s\n",mes);
if((write(sockfd,mes,sizeof(mes)))==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
if(strcmp(buffer,"Quit")==0)
{
break;
}
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
(2)服务器代码
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#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("%d,%d\n",index,client[index]);
if(nbytes>0)
{
buffer[nbytes]='\0';
printf(" %s\n",buffer);
outindex=0;
while(outindex<maxi)
if(write(client[outindex++],buffer,sizeof(buffer))==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
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[]="Hello! Are You Fine?\n";
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,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
/* 服务器端开始建立 socket 描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
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)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
printf("服务器监听端口%d...\n",PORT);
/* 监听 sockfd 描述符 */
if(listen(sockfd,LISTENQ)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
thr_id = pthread_create(&p_thread, NULL, recvandsend, NULL);
printf("欢迎来到聊天室!!!\n");
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
if(maxi>=20)
{
printf("以达到人数上线\n");
continue;
}
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
/*fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));*/
client[maxi++]=new_fd;
printf("\n新用户进入聊天室%d\n",new_fd-3);
}
close(sockfd);
exit(0);
}
4调试分析与测试结果
1.Server端
打开server端
2.客户端打开,新用户登录并输入了地址,昵称
3. 服务端显示
4. 客户端显示
第二个用户登录
四 课程设计总结
通过本次试验,我了解了网络通信的基本知识,同时对于Linux中网络通信编程也有了初步的了解,实验过程中基本理解了网络通信中服务器端、客户端的工作过程。这次试验主要是在Linux环境下完成的,所以操作的并不是非常的顺利,平时还需要多做此方面的练习。
展开阅读全文