嵌入式大作業(yè)_第1頁
嵌入式大作業(yè)_第2頁
嵌入式大作業(yè)_第3頁
嵌入式大作業(yè)_第4頁
嵌入式大作業(yè)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式實驗報告班級:14級移動一班 學號:1415925655 姓名:蔣浩 題目:一:實現(xiàn)三個客戶端,分別簡稱客戶端1,客戶端2,客戶端3.客戶端1實現(xiàn)向服務器發(fā)送字符串“name”客戶端2實現(xiàn)向服務器發(fā)送字符串“class”客戶端3實現(xiàn)向服務器發(fā)送字符串“id”實現(xiàn)一個服務器程序,要求該服務器程序采用并發(fā)機制處理客戶端發(fā)送過來的數(shù)據(jù),具體要求如下:服務器收到客戶端1發(fā)送的字符串“name”后,給客戶端1回復“蔣浩”服務器收到客戶端2發(fā)送的字符串“class”后,給客戶端2回復“14級移動一班”服務器收到客戶端2發(fā)送的字符串“id”后,給客戶端2回復“1415925655”二:三個客戶端分別收

2、到服務器回復的數(shù)據(jù)后完成以下操作:1:客戶端1把服務器回復的數(shù)據(jù)“蔣浩”傳遞給客戶端2,然后等待客戶端2發(fā)送信號SIGUSR1,如果客戶端1收到該信號,則客戶端1打印“client over”字符串后結束2:客戶端2收到客戶端1的數(shù)據(jù)后,給客戶端1發(fā)送信號SIGUSR1,然后,客戶端2把字符串“蔣浩-14級移動一班1415925655”發(fā)送給客戶端3,發(fā)送成功后結束。3:客戶端3收到數(shù)據(jù)后把字符串“蔣浩-14級移動一班1415925655”寫入到文件蔣浩-14級移動一班1415925655.txt文件中思路:(1):客戶端與服務器間通信:程序通過socket編程實現(xiàn),socket是在用戶應用層

3、和 TCP/IP協(xié)議通信層間的封裝接口,簡化操作,讓用戶通過socket來實現(xiàn) 2層間的操作,組織數(shù)據(jù) 。 服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監(jiān)聽(listen),調(diào)用accept阻塞,等待客戶端連接。 在這時如果有個客戶端初始化一個Socket,然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。 客戶端發(fā)送數(shù)據(jù)請求,服務器端接收請求并處理請求,然后把回應數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),最后關閉連接,一次交互結束。 Linux網(wǎng)絡通信通過套接字來進行編程的.程序通過socket和其它幾個API的調(diào)用,會返回一個 通訊的文件描

4、述符也就是socket,我們可以將這個描述符看成普通的文件的描述符來操作,這就是linux的設備無關性的好處我們可以通過向描述符讀寫操作實現(xiàn)網(wǎng)絡之間的數(shù)據(jù)交流.(2):客戶端之間通信兩個客戶端之間通信使用有名管道通信,管道通信是一個進程打開寫端,一個進程打開讀端,然后才可以進行通信。如果只打開有名管道的一端系統(tǒng)則會阻塞打開進程,知道有另外一個進程打開該管道的另一端,當前進程繼續(xù)執(zhí)行;客戶端1把服務器回復的數(shù)據(jù)名字傳遞給客戶端2,等待接受客戶端2發(fā)送的信號,如果客戶端1收到信號則結束,客戶端1是以只讀方式打開管道,然后寫入管道,客戶端2以寫的方式打開管道,接收到信息,然后客戶端2以kill命令發(fā)

5、送信號kill(pid,SIGUSR1以告訴客戶端1打印結束命令;客戶端2收到客戶端1的數(shù)據(jù)后,給客戶端1發(fā)送“SIGUSR1”信號,然后,客戶端2把字符串姓名和學號發(fā)送給客戶端3,發(fā)送成功后結束,客戶端2和3之間的通信仍然是管道通信,由于客戶端3還要將收到的信息存入文本文件,所以客戶端3以讀寫的方式打開管道進行通信open;最后客戶端3將信息寫入到文本文件使用:write原理:首先知道有三個客戶端,一個服務器,所以服務器要采用并發(fā)式服務器才能接受多個客戶端的連接請求(1) 服務器設計思路:命令行參數(shù)設計為了動態(tài)在命令行參數(shù)中輸入端口,但命令行參數(shù)是字符串,端口是int型,所以要轉(zhuǎn)化一下Int

6、 main(int argc,char * argv)Main()函數(shù)設計一個結構體存儲客戶端的信息Struct userChar20 name;/客戶端名稱Char100 message;/客戶端發(fā)送的消息Int fd;/客戶端的套接字文件描述符由于要同時處理多個連接請求的服務器程序,該程序定義一個int client3;用來存儲客戶端連接的套接字描述符數(shù)組,初始化客戶端連接描述符的值都為-1,代表空閑,當一個客戶端的發(fā)送連接請求時,從client數(shù)組中找到一個值為-1(空閑)的來處理該客戶端的連接請求While()Client0=accept();/找到一個空閑套接字Client0=1;/

7、該套接字被占用/針對當前套接字創(chuàng)建一個線程,對當前套接字的消息進行處理 pthread_create(malloc(sizeof(pthread_t),NULL,(void*)(&message_deal),(void*)connfdi);線程體函數(shù)Void message_deal(int fd)While()recv(connectfd,recvbuf,1000,0)/接收客戶端發(fā)來的send(connectfd,user_news,strlen(user_news)+1,0);/向客戶端回復數(shù)據(jù)要實現(xiàn)以下服務器回復客戶端消息的功能.服務器收到客戶端1發(fā)送的字符串“name”后,給

8、客戶端1回復“蔣浩”服務器收到客戶端2發(fā)送的字符串“class”后,給客戶端2回復“14級移動一班”服務器收到客戶端2發(fā)送的字符串“id”后,給客戶端2回復“1415925655”我采用的是服務器收到客戶端發(fā)來的消息后用if()語句檢查一下消息內(nèi)容是什么?如果是”name” 回復 “蔣浩”等等.(2) 客戶端設計思路:Main()函數(shù)在主函數(shù)中創(chuàng)建一個線程,主線程用來接收服務器回復的數(shù)據(jù),新的線程用來向服務器發(fā)送數(shù)據(jù)/創(chuàng)建發(fā)送消息的線程,調(diào)用了發(fā)送消息的函數(shù)send_message pthread_create(&thread1,NULL,(void*)(&send_messa

9、ge),NULL); while(1)/把經(jīng)服務器處理后的消息打印出來 recv(ld,buff,1000,0) 發(fā)送消息線程void send_message()While(1)send(ld,news,strlen(news)+1,0);遇到的困難:第一部分在完成的時候沒有困難,就是客戶端和服務器通信,在第二部分中開始不知道客戶端進程之間怎么進行通信,為了實現(xiàn)兩個毫不相關的進程間通信,上網(wǎng)查了一些方法方法一:有名管道方法二:消息隊列1:服務器回復的數(shù)據(jù)“蔣浩”客戶端2客戶端12:發(fā)送SIGUSR1信號客戶端33:把字符串“蔣浩-14級移動一班”發(fā)送給客戶端3解決方法:1:客戶端1->

10、客戶端2 采用消息隊列2:客戶端2->客戶端3采用有名管道在客戶端2和客戶端3之間加入有名管道進行通信int fd2; mode_t mode = O_NONBLOCK; / if(mkfifo("kkk",mode)<0) perror("failed to mkfifo");exit(1); if( (fd2=open("kk",O_WRONLY) <0) perror("open"); exit(1); char cc="夏秀娥-14級移動一班" write(fd2,cc

11、,strlen(cc); close(fd2);if(signal(SIGUSR1, handler) = SIG_ERR)perror("signal fail");exit(-1);printf("向客戶端2發(fā)送字符串:%sn",message.mtext);printf("等待 客戶端2 進程發(fā)送信號! pid:%dn",message.mtype);sleep(30); if(fd3=open("kkk",O_RDONLY)<0) perror("open"); exit(1);

12、while(len3=read(fd3,buf3,BUFES)>0) printf("read: %sn",buf3); close(fd3); char buff1_v="蔣浩_14級移動1班_1415925655" int fd1_v;int len1_v=strlen(buff1_v);if(fd1_v=open("/root/蔣浩_1415925655.c",O_CREAT|O_RDWR)<0)perror("open file1.c error");exit(1);int size1;if(s

13、ize1=write(fd1_v,buff1_v,len1_v)<0)perror("error1");exit(1);printf("已寫入文件"); printf("從 客戶端1 接收消息為:%sn",message.mtext);printf("message.mtype:%dn",message.mtype);if(kill(int)message.mtype,SIGUSR1)=0)printf("客戶端2進程發(fā)送SIGUSR1成功!n");客戶端2 客戶端3代碼:Server:#

14、include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<string.h> #include<stdlib.h>#include<pthread.h>#include <arpa/inet.h>int PORT;struct user_messagechar name20;char message100;int connfd;/套接字描述符user10;/全局變量int ld;/監(jiān)聽套接字int connfd10;/分別記錄

15、多個客戶端的套接字 char array100;/字符串緩沖區(qū)int num=0;void message_deal(int connectfd);/服務器對當前套接字的消息進行處理的函數(shù)void quit();int main(int argc,char* argv) int A,I;int N=1000;int SUM=0;for(I=0;I<4;I+)A=(int)argv1I-48;A=A*N;N=N/10;SUM=SUM+A;/printf("%d",SUM);PORT=SUM;pthread_t thread; struct sockaddr_in cin

16、;struct sockaddr_in sin;char addr_p1000;/地址緩沖區(qū)socklen_t len; /創(chuàng)建套接字printf("Socket."); ld=socket(AF_INET,SOCK_STREAM,0);/初始化網(wǎng)絡通信地址結構體變量bzero(&sin,sizeof(sin);sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=INADDR_ANY; /把套接字幫定到初始化的地址結構上printf("Bind.");bind(l

17、d,(struct sockaddr*)&sin,sizeof(sin); /開始監(jiān)聽 printf("listening.n"); listen(ld,10); /創(chuàng)建一個線程,對服務器程序進行管理(關閉) pthread_create(&thread,NULL,(void*)(&quit),NULL); /記錄空閑的客戶端的套接字描述符(-1為空閑) int i=0; for(i=0;i<10;i+) /套接字描述符都初始化為空閑 connfdi=-1; char buff500;/字符串緩沖區(qū) while(1) len=sizeof(ci

18、n); for(i=0;i<10;i+) /找到一個空閑的套接字描述符 if(connfdi=-1) break; /調(diào)用accept從listen接受的連接隊列中取得一個連接 connfdi=accept(ld,(struct sockaddr*)&cin,&len); /針對當前套接字創(chuàng)建一個線程,對當前套接字的消息進行處理 pthread_create(malloc(sizeof(pthread_t),NULL,(void*)(&message_deal),(void*)connfdi); num+; return 0; void message_deal(

19、int connectfd)/線程體函數(shù),char recvbuf500;/接收到的字符串緩沖區(qū)char name;int ufd;char u_name40;int t=connectfd; recv(t,u_name,1000,0);printf(" %s join innn",u_name);strcpy(,u_name);usernum.connfd=connectfd;while(1)int Len;Len=recv(connectfd,recvbuf,1000,0);/接受客戶端發(fā)來的消息。下面考慮是群發(fā)還是私發(fā)int len;len=s

20、trlen(recvbuf);char user_news="蔣浩"char user_news1="14移動一班"char user_news2="1415925655"recvbufLen='0'/=if(strcmp(recvbuf,"name")=0)/如果收到消息 "name" ,就恢復 “蔣浩”send(connectfd,user_news,strlen(user_news)+1,0);printf("已發(fā)送字符串 %s 成功",user_new

21、s); if(strcmp(recvbuf,"class")=0)/如果收到消息 "class" ,就恢復 "14移動一班"send(connectfd,user_news1,strlen(user_news1)+1,0);printf("已發(fā)送字符串 %s 成功",user_news1);if(strcmp(recvbuf,"id")=0)/如果收到消息 "name" ,就恢復 "1415925655"send(connectfd,user_news2,

22、strlen(user_news2)+1,0);printf("已發(fā)送字符串 %s 成功",user_news2); void quit() char msg10; while(1) scanf("%s",msg); if(strcmp("quit",msg)=0) printf("Byebye.n"); close(ld); exit(0); Client1.c#include<stdio.h>#include<stdlib.h>#include <sys/socket.h>#

23、include <arpa/inet.h>#include <string.h>#include<pthread.h>#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <signal.h> #define SIZE 10 #define SERVER_IP ""/服務器端IPint PORT;int ld;void send_message();void single();st

24、ruct msgbuf long mtype; char mtextSIZE; ; void handler(int sig) if(sig=SIGUSR1) printf("受到SIGUSR1信號,GAME OVER!n"); int main(int argc,char *argv)int A,I;int N=1000;int SUM=0;for(I=0;I<4;I+)A=(int)argv1I-48;A=A*N;N=N/10;SUM=SUM+A;/printf("%d",SUM);PORT=SUM;struct sockaddr_in sin

25、;pthread_t thread1;/發(fā)送線程 pthread_t thread2;/接收線程printf("Socket."); ld=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)建一個套接/初始化網(wǎng)絡通信地址結構體變量bzero(&sin,sizeof(sin);sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(SERVER_IP);/發(fā)送連接請求printf("Connecting.n");connect(ld,(

26、struct sockaddr *)&sin,sizeof(sin);/從此處開始程序分做兩個線程/創(chuàng)建發(fā)送消息的線程,調(diào)用了發(fā)送消息的函數(shù)send_message pthread_create(&thread1,NULL,(void*)(&send_message),NULL); char buff500,buff110; int len,len1; int kk=0; if(len= recv(ld,buff,1000,0)>0)/len為讀入的字節(jié)數(shù) bufflen='0' printf("tttt接收消息:%s nn",

27、buff); /客戶端1收到消息后作出回應 /= key_t key=ftok(argv1,1);int msgid=msgget(key,IPC_CREAT|0666);struct msgbuf message;message.mtype=getpid();strcpy(message.mtext,buff);int res=msgsnd(msgid,&message,sizeof(message.mtext),0);if(signal(SIGUSR1, handler) = SIG_ERR)perror("signal fail");exit(-1);prin

28、tf("向客戶端2發(fā)送字符串:%sn",message.mtext);printf("等待 客戶端2 進程發(fā)送信號! pid:%dn",message.mtype);sleep(30); /= return 0;/用戶發(fā)送聊天消息void send_message()char name50;/用戶 printf("please input your name:");/char name20scanf("%s",name);getchar();send(ld,name,strlen(name)+1,0);while(

29、1)printf(">>>>>>>>>>>歡迎客戶端進入!<<<<<<<<<<<<<n");single()void single() char news500;/發(fā)送的消息printf("請輸入: 用戶消息內(nèi)容:(bye退出!)n");while(1) gets(news); if(strcmp(news,"bye")=0) printf("已退出!n"); exit(0

30、); send(ld,news,strlen(news)+1,0); -#include<stdio.h>#include<stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#include<pthread.h>#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <signal.h> #

31、include<sys/stat.h>#include<errno.h>#include<fcntl.h>#include<unistd.h>#include<limits.h>#define BUFES PIPE_BUF#define SIZE 10 #define SERVER_IP ""/服務器端IPint PORT;int ld;void send_message();void single();struct msgbuf long mtype; char mtextSIZE; ; int

32、 main(int argc,char *argv)int A,I;int N=1000;int SUM=0;for(I=0;I<4;I+)A=(int)argv1I-48;A=A*N;N=N/10;SUM=SUM+A;/printf("%d",SUM);PORT=SUM;struct sockaddr_in sin;pthread_t thread1;/發(fā)送線程 pthread_t thread2;/接收線程printf("Socket."); ld=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)建一個套接字/初始化網(wǎng)絡通信地址

33、結構體變量bzero(&sin,sizeof(sin);sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(SERVER_IP);/發(fā)送連接請求printf("Connecting.n");connect(ld,(struct sockaddr *)&sin,sizeof(sin);/從此處開始程序分做兩個線程/創(chuàng)建發(fā)送消息的線程,調(diào)用了發(fā)送消息的函數(shù)send_message pthread_create(&thread1,NULL,(void*)

34、(&send_message),NULL); char buff500,buff110; int len,len1; int kk=0; if(len= recv(ld,buff,1000,0)>0)/len為讀入的字節(jié)數(shù) bufflen='0' printf("tttt接收消息:%s nn",buff); /= key_t key=ftok(argv1,1);int msgid=msgget(key,IPC_CREAT|0666);struct msgbuf message;int res=msgrcv(msgid,&message,

35、sizeof(message.mtext),0,0);if(res>0)message.mtextres='0'printf("從 客戶端1 接收消息為:%sn",message.mtext);printf("message.mtype:%dn",message.mtype);if(kill(int)message.mtype,SIGUSR1)=0)printf("客戶端2進程發(fā)送SIGUSR1成功!n"); /= int fd2; mode_t mode = O_NONBLOCK; / if(mkfifo(&q

36、uot;kkk",mode)<0) perror("failed to mkfifo");exit(1); if( (fd2=open("kk",O_WRONLY) <0) perror("open"); exit(1); char cc="蔣浩-14級移動一班" write(fd2,cc,strlen(cc); close(fd2); return 0;/用戶發(fā)送聊天消息void send_message()char name50;/用戶 printf("please input

37、your name:");/char name20;scanf("%s",name);getchar();send(ld,name,strlen(name)+1,0);while(1)printf(">>>>>>>>>>>歡迎客戶端進入!<<<<<<<<<<<<<n");single();void single() char news500;/發(fā)送的消息printf("請輸入: 用戶消息內(nèi)容:

38、(bye退出!)n");while(1) gets(news); if(strcmp(news,"bye")=0) printf("已退出!n"); exit(0); send(ld,news,strlen(news)+1,0); char mess100="蔣浩_14級移動一班"/ 將發(fā)送給客戶端3 send(ld,mess,strlen(mess)+1,0); -#include<stdio.h>#include<stdlib.h>#include <sys/socket.h>#inc

39、lude <arpa/inet.h>#include <string.h>#include<pthread.h>#include <signal.h>#include<fcntl.h>#include<sys/stat.h>#include<sys/types.h>#include<errno.h>#include<unistd.h>#include<limits.h>#define BUFES PIPE_BUF#define SERVER_IP "127.0.0.

40、1"/服務器端IPint PORT;int ld;void send_message();void single();int main(int argc,char *argv)int A,I;int N=1000;int SUM=0;for(I=0;I<4;I+)A=(int)argv1I-48;A=A*N;N=N/10;SUM=SUM+A;/printf("%d",SUM);PORT=SUM;struct sockaddr_in sin;pthread_t thread1;/發(fā)送線程 pthread_t thread2;/接收線程printf("Socket."); ld=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)建一個套接字/初始化網(wǎng)絡通信地址結構體變量bzero(&sin,sizeof(sin);sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(SERVER_IP);/發(fā)送連接請求printf("Connecting.n");connect

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論