嵌入式作业.docx
《嵌入式作业.docx》由会员分享,可在线阅读,更多相关《嵌入式作业.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式作业
1.服务器源代码
#include//基本系统数据类型
#include//提供socket函数及数据结构
#include//标准输入输出
#include//标准库
#include//提供错误号errno的定义,用于错误处理
#include//字符串函数定义
#include//read函数、write函数和getpid函数等头文件
#include//主要是跟网卡和IP地址相关的定义
#include//linux系统定义文件状态所在的伪标准头文件
#include//操作文件描述符的一些特性
#defineSERVPORT2015//端口号
#defineBACKLOG10//最大请求数
#defineMAX_CONNECTED_NC10
#defineMAXDATASIZE32768//缓冲区长度
#defineFILE_NAME_MAX_SIZE512
intmain()
{
structsockaddr_inserver_sockaddr,client01_sockaddr,client02_sockaddr;
intsin_size,shoudaozijieshu;
intserver_fd,client01_fd,client02_fd;
intfile_open,file_write;
charbuf[MAXDATASIZE],temp[MAXDATASIZE],*IP1,*IP2;
char*filename;
if((server_fd=socket(AF_INET,SOCK_STREAM,0))==-1)//建立服务器socket连接
{
perror("socket");
exit
(1);
}
printf("socketsuccess!
\n");
//设置server_sockaddr相关参数
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(SERVPORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
bzero(&(server_sockaddr.sin_zero),8);
//服务器绑定
if(bind(server_fd,(structsockaddr*)&server_sockaddr,sizeof(structsockaddr))==-1)
{
perror("bind");
exit
(1);
}
printf("bindsuccess!
\n");
//服务器监听
if(listen(server_fd,BACKLOG)==-1)
{
perror("listen");
exit
(1);
}
printf("listening...\n");
sin_size=sizeof(structsockaddr);
//等待客户1连接
if((client01_fd=accept(server_fd,(struct
sockaddr*)&client01_sockaddr,&sin_size))==-1)
{
perror("accept:
");
exit
(1);
}
else
{
memset(temp,0,sizeof(temp));
strcpy(temp,"successtologintheserver!
");
//等待客户2连接
if(send(client01_fd,temp,MAXDATASIZE,0)==-1)
{
perror("send");
exit
(1);
}
}
if((client02_fd=accept(server_fd,(structsockaddr*)&client02_sockaddr,&sin_size))==-1)
{
perror("accept:
");
exit
(1);
}
else
{
memset(temp,0,sizeof(temp));//从客户1接收文件内容
strcpy(temp,"successtologintheserver!
");
if(send(client02_fd,temp,MAXDATASIZE,0)==-1)
{
perror("send");
exit
(1);
}
}
memset(temp,0,sizeof(temp));//向客户2转发接收到的内容
strcpy(temp,"Youfriendhason-line,youcansend/acceptnow!
");
if((send(client01_fd,temp,MAXDATASIZE,0)==-1)||(send(client02_fd,temp,MAXDATASIZE,0)==-1))
{
perror("send");
exit
(1);
}
printf("fileuploadserverstarting...\n");
memset(buf,0,sizeof(buf));
if((shoudaozijieshu=recv(client01_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit
(1);
}
printf("buf:
%s\n",buf);
if(send(client02_fd,buf,MAXDATASIZE,0)==-1)
{
perror("send");
exit
(1);
}
printf("fileuploadsuccess!
\n");
close(file_open);
close(server_fd);
2.客户端1源代码
/**************客户端1的程序******************/
#include//标准输入输出
#include//标准库
#include//提供错误号errno的定义,用于错误处理
#include//字符串函数定义
#include//定义了与网络有关的结构,变量类型,宏,函数
#include//基本系统数据类型
#include//主要是跟网卡和IP地址相关的定义
#include//socket相关定义
#include//linux系统定义文件状态所在的伪标准头文件
#include//操作文件描述符的一些特性
#defineSERVPORT2015//端口号
#defineMAXDATASIZE32768//缓冲区长度
intmain(intargc,char*argv[])
{
intclient01_fd,message_send_num,message_recieve_num;
intfile_open,file_read;
charbuf[MAXDATASIZE];
char*filename,*p;
structhostent*host;
structsockaddr_inclient01_sockaddr;
voidmy_recvmsg(intmessage_recieve_num,intclient01_fd,char*buf);
if(argc<2)
{
fprintf(stderr,"pleaseentertheluqj'shostname(IP)!
\n");
exit
(1);
}
if((host=gethostbyname(argv[1]))==NULL)//地址解析函数
{
perror("gethostbyname");
exit
(1);
}
if((client01_fd=socket(AF_INET,SOCK_STREAM,0))==-1)//建立客户1连接
{
perror("socket");
exit
(1);
}
memset(&client01_sockaddr,0,sizeof(client01_sockaddr));
//设置client_sockaddr相关参数
client01_sockaddr.sin_family=AF_INET;
client01_sockaddr.sin_port=htons(SERVPORT);
client01_sockaddr.sin_addr.s_addr=inet_addr(argv[1]);
bzero(&(client01_sockaddr.sin_zero),8);
if(connect(client01_fd,(structsockaddr*)&client01_sockaddr,sizeof(structsockaddr))==-1)
{
perror("connect");
exit
(1);
}//主动发起对服务器的连接请求
printf("startconnecting...\n");
my_recvmsg(message_recieve_num,client01_fd,buf);//接收登入连接信息
my_recvmsg(message_recieve_num,client01_fd,buf);//接收开始聊天信息
filename="/home/luqj/workspace/client01/hello.c";
if((file_open=open(filename,O_RDONLY))==-1)//打开所要发送的文件
{
perror("openwilluploadfile");
exit
(1);
}
memset(buf,0,sizeof(buf));//将所要发送的内容写入buf
if((file_open=read(file_open,buf,MAXDATASIZE))==-1)
{
perror("readwilluploadfile");
exit
(1);
}
printf("%s\n",buf);
//客户1向服务器发送文件内容
if((message_send_num=send(client01_fd,buf,MAXDATASIZE,0))==-1)
{
perror("send");
exit
(1);
}
printf("filehasbeenuploadedsuccessfully!
\n");
close(file_open);
close(client01_fd);
}
voidmy_recvmsg(intmessage_recieve_num,intclient01_fd,char*buf)//接收信息函数
{
memset(buf,0,sizeof(buf));
if((message_recieve_num=recv(client01_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit
(1);
}
else
{
printf("%s\n",buf);
}
}
3.客户端2源代码
/*************************客户端2的程序***************************/
#include//标准输入输出
#include//标准库
#include//提供错误号errno的定义,用于错误处理
#include//字符串函数定义
#include//定义了与网络有关的结构,变量类型,宏,函数
#include//基本系统数据类型
#include//主要是跟网卡和IP地址相关的定义
#include//socket相关定义
#include//linux系统定义文件状态所在的伪标准头文件
#include//操作文件描述符的一些特性
//宏定义
#defineSERVPORT2015//端口号
#defineMAXDATASIZE32768//缓冲区长度
//主函数
intmain(intargc,char*argv[])
{
intclient02_fd;//文件标示符
intmessage_send_num,shoudaozijieshu;
intfile_open,file_write,file_read;
charbuf[MAXDATASIZE];
char*filename,*p;
structhostent*host;
structsockaddr_inclient02_sockaddr;
voidmy_recvmsg(intmessage_send_num,intclient02_fd,char*buf);
if(argc<2)
{
fprintf(stderr,"pleaseentertheluqj’shostname(IP)!
\n");
exit
(1);
}
if((host=gethostbyname(argv[1]))==NULL)//地址解析函数
{
perror("gethostbyname");
exit
(1);
}
/******************************************************
建立客户2连接
AF_INET:
IPv4协议
SOCK_STREAM:
流式socket
0:
原始套接字除外
******************************************************/
if((client02_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit
(1);
}
memset(&client02_sockaddr,0,sizeof(client02_sockaddr));//分配内存
/*****************************************************
设置client_sockaddr相关参数,初始化client02_sockaddr结构体
******************************************************/
client02_sockaddr.sin_family=AF_INET;
client02_sockaddr.sin_port=htons(SERVPORT);
client02_sockaddr.sin_addr.s_addr=inet_addr(argv[1]);
bzero(&(client02_sockaddr.sin_zero),8);
//判断连接成功
if(connect(client02_fd,(structsockaddr*)&client02_sockaddr,sizeof(structsockaddr))==-1)
{
perror("connect");
exit
(1);
}
printf("startconnecting...\n");//主动发起对服务器的连接请求
my_recvmsg(message_send_num,client02_fd,buf);//接收登入连接信息
my_recvmsg(message_send_num,client02_fd,buf);//接收开始聊天信息
filename="/home/luqj/songyb/workspace/client02/rec/Hello.c";//客户2新建文件
/******************************************************************
打开对应路径下的文件,如果没有,则建立改文件。
0644表示文件所有者可读可写,同组用户、其他用户只能读。
*******************************************************************/
if((file_open=open(filename,O_CREAT|O_TRUNC|O_WRONLY,0644))==-1)
{
perror("openlocalhostfile");
exit
(1);
}
memset(buf,0,sizeof(buf));//客户2接收从服务器转发过来的客户1的文件内容
if((message_send_num=recv(client02_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit
(1);
}
printf("buf:
%s\n",buf);
//客户2讲接收到的内容写入新建文件中
if(file_write=write(file_open,buf,sizeof(buf))==-1)
{
perror("writtingtofileerror");
exit
(1);
}
printf("filehasbeenuploadedsuccessfully!
\n");
close(file_open);
close(client02_fd);
}
//接收信息函数
voidmy_recvmsg(intmessage_send_num,intclient02_fd,char*buf)
{
memset(buf,0,sizeof(buf));
if((message_send_num=recv(client02_fd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit
(1);
}
else
{
printf("%s\n",buf);
}
}