版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux操作系統(tǒng)與程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告書(shū)指導(dǎo)老師:報(bào)告組員:2023年7月5號(hào)TOC\o"1-3"\u目錄一、實(shí)驗(yàn)工程目的1二、實(shí)驗(yàn)工程的人員組成及指責(zé)劃分1三、實(shí)驗(yàn)工程的功能及模塊劃分1四、設(shè)計(jì)與實(shí)現(xiàn)34.1系統(tǒng)結(jié)構(gòu)34.1.1系統(tǒng)結(jié)構(gòu)圖34.2客戶端界面34.2.1注冊(cè)34.2.2登錄44.2.3界面設(shè)計(jì)44.3效勞器的實(shí)現(xiàn)64.3.1用戶登錄64.3.2轉(zhuǎn)發(fā)聊天消息74.4通信模塊的實(shí)現(xiàn)84.4.1通信方式的選擇11五、測(cè)試與調(diào)試11六、總結(jié)11七、附錄:程序代碼12一.實(shí)驗(yàn)工程目的隨著嵌入式在生活年中的應(yīng)用越來(lái)越廣泛,嵌入式Linux下的socket網(wǎng)絡(luò)編程也越來(lái)越熱門(mén)。本次課程設(shè)計(jì)是為了加強(qiáng)對(duì)LINUX系統(tǒng)下的編程的各種知識(shí)點(diǎn)的整合與靈活運(yùn)用,讓我們更加熟悉Linux下的編程操作,重點(diǎn)在Linux下的socket編程,了解TCP,UDP等協(xié)議的使用,并完成課程設(shè)計(jì)題目。二.實(shí)驗(yàn)工程的人員組成及指責(zé)劃分我們實(shí)驗(yàn)組總共由2個(gè)同學(xué)組成,姓名,專(zhuān)業(yè),學(xué)號(hào)及職責(zé)劃分如下:=1\*GB3①〔專(zhuān)業(yè)及班級(jí):網(wǎng)絡(luò)工程102班學(xué)號(hào):1〕,小組組長(zhǎng),負(fù)責(zé)整體設(shè)計(jì)和模塊劃分。=2\*GB3②〔專(zhuān)業(yè)班級(jí):網(wǎng)絡(luò)工程102班,學(xué)號(hào):13〕,負(fù)責(zé)代碼編寫(xiě)及修改.三.實(shí)驗(yàn)工程的功能及模塊劃分1.系統(tǒng)功能系統(tǒng)主要實(shí)現(xiàn)三大功能:1.注冊(cè)與登陸系統(tǒng)2.群聊3.私聊2.登錄聊天系統(tǒng)功能模塊圖客戶端登錄聊天系統(tǒng)私聊退出群聊私聊退出群聊解除鎖定直接私聊鎖定私聊對(duì)象解除鎖定直接私聊鎖定私聊對(duì)象聊天系統(tǒng)效勞器聊天系統(tǒng)登錄處理關(guān)閉效勞器聊天信息發(fā)送處理用戶退出用戶管理四、設(shè)計(jì)與實(shí)現(xiàn)登錄處理關(guān)閉效勞器聊天信息發(fā)送處理用戶退出用戶管理4.1系統(tǒng)結(jié)構(gòu)4.1.1系統(tǒng)結(jié)構(gòu)圖發(fā)送消息發(fā)送消息模塊發(fā)送消息發(fā)送消息模塊效勞器轉(zhuǎn)發(fā)消息建立用戶鏈表,執(zhí)行添加用戶,刪除用戶,查詢(xún)用戶等操作。效勞器轉(zhuǎn)發(fā)消息建立用戶鏈表,執(zhí)行添加用戶,刪除用戶,查詢(xún)用戶等操作??蛻舳丝蛻舳私邮芟⒛K接受消息模塊接受消息接受消息4.2客戶端界面4.2.1注冊(cè)4.2.2登錄登錄界面設(shè)計(jì)截圖4.2.2界面設(shè)計(jì)界面截圖本系統(tǒng)直接在終端環(huán)境下運(yùn)行,具體實(shí)現(xiàn)代碼如下:while(1){ memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); if(recvfrom(socket_fd,buf,sizeof(buf),0,NULL,NULL)<0){ perror("接收消息失敗"); } if(strncmp("Q",buf,1)==0)//接收效勞器下線通知 { printf("\033[22;30m%s",buf+1);//輸出黑色文字系統(tǒng)消息 kill(getppid(),SIGUSR2); kill(getpid(),SIGUSR2); } elseif(strncmp("A",buf,1)==0) { printf("\033[22;96m%s",buf+1);//輸出灰色文字系統(tǒng)消息 } elseif(strncmp("P",buf,1)==0) { printf("\033[22;31m%s",buf+1);//輸出紅色文字系統(tǒng)消息 } elseif(strncmp("R",buf,1)==0) { if(strncmp(buf+1,name,strlen(name))==0) { sprintf(buf_temp,"我%s",buf+strlen(name)+1); printf("\033[22;32m%s",buf_temp);//輸出黃色文字自己的消息 } else{ printf("\033[22;33m[收到消息@]%s",buf+1);//輸出綠色文字} } printf("\033[22;30m");//恢復(fù)黑色 }4.3效勞器的實(shí)現(xiàn)效勞器運(yùn)行界面:4.3.1用戶登錄處理用戶登錄功能源碼:voidProcessLogin(char*command,SA_INrec_addr){ charname[10]; USERuser; charbuf[BUFFERSIZE]; memset(buf,'\0',BUFFERSIZE); strcpy(name,command+1); if(findUser(head,name)==-1){ strcpy(,name); user.address=rec_addr; addUser(head,user); buf[0]='Y'; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&rec_addr,sizeof(rec_addr))==-1) { perror("登錄失敗"); } } else{ buf[0]='N'; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&rec_addr,sizeof(rec_addr))==-1) { perror("登錄失敗"); } }}4.3.2轉(zhuǎn)發(fā)聊天消息界面:源碼:voidProcessChat(char*command){ charbuf[BUFFERSIZE]; SA_INaddress; memset(buf,'\0',BUFFERSIZE);printf("server09\n!!");//******* sprintf(buf,"R%s\n<請(qǐng)輸入>\n",command+1);//'\n'強(qiáng)行推送數(shù)據(jù) 必須否那么要到緩沖區(qū)滿才一次性發(fā)送printf("server9\n!!");//******* plinkp=head->next; while(p!=NULL){ address=(p->data).address; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&address,sizeof(address))<0) { perror("消息發(fā)送失敗"); } p=p->next; }}4.4通信模塊的實(shí)現(xiàn)在客戶端,使用了兩個(gè)進(jìn)程,主進(jìn)程負(fù)責(zé)登錄和發(fā)送消息,子進(jìn)程負(fù)責(zé)接受消息并處理消息。發(fā)送消息代碼如下:while(1)//父進(jìn)程 { memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); fgets(buf_temp,BUFFERSIZE,stdin); //采用fgets比采用scanf好,聊天時(shí)可以鍵入空格 buf_temp[strlen(buf_temp)]='\0'; if(strncmp("unlock",buf_temp,6)==0)//解除鎖定某個(gè)好友 { islock=0; printf("解除鎖定\n"); } if(strncmp("&",buf_temp,1)==0)//鎖定某個(gè)好友 { islock=1; buf_temp[0]='$'; buf_temp[strlen(buf_temp)-1]='$'; strcpy(sname,buf_temp); printf("當(dāng)前已經(jīng)鎖定好友為%s,解除鎖定清輸入unlock\n",sname); buf_temp[strlen(buf_temp)]='h'; buf_temp[strlen(buf_temp)+1]='i'; buf_temp[strlen(buf_temp)+2]='\0'; } if(islock==1){ chars[1024]; strncat(s,sname,strlen(sname)); strncat(s,buf_temp,strlen(buf_temp)); strcpy(buf_temp,s); strcpy(s,""); } if(strncmp("quit",buf_temp,4)==0)//退出 { sprintf(buf,"Q%s",name); quit_flag=1; } elseif(strncmp("$",buf_temp,1)==0)//注:發(fā)送悄悄話的格式:$對(duì)方名稱(chēng)$消息內(nèi)容 { char*check=buf_temp+1; //必須對(duì)其檢查一定要有兩個(gè)$...$否那么造成效勞器當(dāng)機(jī) while(*check!='\0'&&*check!='$') check++; if(*check!='$') { printf("[系統(tǒng)提示]\n發(fā)送悄悄話格式:$對(duì)方名稱(chēng)$消息內(nèi)容\n<請(qǐng)輸入>\n"); continue; } sprintf(buf,"P%s%s",name,buf_temp); } else//群發(fā)消息 { if(strncmp("online",buf_temp,6)==0)//獲取所有好友 { sprintf(buf,"A%s",name); }elseif(strncmp("help",buf_temp,4)==0){ printf("===歡送使用本聊天系統(tǒng)===\n"); printf("功能說(shuō)明\n"); printf("1:群聊,直接輸入信息即可\n"); printf("2:輸入[$+好友名稱(chēng)+$+私聊信息]進(jìn)行私聊\n"); printf("3:輸入quit,退出本系統(tǒng)\n"); printf("4:輸入&+好友名稱(chēng)可以進(jìn)入與該好友私聊狀態(tài)\n"); printf("5:輸入unlock解除好友私聊狀態(tài)\n"); printf("6:輸入online獲取所有在線好友信息\n"); printf("7:輸入help獲取幫助信息\n"); printf("===歡送使用本聊天系統(tǒng)===\n"); sprintf(buf,"H%s",name); }else{ sprintf(buf,"C%s說(shuō):%s",name,buf_temp); } } //開(kāi)始發(fā)送消息 if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&serv_addr, sizeof(serv_addr))<0) { perror("發(fā)送失敗"); } if(quit_flag) { kill(pid,SIGUSR2); break; } }接受消息代碼如下:while(1){ memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); if(recvfrom(socket_fd,buf,sizeof(buf),0,NULL,NULL)<0){ perror("接收消息失敗"); } if(strncmp("Q",buf,1)==0)//接收效勞器下線通知 { printf("\033[22;30m%s",buf+1);//輸出黑色文字系統(tǒng)消息 kill(getppid(),SIGUSR2); kill(getpid(),SIGUSR2); } elseif(strncmp("A",buf,1)==0) { printf("\033[22;96m%s",buf+1);//輸出灰色文字系統(tǒng)消息 } elseif(strncmp("P",buf,1)==0) { printf("\033[22;31m%s",buf+1);//輸出紅色文字系統(tǒng)消息 } elseif(strncmp("R",buf,1)==0) { if(strncmp(buf+1,name,strlen(name))==0) { sprintf(buf_temp,"我%s",buf+strlen(name)+1); printf("\033[22;32m%s",buf_temp);//輸出黃色文字自己的消息 } else{ printf("\033[22;33m[收到消息@]%s",buf+1);//輸出綠色文字} } printf("\033[22;30m");//恢復(fù)黑色 }4.4.1通信方式的選擇本系統(tǒng)使用udp通信方式,效勞器必須指定端口號(hào)和ip地址,客戶端根據(jù)該端口號(hào)和ip地址找到效勞器并建立連接,數(shù)據(jù)發(fā)送采用數(shù)據(jù)包格式。他的優(yōu)點(diǎn)是,效率高,缺點(diǎn)是不可靠。測(cè)試與調(diào)試登錄時(shí),判斷是否已經(jīng)登錄,還有判斷是否存在賬號(hào),編寫(xiě)登錄或注冊(cè)菜單界面時(shí),編寫(xiě)的測(cè)試類(lèi)以此來(lái)測(cè)試,輸入一些非法數(shù)據(jù)來(lái)測(cè)試客服端有沒(méi)有過(guò)濾他們總結(jié)本次課程設(shè)計(jì)順利完成了Linux下聊天室工具的設(shè)計(jì),包括登陸,私聊等功能,其中聊天時(shí)可以用英文以及中文聊天,可以通過(guò)輸入$好友名稱(chēng)$信息和某個(gè)好友聊天,解除好友時(shí)輸入unlock??蛻暨€可以輸入help獲得幫助的信息,功能相對(duì)完善。在本次課程設(shè)計(jì),實(shí)現(xiàn)各個(gè)局部功能的程序都比擬復(fù)雜,需要利用linux下的socket網(wǎng)絡(luò)編程知識(shí)和大量編程技巧,不過(guò)這使得我們?cè)谡n程設(shè)計(jì)中,學(xué)到了很多東西。通過(guò)本次的課程設(shè)計(jì),我們的軟件開(kāi)發(fā)能力在一定程度上提高了,對(duì)Linux程序設(shè)計(jì)著門(mén)課程有了較深刻的了解,實(shí)驗(yàn)過(guò)程中我們也遇到了很多問(wèn)題,但是團(tuán)隊(duì)合作的力量,讓問(wèn)題在我們面前都顯的那么無(wú)力。同伴們?cè)谝黄鹩懻?,研究,一起上網(wǎng)查資料,查書(shū),以及向老師請(qǐng)教,問(wèn)題都一一的解決了。在這里,我們深刻的感受到團(tuán)隊(duì)的強(qiáng)大的力量,不僅讓我們敢于直面問(wèn)題,更讓我們?cè)诳鞓?lè)互助中學(xué)到很多的東西。這次的課程設(shè)計(jì),再次教會(huì)了我們?nèi)绾谓涣?,合作與互助,加強(qiáng)了團(tuán)隊(duì)合作的意識(shí)。我們的程序可以完成登陸,私聊等根本功能。但是由于所學(xué)的知識(shí)不全面,時(shí)間限制,我們沒(méi)有完成更高的功能,不過(guò)之后我們會(huì)繼續(xù)學(xué)習(xí),改善我們的系統(tǒng),努力做的更好!總之,這次的課程設(shè)計(jì)使我們滿載而歸,也讓我們深刻的懂得,用心做,總是會(huì)有回報(bào)的!我們會(huì)繼續(xù)加油的!附錄:程序代碼客戶端:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<dirent.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<netdb.h>#include<signal.h>#include<stdlib.h>#include"mysql.h"#defineBUFFERSIZE1024typedefstructsockaddrSA;typedefstructsockaddr_inSA_IN;#defineSERVER_IP""#defineSERVER_PORT8000voidsig_user1(intsigno);voidsig_user2(intsigno);voidsig_alrm(intsigno);char*ProcessLogin(SA_INserv_addr);//以下為功能函數(shù)聲明voiddispDot();voidpt_msg();intmsSleep(longms);voiddenglu();staticpid_tpid;staticintsocket_fd;chars3[50];intmain(void){ intislock=0; charsname[1024]; charbuf[BUFFERSIZE];//定義一個(gè)字節(jié)的緩沖區(qū) charbuf_temp[BUFFERSIZE];//定義一個(gè)字節(jié)的臨時(shí)緩沖區(qū) charname[10];//姓名 SA_INserv_addr;//效勞器地址 signal(SIGUSR1,sig_user1);//signal的意思是 signal(SIGUSR2,sig_user2); signal(SIGINT,SIG_IGN);//拒絕用戶ctrl+c強(qiáng)制退出,只能鍵入quit退出 if((socket_fd=socket(AF_INET,SOCK_DGRAM,0))==-1){ perror("套接字創(chuàng)立失敗"); exit(-1); }//效勞器配置信息 memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=inet_addr(SERVER_IP); serv_addr.sin_port=htons(8000); //pt_msg(); strcpy(name,ProcessLogin(serv_addr));//得到登錄名 if((pid=fork())==-1) { perror("子進(jìn)程創(chuàng)立失敗"); return-1; } if(pid==0)///////////////////////////////////子進(jìn)程,用來(lái)接收效勞器的消息 { memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); sprintf(buf,"C%s上線了",name); if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&serv_addr, sizeof(serv_addr))<0) { perror("上線失敗"); } sleep(1); kill(getppid(),SIGUSR1);//喚醒主進(jìn)程讓其輸入 while(1){ memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); if(recvfrom(socket_fd,buf,sizeof(buf),0,NULL,NULL)<0) { perror("接收消息失敗"); } if(strncmp("Q",buf,1)==0)//接收效勞器下線通知 { printf("\033[22;30m%s",buf+1);//輸出黑色文字系統(tǒng)消息 kill(getppid(),SIGUSR2); kill(getpid(),SIGUSR2); } elseif(strncmp("A",buf,1)==0) { printf("\033[22;96m%s",buf+1);//輸出灰色文字系統(tǒng)消息 } elseif(strncmp("P",buf,1)==0) { printf("\033[22;31m%s",buf+1);//輸出紅色文字系統(tǒng)消息 } elseif(strncmp("R",buf,1)==0) { if(strncmp(buf+1,name,strlen(name))==0) { sprintf(buf_temp,"我%s",buf+strlen(name)+1); printf("\033[22;32m%s",buf_temp);//輸出黃色文字自己的消息 } else{ printf("\033[22;33m[收到消息@]%s",buf+1);//輸出綠色文字} } printf("\033[22;30m");//恢復(fù)黑色 } } //////////////////////////////////////////////////////主進(jìn)程//////////////////////////////////// pause(); //等待SIGUSR1 intquit_flag=0; getchar();//清空輸入名字時(shí)殘存的回車(chē)符,因?yàn)镻rocessLogin使用scanf while(1)//父進(jìn)程 { memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); fgets(buf_temp,BUFFERSIZE,stdin); //采用fgets比采用scanf好,聊天時(shí)可以鍵入空格 buf_temp[strlen(buf_temp)]='\0'; if(strncmp("unlock",buf_temp,6)==0)//解除鎖定某個(gè)好友 { islock=0; printf("解除鎖定\n"); } if(strncmp("&",buf_temp,1)==0)//鎖定某個(gè)好友 { printf("1-------------\n"); islock=1; buf_temp[0]='$'; buf_temp[strlen(buf_temp)-1]='$'; printf("2-------------\n"); //strcpy(sname,buf_temp); sprintf(sname,"%s",buf_temp); printf("*-------------\n"); printf("當(dāng)前已經(jīng)鎖定好友為%s,解除鎖定清輸入unlock\n",sname); printf("3-------------\n"); buf_temp[strlen(buf_temp)]='h'; buf_temp[strlen(buf_temp)+1]='i'; buf_temp[strlen(buf_temp)+2]='\0'; printf("4-------------\n"); } if(islock==1){ chars[1024]; strncat(s,sname,strlen(sname)); strncat(s,buf_temp,strlen(buf_temp)); strcpy(buf_temp,s); strcpy(s,""); } if(strncmp("quit",buf_temp,4)==0)//退出 { sprintf(buf,"Q%s",name); quit_flag=1; } elseif(strncmp("$",buf_temp,1)==0)//注:發(fā)送悄悄話的格式:$對(duì)方名稱(chēng)$消息內(nèi)容 { char*check=buf_temp+1; //必須對(duì)其檢查一定要有兩個(gè)$...$否那么造成效勞器當(dāng)機(jī) while(*check!='\0'&&*check!='$') check++; if(*check!='$') { printf("[系統(tǒng)提示]\n發(fā)送悄悄話格式:$對(duì)方名稱(chēng)$消息內(nèi)容\n<請(qǐng)輸入>\n"); continue; } sprintf(buf,"P%s%s",name,buf_temp); } else//群發(fā)消息 { if(strncmp("online",buf_temp,6)==0)//獲取所有好友 { sprintf(buf,"A%s",name); } elseif(strncmp("help",buf_temp,4)==0) { pt_msg(); sprintf(buf,"H%s",name); } else { sprintf(buf,"C%s說(shuō):%s",name,buf_temp); } } //開(kāi)始發(fā)送消息 if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&serv_addr, sizeof(serv_addr))<0) { perror("發(fā)送失敗"); } if(quit_flag) { kill(pid,SIGUSR2); break; } } kill(getpid(),SIGUSR2);}voidsig_user2(intsigno){ printf("%d進(jìn)程結(jié)束\n",getpid()); exit(-1);}voidsig_user1(intsigno){ ;}voidsig_alrm(intsigno){ return;}char*ProcessLogin(SA_INserv_addr){ charbuf[10]; staticcharname[10]; structsigactionact; //處理效勞器未上線 sigaction(SIGALRM,NULL,&act); act.sa_handler=sig_alrm; act.sa_flags&=~SA_RESTART; //有何用處?????? sigaction(SIGALRM,&act,NULL); while(1){ denglu(); //printf("請(qǐng)輸入用戶名:"); buf[0]='L'; //scanf("%s",buf+1); strcpy(name,s3); strcpy(buf+1,s3); alarm(2);//設(shè)置連接效勞器超時(shí)時(shí)間為2秒 printf("登錄中"); dispDot(); if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&serv_addr, sizeof(serv_addr))<0) { perror("登錄失敗"); } recvfrom(socket_fd,buf,sizeof(buf),0,NULL,NULL); if(buf[0]=='N'){ printf("該用戶名已被使用,請(qǐng)重新輸入用戶名\n"); }elseif(buf[0]=='Y'){ printf("%s登錄成功\n",name); pt_msg(); alarm(0);//必須關(guān)閉鬧鐘 returnname; break; } else { printf("效勞器未上線,退出登錄\n"); exit(-1); } }}voidpt_msg(){printf("\n(歡送使用QQ聊天室\n"); printf("***********************************************************************\n"); printf("1:輸入信息〔單用戶直接輸入)進(jìn)行多人聊天\n"); printf("2:輸入信息($+對(duì)象名+$+信息)進(jìn)行聊天\n"); printf("3:輸入信息(用戶輸入quit)退出本系統(tǒng)\n"); printf("4:輸入信息(&+對(duì)象名)與好友聊天\n"); printf("5:輸入信息(用戶輸入unlock)解除好友聊天\n"); printf("6:輸入信息(用戶輸入online)獲取在線好友信息\n"); printf("7:輸入信息(用戶輸入help)獲取幫助信息\n"); printf("***********************************************************************\n");}voiddispDot(){ inti; for(i=0;i<10;i++) { printf("."); fflush(stdout); msSleep(90000); } printf("\n");}intmsSleep(longms){structtimevaltv;tv.tv_sec=0;tv.tv_usec=ms;returnselect(0,NULL,NULL,NULL,&tv);}voiddenglu(){ MYSQLmy_connection; MYSQL_RES*res_ptr; MYSQL_ROWsqlrow; intres; mysql_init(&my_connection); chars1[250]; chars2[11]; charc; printf("a登錄"); printf("\nb注冊(cè)\n"); printf("請(qǐng)選擇.....\n"); scanf("%c",&c); if(c=='a') { printf("\n請(qǐng)輸入帳號(hào):"); scanf("%s",&s2); printf("\n請(qǐng)輸入昵稱(chēng):"); scanf("%s",&s3); if(mysql_real_connect(&my_connection,"localhost","root","liuxu","qq",0,NULL,0)) { //printf("Connectionsuccess\n"); sprintf(s1,"selectnamefromuserwhereid='%s'",s2); res=mysql_query(&my_connection,s1); if(res) { printf("登錄失敗?。?!"); exit(0); } else {//printf("登錄成功?。?); } } } if(c=='b') { printf("請(qǐng)輸入帳號(hào):"); scanf("%s",&s2); printf("\n請(qǐng)輸入昵稱(chēng):"); scanf("%s",&s3); if(mysql_real_connect(&my_connection,"localhost","root","liuxu","qq",0,NULL,0)) { printf("Connectionsuccess\n"); sprintf(s1,"insertintouser(id,name)values('%s','%s')",s2,s3); res=mysql_query(&my_connection,s1); if(!res) { printf("Inserted%lurows\n",(unsignedlong)mysql_affected_rows(&my_connection)); printf("注冊(cè)成功?。?!"); }else { printf("注冊(cè)失敗!"); exit(0); } } printf("\n請(qǐng)重輸?。?!"); } //exit(0);}效勞器:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<dirent.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#include<netdb.h>#include<signal.h>#defineBUFFERSIZE1024typedefstructsockaddrSA;typedefstructsockaddr_inSA_IN;#defineSERVER_IP""#defineSERVER_PORT8000#include<time.h>typedefstruct{ charname[10]; SA_INaddress;}USER;//用戶鏈表typedefstructHnode_list{ USERdata; structHnode_list*next;}Hlink,*plink;intmemoryError(plinkp);intcreatUserList(plinkhead);//建立用戶鏈表intfindUser(plinkhead,charname[10]);//查找用戶intdelUser(plinkhead,charname[10]);//刪除用戶intgetAllUser(plinkconsthead);//得到所有用戶信息intaddUser(plinkhead,USERdata);//增加用戶//函數(shù)voidProcessLogin(char*command,SA_INrec_addr);//登錄函數(shù)voidProcessChat(char*command);//控制消息收送函數(shù)voidProcessQuit(char*command);//退出函數(shù)intProcessPrivate(char*command,SA_INrec_addr);//控制私談函數(shù)voidProcessAd();voidsig_int(intsignum);staticplinkhead;staticintsocket_fd;intmain(void){ charbuf[BUFFERSIZE]; SA_INaddress,rec_addr; socklen_tlength; structtimevaltv; tv.tv_sec=60; tv.tv_usec=0; head=malloc(sizeof(Hlink));//用戶列表頭 creatUserList(head);//創(chuàng)立列表 signal(SIGINT,sig_int);//ctr+c強(qiáng)制退出 if((socket_fd=socket(AF_INET,SOCK_DGRAM,0))==-1){//創(chuàng)立套接字 perror("套接字創(chuàng)立失敗"); exit(-1); } memset(&address,0,sizeof(address)); address.sin_family=AF_INET; address.sin_addr.s_addr=inet_addr(SERVER_IP); address.sin_port=htons(SERVER_PORT); if(bind(socket_fd,(SA*)&address,sizeof(address))==-1){ perror("套接字綁定失敗"); exit(-1); } //30秒沒(méi)有收到任何消息就發(fā)送消息//printf("server0\n!!");//******* printf("效勞器啟動(dòng)成功ip:%s\n",inet_ntoa(address.sin_addr));//printf("server1\n!!");//******* length=sizeof(rec_addr); setsockopt(socket_fd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));//sendSocket--一個(gè)翻開(kāi)的套接口描述字//IPPROTO_IP或SOL_SOCKET--指定系統(tǒng)中解釋選項(xiàng)的代碼〔可取以下值:SOL_SOCKET或IPPROTO_IP或IPPROTO_ICMPV6或IPPROTO_IPV6或IPPROTO_TCP〕//IP_HDRINCL或SO_SNDTIMEO--本次調(diào)用要設(shè)置的選項(xiàng)名//flag或timeout--一個(gè)指向變量的指針,將該指針指向的對(duì)象設(shè)為上述選項(xiàng)名的新值//sizeof(flag)或sizeof(timeout)--變量的大小 while(1){printf("serverwhile\n!!");//******* memset(buf,0,sizeof(buf)); //效勞器只有此處用來(lái)接收 if(recvfrom(socket_fd,buf,sizeof(buf),0,(SA*)&rec_addr,&length) ==-1) { buf[0]='A';//發(fā)送標(biāo)志位printf("server2\n!!");//******* } switch(buf[0]){ case'L': ProcessLogin(buf,rec_addr);printf("server3\n!!");//******* break; case'C': ProcessChat(buf);printf("server4\n!!");//******* break; case'Q': ProcessQuit(buf);printf("server5\n!!");//******* break; case'A': ProcessAd();printf("server6\n!!");//******* break; case'P': ProcessPrivate(buf,rec_addr);printf("server7\n!!");//******* break; case'H': printf("server7\n!!");//******* break; default: printf("ERROR");printf("server8\n!!");//******* break; } }}voidProcessLogin(char*command,SA_INrec_addr){ charname[10]; USERuser; charbuf[BUFFERSIZE]; memset(buf,'\0',BUFFERSIZE); strcpy(name,command+1); if(findUser(head,name)==-1){ strcpy(,name); user.address=rec_addr; addUser(head,user); buf[0]='Y'; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&rec_addr,sizeof(rec_addr))==-1) { perror("登錄失敗"); } } else{ buf[0]='N'; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&rec_addr,sizeof(rec_addr))==-1) { perror("登錄失敗"); } }}voidProcessChat(char*command){ charbuf[BUFFERSIZE]; SA_INaddress; memset(buf,'\0',BUFFERSIZE);printf("server09\n!!");//******* sprintf(buf,"R%s\n<請(qǐng)輸入>\n",command+1);//'\n'強(qiáng)行推送數(shù)據(jù) 必須否那么要到緩沖區(qū)滿才一次性發(fā)送printf("server9\n!!");//******* plinkp=head->next; while(p!=NULL){ address=(p->data).address; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&address,sizeof(address))<0) { perror("消息發(fā)送失敗"); } p=p->next; }}voidProcessQuit(char*command){ charname[10]; charbuf[BUFFERSIZE]; memset(buf,'\0',BUFFERSIZE); SA_INaddress; sprintf(name,"%s",command+1); plinkp=head->next; delUser(head,name); sprintf(buf,"R%s下線了\n",name); while(p!=NULL){ address=(p->data).address; if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&address,sizeof(address))<0) { perror("消息發(fā)送失敗"); } p=p->next; }}voidProcessAd(){ charbuf[BUFFERSIZE]; charbuf_temp[BUFFERSIZE]; memset(buf,'\0',BUFFERSIZE);//必須清空否那么會(huì)有虛假數(shù)據(jù) memset(buf_temp,'\0',BUFFERSIZE); SA_INaddress; plinkp=head->next; strcat(buf,"A<<系統(tǒng)消息>>當(dāng)前在線用戶\n"); while(p!=NULL) { sprintf(buf_temp,"[%s:%s]",(p->data).name,inet_ntoa((p->data).address.sin_addr)); strcat(buf,buf_temp); p=p->next; }printf("server010\n!!");//******* strcat(buf,"\n<請(qǐng)輸入>\n");printf("server10\n!!");//******* p=head->next; while(p!=NULL){ address=(p->data).address;printf("server100\n!!");//******* if(sendto(socket_fd,buf,sizeof(buf),0,(SA*)&address,sizeof(address))<0) { perror("消息發(fā)送失敗"); } p=p->next; }}intProcessPrivate(char*command,SA_INrec_addr){ charbuf[BUFFERSIZE]; charbuf_temp[BUFFERSIZE]; charname_from[10]; charname_to[10]; intnon_user_flag=0; inti,j; for(i=1,j=0;command[i]!='$';i++,j++) { name_from[j]=command[i]; } name_from[j]='\0'; i++; for(j=0;command[i]!='$';i++,j++) {
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨國(guó)基礎(chǔ)設(shè)施工程合同模板
- 墊資施工合同導(dǎo)航工程
- 水果店翻新施工合同
- 地鐵工程外架施工協(xié)議
- 垃圾處理設(shè)施建設(shè)需求書(shū)
- 體育場(chǎng)館停車(chē)場(chǎng)租用合同
- 消防員操作工招聘合同
- 家具采購(gòu)招標(biāo)文件范本
- 校園劇編劇聘用書(shū)
- 珠寶店開(kāi)荒保潔施工合同
- 2023上海外國(guó)語(yǔ)大學(xué)三亞附屬中學(xué)第一次招聘19人筆試備考題庫(kù)及答案解析
- 悅納兒童的文化生長(zhǎng)東莞市莞城中心小學(xué)“悅納教育”的思與行
- 2022年春期2064國(guó)開(kāi)電大專(zhuān)科《管理學(xué)基礎(chǔ)》紙質(zhì)形成性考核冊(cè)答案
- 機(jī)械加工初步報(bào)價(jià)自動(dòng)計(jì)算(含各種工時(shí)費(fèi))
- 碳酸氫鎂介穩(wěn)溶液應(yīng)用于萃取分離稀土過(guò)程中的基礎(chǔ)研究
- 城市地下綜合管廊施工組織設(shè)計(jì)
- 中國(guó)舞蹈考級(jí)細(xì)則
- 2023年中國(guó)鹽業(yè)集團(tuán)有限公司招聘筆試題庫(kù)及答案解析
- 2022年港口危險(xiǎn)貨物安全管理人員機(jī)考試題(含答案)
- YY/T 0471.2-2004接觸性創(chuàng)面敷料試驗(yàn)方法 第2部分:透氣膜敷料水蒸氣透過(guò)率
- GB/T 34722-2017浸漬膠膜紙飾面膠合板和細(xì)木工板
評(píng)論
0/150
提交評(píng)論