linux网络编程课程教学设计Word格式.docx

上传人:b****6 文档编号:19233626 上传时间:2023-01-04 格式:DOCX 页数:14 大小:367.87KB
下载 相关 举报
linux网络编程课程教学设计Word格式.docx_第1页
第1页 / 共14页
linux网络编程课程教学设计Word格式.docx_第2页
第2页 / 共14页
linux网络编程课程教学设计Word格式.docx_第3页
第3页 / 共14页
linux网络编程课程教学设计Word格式.docx_第4页
第4页 / 共14页
linux网络编程课程教学设计Word格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

linux网络编程课程教学设计Word格式.docx

《linux网络编程课程教学设计Word格式.docx》由会员分享,可在线阅读,更多相关《linux网络编程课程教学设计Word格式.docx(14页珍藏版)》请在冰豆网上搜索。

linux网络编程课程教学设计Word格式.docx

列出客户端当前目录的内容(3)、quit离开

4.2服务器端

(1)、分析请求代码。

(2)、根据请求代码做相应的处理

(3)、等待返回结果或者应答信息

五、软件测试结果

六、部分主代码

#include"

ftserve.h"

intmain(intargc,char*argv[])

{

intsock_listen,sock_control,port,pid;

if(argc!

=2){

printf("

usage:

./ftserveport\n"

);

exit(0);

}

port=atoi(argv[1]);

//createsocket

if((sock_listen=socket_create(port))<

0){

perror("

Errorcreatingsocket"

exit

(1);

}

while

(1){//waitforclientrequest

//createnewsocketforcontrolconnection

if((sock_control=socket_accept(sock_listen))<

0)

break;

//createchildprocesstodoactualfiletransfer

if((pid=fork())<

0){

perror("

Errorforkingchildprocess"

}elseif(pid==0){

close(sock_listen);

ftserve_process(sock_control);

close(sock_control);

exit(0);

}

close(sock_control);

close(sock_listen);

return0;

}

/**

*Sendfilespecifiedinfilenameoverdataconnection,sending

*controlmessageovercontrolconnection

*Handlescaseofnullorinvalidfilename

*/

voidftserve_retr(intsock_control,intsock_data,char*filename)

FILE*fd=NULL;

chardata[MAXSIZE];

size_tnum_read;

fd=fopen(filename,"

r"

if(!

fd){

//senderrorcode(550Requestedactionnottaken)

send_response(sock_control,550);

}else{

//sendokay(150Filestatusokay)

send_response(sock_control,150);

do{

num_read=fread(data,1,MAXSIZE,fd);

if(num_read<

0){

printf("

errorinfread()\n"

}

//sendblock

if(send(sock_data,data,num_read,0)<

0)

perror("

errorsendingfile\n"

}while(num_read>

0);

//sendmessage:

226:

closingconn,filetransfersuccessful

send_response(sock_control,226);

fclose(fd);

*Sendlistoffilesincurrentdirectory

*overdataconnection

*Return-1onerror,0onsuccess

intftserve_list(intsock_data,intsock_control)

{

FILE*fd;

intrs=system("

ls-l|tail-n+2>

tmp.txt"

if(rs<

fd=fopen("

tmp.txt"

"

fd){

/*Seektothebeginningofthefile*/

fseek(fd,SEEK_SET,0);

send_response(sock_control,1);

//starting

memset(data,0,MAXSIZE);

while((num_read=fread(data,1,MAXSIZE,fd))>

if(send(sock_data,data,num_read,0)<

err"

memset(data,0,MAXSIZE);

fclose(fd);

send_response(sock_control,226);

//send226

*Opendataconnectiontoclient

*Returns:

socketfordataconnection

*or-1onerror

intftserve_start_data_conn(intsock_control)

charbuf[1024];

intwait,sock_data;

//Waitforgo-aheadoncontrolconn

if(recv(sock_control,&

wait,sizeofwait,0)<

Errorwhilewaiting"

return-1;

//Getclientaddress

structsockaddr_inclient_addr;

socklen_tlen=sizeofclient_addr;

getpeername(sock_control,(structsockaddr*)&

client_addr,&

len);

inet_ntop(AF_INET,&

client_addr.sin_addr,buf,sizeof(buf));

//Initiatedataconnectionwithclient

if((sock_data=socket_connect(CLIENT_PORT_ID,buf))<

returnsock_data;

*Authenticateauser'

scredentials

*Return1ifauthenticated,0ifnot

intftserve_check_user(char*user,char*pass)

charusername[MAXSIZE];

charpassword[MAXSIZE];

char*pch;

charbuf[MAXSIZE];

char*line=NULL;

size_tlen=0;

intauth=0;

.auth"

if(fd==NULL){

filenotfound"

}

while((num_read=getline(&

line,&

len,fd))!

=-1){

memset(buf,0,MAXSIZE);

strcpy(buf,line);

pch=strtok(buf,"

"

strcpy(username,pch);

if(pch!

=NULL){

pch=strtok(NULL,"

strcpy(password,pch);

//removeendoflineandwhitespace

trimstr(password,(int)strlen(password));

if((strcmp(user,username)==0)&

&

(strcmp(pass,password)==0)){

auth=1;

}

free(line);

returnauth;

/**

*Loginconnectedclient

intftserve_login(intsock_control)

charuser[MAXSIZE];

charpass[MAXSIZE];

memset(user,0,MAXSIZE);

memset(pass,0,MAXSIZE);

memset(buf,0,MAXSIZE);

//Waittorecieveusername

if((recv_data(sock_control,buf,sizeof(buf)))==-1){

recverror\n"

inti=5;

intn=0;

while(buf[i]!

=0)

user[n++]=buf[i++];

//tellclientwe'

rereadyforpassword

send_response(sock_control,331);

//Waittorecievepassword

i=5;

n=0;

=0){

pass[n++]=buf[i++];

return(ftserve_check_user(user,pass));

*Waitforcommandfromclientand

*sendresponse

*Returnsresponsecode

intftserve_recv_cmd(intsock_control,char*cmd,char*arg)

intrc=200;

charbuffer[MAXSIZE];

memset(buffer,0,MAXSIZE);

memset(cmd,0,5);

memset(arg,0,MAXSIZE);

//Waittorecievecommand

if((recv_data(sock_control,buffer,sizeof(buffer)))==-1){

strncpy(cmd,buffer,4);

char*tmp=buffer+5;

strcpy(arg,tmp);

if(strcmp(cmd,"

QUIT"

)==0){

rc=221;

}elseif((strcmp(cmd,"

USER"

)==0)||(strcmp(cmd,"

PASS"

)==0)||

(strcmp(cmd,"

LIST"

RETR"

)==0)){

rc=200;

}else{//invalidcommand

rc=502;

send_response(sock_control,rc);

returnrc;

*Childprocesshandlesconnectiontoclient

voidftserve_process(intsock_control)

intsock_data;

charcmd[5];

chararg[MAXSIZE];

//Sendwelcomemessage

send_response(sock_control,220);

//Authenticateuser

if(ftserve_login(sock_control)==1){

send_response(sock_control,230);

}else{

send_response(sock_control,430);

while

(1){

//Waitforcommand

intrc=ftserve_recv_cmd(sock_control,cmd,arg);

if((rc<

0)||(rc==221)){

if(rc==200){

//Opendataconnectionwithclient

if((sock_data=ftserve_start_data_conn(sock_control))<

close(sock_control);

exit

(1);

//Executecommand

if(strcmp(cmd,"

)==0){//Dolist

ftserve_list(sock_data,sock_control);

}elseif(strcmp(cmd,"

)==0){//Doget<

filename>

ftserve_retr(sock_control,sock_data,arg);

//Closedataconnection

close(sock_data);

}

七、设计总结

通过本次的linux程序与设计课程设计让我们学会使用linux系统和socket,极大的丰富了linux系统下编程和网络方面的知识,锻炼了动手能力,为以后的工作学习打下了坚实的基础。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1