版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、. 嵌入式操作系統(tǒng)課程設(shè)計(jì)Linux下網(wǎng)絡(luò)聊天工具設(shè)計(jì)報(bào)告作 者: 指導(dǎo)教師:團(tuán)隊(duì)照片口號(hào):青春沒有借口流淚,我們承諾永不后退!課程設(shè)計(jì)任務(wù)書課題名稱編譯原理課程設(shè)計(jì)完成時(shí)間2011.6.23指導(dǎo)教師職稱講師學(xué)生姓名班級(jí)B08512總體設(shè)計(jì)要求總體設(shè)計(jì)要求: 課程設(shè)計(jì)內(nèi)容自選定1個(gè)題目,每個(gè)學(xué)生按照課程設(shè)計(jì)要求,在規(guī)定的兩周時(shí)間內(nèi)獨(dú)立完成題目:Linux下網(wǎng)絡(luò)聊天室涉及內(nèi)容:1.注冊(cè)與登錄系統(tǒng)2.公聊3.私聊4.文件傳輸工作內(nèi)容及時(shí)間進(jìn)度安排第一周、周:設(shè)計(jì)動(dòng)員,布置課程設(shè)計(jì)任務(wù),查閱資料,制定方案,進(jìn)行程序方案設(shè)計(jì)第一周、周2-周5:編寫和調(diào)試程序第二周、周1-周3:編寫和調(diào)試程序第二周、周
2、4:整理,撰寫設(shè)計(jì)報(bào)告第二周、周5:驗(yàn)收,提交設(shè)計(jì)報(bào)告,評(píng)定成績(jī)。課程設(shè)計(jì)成果1、課程設(shè)計(jì)報(bào)告書一份2、源程序清單一份3、成果使用說明書一份摘 要隨著嵌入式在生活中的應(yīng)用越來越廣泛,嵌入式LINUX下的socket網(wǎng)絡(luò)編程也越來越熱門。為了加強(qiáng)對(duì)Linux系統(tǒng)下的編程的各種知識(shí)點(diǎn)的整合與靈活運(yùn)用,讓我們更加熟悉Linux下的編程操作,我們選擇了Linux下網(wǎng)絡(luò)聊天工具作為課設(shè)題目。本系統(tǒng)主要功能在于實(shí)現(xiàn)多個(gè)客戶端與服務(wù)器端之間的信息傳遞與文件傳輸功能。系統(tǒng)主要實(shí)現(xiàn)4大聊天室功能:注冊(cè)與登錄系統(tǒng),公聊,私聊,文件傳輸。應(yīng)用LINUX下的socket網(wǎng)絡(luò)編程并使用TCP實(shí)現(xiàn)簡(jiǎn)單聊天程序。編程過程中
3、不斷用各種網(wǎng)絡(luò)調(diào)試工具進(jìn)行調(diào)試程序,最終做成了簡(jiǎn)單的在LINUX下的聊天工具。關(guān)鍵詞: LINUX下的socket網(wǎng)絡(luò)編程 TCP 聊天工具目錄第1章 緒 論61.1課程設(shè)計(jì)目的61.2課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境61.3課程設(shè)計(jì)總體要求6第2章 系統(tǒng)方案72.1系統(tǒng)功能72.2模塊化分72.3模塊調(diào)用關(guān)系72.4功能需求與系統(tǒng)模塊的關(guān)系8第3章 實(shí)現(xiàn)原理93.1 注冊(cè)、登陸實(shí)現(xiàn)原理93.1.1 服務(wù)器端93.1.2 客戶端113.2 私聊實(shí)現(xiàn)原理123.2.1 客戶端123.2.2 服務(wù)器端133.3 公聊實(shí)現(xiàn)原理133.3.1 客戶端133.3.2 服務(wù)器端133.4 文件傳輸實(shí)現(xiàn)原理143.4.1
4、 客戶端143.4.2 服務(wù)器端14第4章 系統(tǒng)實(shí)現(xiàn)154.1 注冊(cè)與登錄系統(tǒng)實(shí)現(xiàn)154.2聊天功能實(shí)現(xiàn)164.3傳輸文件功能實(shí)現(xiàn)16總 結(jié)17附 錄18參考文獻(xiàn)33第1章 緒 論1.1課程設(shè)計(jì)目的本次課設(shè)主要是為了加強(qiáng)對(duì)Linux系統(tǒng)下的編程的各種知識(shí)點(diǎn)的整合與靈活運(yùn)用,讓我們更加熟悉Linux下的編程操作。重點(diǎn)在Linux下socket編程,了解TCP、UDP等協(xié)議的使用,并完成課設(shè)題目。1.2課程設(shè)計(jì)的實(shí)驗(yàn)環(huán)境 硬件:PC機(jī)兩臺(tái)以上 軟件:紅旗LINUX系統(tǒng)VIM編譯器1.3課程設(shè)計(jì)總體要求1在LINUX下實(shí)現(xiàn)網(wǎng)絡(luò)聊天,包括公聊、一對(duì)多私聊等功能;2實(shí)現(xiàn)客戶端之間經(jīng)網(wǎng)絡(luò)傳輸文件;3保存聊
5、天記錄,以備必要時(shí)查詢。第2章 系統(tǒng)方案2.1系統(tǒng)功能系統(tǒng)主要實(shí)現(xiàn)4大聊天室功能:1.注冊(cè)與登錄系統(tǒng)2.公聊3.私聊4.文件傳輸2.2模塊化分系統(tǒng)結(jié)構(gòu)如圖2-1所示:主模塊文件傳輸公聊私聊注冊(cè) 登陸圖2-1 聊天系統(tǒng)模塊劃分圖2.3模塊調(diào)用關(guān)系 各模塊間調(diào)用關(guān)系如圖2-2所示:注冊(cè)(未注冊(cè)用戶入口)登錄公聊私聊文件傳輸已注冊(cè)用戶入口圖2-2 各模塊間調(diào)用關(guān)系2.4功能需求與系統(tǒng)模塊的關(guān)系功能需求與系統(tǒng)模塊的關(guān)系表:注冊(cè)登錄模塊公聊模塊私聊模塊文件傳輸模塊用戶注冊(cè)用戶登陸系統(tǒng)廣播上下線提示用戶私聊文件傳輸服務(wù)器踢出用戶第3章 實(shí)現(xiàn)原理3.1 注冊(cè)、登陸實(shí)現(xiàn)原理3.1.1 服務(wù)器端服務(wù)器端建立好s
6、ocket,等待連接,當(dāng)客戶端連接服務(wù)器,服務(wù)器接收連接,并接受客戶端發(fā)送過來的消息,根據(jù)接收到的結(jié)構(gòu)體所攜帶的協(xié)議來做相應(yīng)的功能。服務(wù)器端啟動(dòng)后如圖3-1所示:圖3-1 服務(wù)器端界面1、注冊(cè):如果協(xié)議為reg,則為客戶端注冊(cè),首先將發(fā)送過來的結(jié)構(gòu)體,提取用戶名和密碼,然后需要對(duì)用戶名合法性檢驗(yàn),驗(yàn)證之后如果用戶名合法則將用戶信息保存到文件中,合法性的規(guī)則包括用戶名不能重復(fù)和不能使用all等協(xié)議作為用戶名,并且用戶名和密碼都不能為空。如果注冊(cè)成功,服務(wù)器端發(fā)送一個(gè)消息給注冊(cè)的客戶端,同樣將消息保存在一個(gè)結(jié)構(gòu)體里。如果失敗,也給客戶端發(fā)送一個(gè)消息如“您輸入的用戶名不能為all”或者“用戶名XX已
7、經(jīng)存在”。注冊(cè)結(jié)果如圖3-2所示。 圖3-2 注冊(cè)新用戶2、登錄:如果協(xié)議為login,則將用戶名和密碼信息提取,再遍歷存放用戶信息文件里的用戶名和密碼,直到驗(yàn)證成功為止,如果驗(yàn)證成功則對(duì)所有在線的用戶發(fā)送一條消息:“提示XX用戶登錄成功”;如果失敗則只給登陸失敗的客戶端提示登錄失敗,并給出原因,如“用戶名不存在”或者“用戶名或者密碼輸入錯(cuò)誤”,并跳轉(zhuǎn)到相應(yīng)的代碼執(zhí)行其他功能,成功則等待發(fā)送客戶端消息,失敗則關(guān)閉socket并結(jié)束線程,如圖3-3所示。圖3-3 用戶登錄3、監(jiān)聽和踢出客戶端:通過查看和修改綁定的socket和在線用戶隊(duì)列實(shí)現(xiàn)查看和踢出在線用戶,提出用戶后向被踢出用戶發(fā)送相關(guān)信息
8、,如圖3-4、圖3-5所示。圖3-4 踢出用戶CC圖3-5 用戶CC被踢出 這里從服務(wù)器端發(fā)回給客戶端的消息使用sprintf到一個(gè)字符串來發(fā)送。3.1.2 客戶端客戶端的輸入和消息的顯示要使用2個(gè)終端,一個(gè)client,一個(gè)是Display。Client終端為輸入的界面,在這個(gè)界面里,新建一個(gè)線程來接受服務(wù)器端發(fā)來的消息,再添加時(shí)間信息,并將這些信息寫入文件,然后給Display進(jìn)程發(fā)送一個(gè)消息,Display進(jìn)程接到消息,就去讀取文件,并將這些數(shù)據(jù)顯示在Display終端。打開客戶端Display終端界面,用lseek將內(nèi)部指針指向文件末尾,等待Client終端里的線程將消息寫入文件。一旦
9、有消息過來,就去文件里讀取數(shù)據(jù)并打印在Display終端。打開客戶端Client終端界面,有3個(gè)菜單,一個(gè)注冊(cè)、一個(gè)登陸、一個(gè)退出,選擇相應(yīng)項(xiàng)即可進(jìn)行相關(guān)操作,注冊(cè)和登錄如圖3-2、圖3-3。3.1.3 服務(wù)器端客戶端發(fā)送給服務(wù)器端使用的協(xié)議:1、all$msg,為給所有人發(fā)送消息。2、 直接輸入view$獲得在線用戶列表。3、 who$msg,給用戶名為“who”的用戶發(fā)送私聊消息。4、 trans$who$filename將文件傳輸給who。5、 reg為注冊(cè)。6、login為登陸。3.2 私聊實(shí)現(xiàn)原理3.2.1 客戶端客戶端在登陸成功,在發(fā)送消息之前可以先查看在線用戶列表,查看用戶列表使
10、用view$,如圖3-6。圖3-6 查看在線用戶接著,可以使用who$msg的形式發(fā)送私聊信息,意味著,這個(gè)消息是發(fā)送給who的。或者,先使用who$來切換到發(fā)送私聊消息,這個(gè)時(shí)候,你不需要加上協(xié)議,即可給who這個(gè)用戶發(fā)送消息,如圖3-7、圖3-8所示:圖3-7 cc向xdy發(fā)送信息圖3-8 xdy接收cc發(fā)來的信息當(dāng)然,上述方法也可實(shí)現(xiàn)一對(duì)多聊天,如圖3-9所示:圖3-9 一對(duì)多聊天這些消息都加上協(xié)議who來封裝成結(jié)構(gòu)體,再發(fā)送給服務(wù)器端。3.2.2 服務(wù)器端如果是私聊,則根據(jù)客戶端要發(fā)送到哪個(gè)用戶名的用戶,到鏈表里取得該用戶名的客戶端信息,服務(wù)器再發(fā)送給相應(yīng)的接受信息的客戶端。接受信息的
11、客戶終端就會(huì)先將信息保存到聊天記錄的文件里,并顯示接收到的信息,并且信息前面會(huì)顯示相應(yīng)的提示符。3.3 公聊實(shí)現(xiàn)原理3.3.1 客戶端客戶端在登陸成功之后,默認(rèn)就是all協(xié)議,可以直接發(fā)送公聊信息,不需要加上任何的協(xié)議,實(shí)現(xiàn)對(duì)所有人的人進(jìn)行聊天。命令為all$msg,給所有人發(fā)送消息?;蛘呦仁褂胊ll$來切換到給所有人發(fā)送消息,切換后,不需要加上協(xié)議即可發(fā)送了,如圖3-10、圖3-11所示:圖3-10 xdy發(fā)送公聊信息圖3-11 各用戶接收xdy的公聊信息這些消息都根據(jù)協(xié)議來封裝成結(jié)構(gòu)體,再發(fā)送給服務(wù)器端。3.3.2 服務(wù)器端如果是私聊,則根據(jù)客戶端要發(fā)送到哪個(gè)用戶名的用戶,到鏈表里取得該用
12、戶名的客戶端信息,服務(wù)器再發(fā)送給相應(yīng)的接受信息的客戶端。接受信息的客戶終端就會(huì)先將信息保存到聊天記錄的文件里,并顯示接收到的信息,并且信息前面會(huì)顯示相應(yīng)的提示符。3.4 文件傳輸實(shí)現(xiàn)原理3.4.1 客戶端如果某個(gè)客戶端想發(fā)送文件給其他客戶端,則直接使用命令trans$who$filename。Filename包括本地的路徑和文件名。Trans為協(xié)議,就是標(biāo)志為傳輸文件。Who就是發(fā)送給誰。Filename就是要發(fā)送的文件在本地的文件名。發(fā)送和接收文件如圖3-12、圖3-13所示:圖3-12 lr向xdy發(fā)送文件圖3-13 xdy接收lr發(fā)來的文件3.4.2 服務(wù)器端當(dāng)發(fā)送到服務(wù)器的時(shí)候,根據(jù)協(xié)
13、議,先給接收的客戶端發(fā)送一條消息為trans標(biāo)記:某某用戶給您發(fā)送了*文件,是否接受,Y接受N拒絕接受。當(dāng)客戶端按下N,則返回一條消息給服務(wù)器端,服務(wù)器端同時(shí)告訴發(fā)送的客戶端,對(duì)方拒絕接受文件。發(fā)送端可以接著繼續(xù)做其他的事情,私聊或者公聊。當(dāng)接收的客戶端按下Y,并立即接受保存的路徑和文件名。輸入完畢,就可以接受文件了??蛻舳朔祷匾粭l消息給服務(wù)器端,服務(wù)器端同時(shí)返回一條消息給發(fā)送的客戶端,告訴客戶端對(duì)方同意接受文件,這時(shí)候,文件開始傳輸,發(fā)送完畢后,發(fā)送的客戶端會(huì)顯示傳輸完畢。我們傳輸?shù)奈募侨我獾奈募?。不僅僅是文本文件,圖片也可以的。第4章 系統(tǒng)實(shí)現(xiàn)4.1 注冊(cè)與登錄系統(tǒng)實(shí)現(xiàn)1. 注冊(cè)的時(shí)候與
14、服務(wù)器的交互過程:請(qǐng)輸入你的用戶名:*請(qǐng)輸入密碼:*you pass : *請(qǐng)?jiān)俅屋斎朊艽a:*pass you : *正在等待服務(wù)器應(yīng)答.接到服務(wù)器發(fā)來的信息:注冊(cè)成功!2. 登陸的時(shí)候與服務(wù)器的交互過程:請(qǐng)輸入你的用戶名:*請(qǐng)輸入密碼:*正在等待服務(wù)器應(yīng)答.接到服務(wù)器發(fā)來的信息:登錄失敗!您還有2次機(jī)會(huì),之后將退出程序!請(qǐng)輸入你的用戶名:*請(qǐng)輸入密碼:*正在等待服務(wù)器應(yīng)答.接到服務(wù)器發(fā)來的信息:登錄成功!3. 退出:關(guān)閉socket,退出程序。4.2 聊天功能實(shí)現(xiàn)1、兩個(gè)用戶在私聊功能who$:*(聊天內(nèi)容)*Who就是發(fā)送給誰。2、公聊功能all$:*(聊天內(nèi)容)*功能實(shí)現(xiàn)展示如下圖4-3
15、-1所示:4.3 傳輸文件功能實(shí)現(xiàn)使用trans$who$filename格式傳送文件:Filename包括本地的路徑和文件名。 Trans為協(xié)議,就是標(biāo)志為傳輸文件。 Who就是發(fā)送給誰。Filename就是要發(fā)送的文件在本地的文件名???結(jié)本次課程設(shè)計(jì)順利完成了LINUX下聊天室工具的設(shè)計(jì),包括注冊(cè)、登記,私聊,公聊(群聊),傳送文件等功能,其中聊天時(shí)可用英文以及中文聊天;傳送文件時(shí)可以傳送文本、圖片等各種格式的文件,功能相對(duì)比較強(qiáng)大。在本次課程設(shè)計(jì)中,實(shí)現(xiàn)各個(gè)部分功能的程序都比較復(fù)雜,需要利用到LINUX下的socket網(wǎng)絡(luò)編程知識(shí)和大量編程技巧,編程過程中不斷用tcpdump,nets
16、tat,losf等網(wǎng)絡(luò)調(diào)試工具進(jìn)行調(diào)試程序。通過本次課程設(shè)計(jì),我們的軟件開發(fā)能力在一定程度上提高了,對(duì)LINUX程序設(shè)計(jì)這一門課程也有了比較深刻的了解。實(shí)驗(yàn)過程中我們也遇到了很多問題,但同伴們?cè)谝黄鹕逃懀ㄟ^上網(wǎng)查資料,圖書館查書,以及向指導(dǎo)老師請(qǐng)教,問題都一一解決。在我們不斷地努力下簡(jiǎn)單的LINUX下聊天工具終于完成,雖然很簡(jiǎn)單,但卻是我們團(tuán)隊(duì)不斷努力地結(jié)果,所以很有成就感。對(duì)于老師的課設(shè)要求我們的程序基本上都達(dá)到了,可以完成注冊(cè)、登記,私聊,公聊,傳送文件等基本功能。但由于時(shí)間有限界面沒能完成:而且也因?yàn)樗鶎W(xué)的知識(shí)較淺、不全面,對(duì)于較高的功能沒能實(shí)現(xiàn)。通過這次課設(shè)我們對(duì)LINUX程序設(shè)計(jì)這
17、門課有了更深的了解,加強(qiáng)了團(tuán)隊(duì)意識(shí),收獲很多??傊@次課程設(shè)計(jì)我們學(xué)到了很多知識(shí),讓我們明白了一個(gè)道理,付出和收獲成正比。附 錄:34/*check.h*/#include <fcntl.h>#include <sys/stat.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include &
18、lt;string.h>#include <pthread.h>#define MAXLEN 1024struct messagechar flag15;char name10;int size;char msgMAXLEN;int reg_check(struct message *recievemsg);int login_check(struct message *recievemsg);/*check.c*/#include "check.h"int reg_check(struct message *recievemsg)int fd;int r
19、ead_size,write_size;struct message cmpmsg;if(strlen(recievemsg->name)>10 | strlen(recievemsg->msg)>20 )return 1;if(strcmp(recievemsg->name,"all")=0)return -1;if(strcmp(recievemsg->name,"reg")=0)return -1;if(strcmp(recievemsg->name,"login")=0)return
20、-1;if(strcmp(recievemsg->name,"trans")=0)return -1;if(fd=open("user.txt",O_RDWR|O_CREAT|O_APPEND,0666)<0)perror("open");printf("openn");return -2;doif(read_size=read(fd,&cmpmsg,sizeof(cmpmsg) < 0)perror("read");close(fd);return -2;if(rea
21、d_size != sizeof(struct message) && read_size !=0)close(fd);return -2;if(strcmp(recievemsg->name,)=0)close(fd);return -1;while(read_size = sizeof(struct message);if(write_size=write(fd,recievemsg,sizeof(struct message)<0)perror("write");close(fd);return -2;while(wr
22、ite_size!=sizeof(struct message)/write_size = 0-writesize;lseek(fd,-write_size,SEEK_CUR);write_size=write(fd,recievemsg,sizeof(struct message);printf("write file successn");close(fd);return 0;int login_check(struct message *recievemsg)int fd;struct message cmpmsg;int read_size;if(fd=open(&
23、quot;user.txt",O_RDONLY)<0)perror("open");return -2;doif(read_size=read(fd,&cmpmsg,sizeof(struct message)<0)perror("read");close(fd);return -2;if(read_size != sizeof(struct message) && read_size!=0)close(fd);return -2;if(strcmp(recievemsg->name,cmpmsg.na
24、me)=0)&&(strcmp(recievemsg->msg,cmpmsg.msg)=0)close(fd);return 0;while(read_size>0);close(fd);return -1;/*void main()struct message sendmsg;printf("input name:n");gets();printf("input mima:n");gets(sendmsg.msg); printf("%dn",reg_check(&send
25、msg); / printf("%dn",login_check(&sendmsg);*/*client.c*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <signal.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h
26、>#include <errno.h>#include <pthread.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>#define MAXLEN 1024struct messagechar flag15;char name10;int size;char msgMAXLEN;struct msqlong msg_type;char msg_text5;int qid = -1,fd = -1,sockfd,savefilefd=-1;char
27、filefromname10;void handleQuit(int signal_no)if(fd > 0)close(fd);close(sockfd);if(qid > 0)if(msgctl(qid,IPC_RMID,NULL)<0)printf("消息隊(duì)列無法關(guān)閉n");exit(1);close(savefilefd);printf("程序正常退出n");raise(SIGQUIT);void cutStr(char str,char left,int n,char right,int m,char c)int i,k,j;
28、for(i = 0 ; i < n ;i+)if(stri = c)break;if(i = n)i = -1;elsememset(left,0,strlen(left);for(k = 0 ; k < i ; k+)leftk = strk;for(j = i+1 ; j < m;j+)if(strj = '0')break;rightj-i-1 = strj;lefti = '0'if(j < m)rightj-i-1 = '0'elserightm = '0'void handlesendfile(
29、void)struct message filedata;/printf("filefromname = %s n",filefromname);domemset(filedata.msg,0,sizeof(filedata.msg);filedata.size = read(savefilefd,filedata.msg,1000);strcpy(filedata.flag,"transf");strcpy(,filefromname);if (filedata.size = 0)printf("文件傳輸完畢n&qu
30、ot;);strcpy(filedata.msg,"end$");else if (filedata.size > 0)printf("filedata.msg = %sn",filedata.msg);send(sockfd,&filedata,sizeof(struct message),0);elseprintf("讀取文件失敗,文件傳輸中止n");break; while (filedata.size > 0);close(savefilefd);savefilefd = -1 ;void handlere
31、cvmsg(int *sockfd)int connfd = *sockfd;int nread;char buf1024;char str1024;struct message recvmsg;time_t timep;struct msq msg;if( fd = open("chatlog.txt",O_RDWR|O_CREAT|O_APPEND) < 0)printf("打開聊天記錄文件失敗!");exit(1);/printf("%dn",fd);if(qid = msgget(2222,IPC_CREAT|0666)
32、 = -1)printf("創(chuàng)建消息隊(duì)列失敗n");exit(1);msg.msg_type = getpid();strcpy(msg.msg_text,"OK");while(1)nread = recv(connfd,&recvmsg,sizeof(struct message),0);if(nread = 0)printf("與服務(wù)器斷開了連接n");close(fd);close(connfd);exit(0);else if (strcmp(recvmsg.flag,"all") = 0)tim
33、e (&timep);sprintf(str,"%s%s發(fā)給所有人:%snn",ctime(&timep),,recvmsg.msg);else if (strcmp(recvmsg.flag,"sermsg") = 0)time (&timep);printf("%s服務(wù)器發(fā)給所有人:%snn",ctime(&timep),recvmsg.msg);continue;else if (strcmp(recvmsg.flag,"view") = 0)time
34、(&timep);printf("%s當(dāng)前在線客戶端:n%snn",ctime(&timep),recvmsg.msg);continue;else if (strcmp(recvmsg.flag,"trans") = 0)pthread_t pid;if (strcmp(recvmsg.msg,"agree") = 0)strcpy(filefromname,);/創(chuàng)建線程發(fā)送文件pthread_create(&pid,NULL,(void *)handlesendfile,NULL)
35、;else if(strcmp(recvmsg.msg,"disagree") = 0)printf("對(duì)方拒絕接收文件n");close(savefilefd);savefilefd = -1;else if(strcmp(recvmsg.msg,"noexist") = 0)printf("該客戶端不存在n");close(savefilefd);savefilefd = -1;elsestrcpy(filefromname,);printf("%s向你請(qǐng)求傳名為%s文件,是否
36、同意接受?agree(同意)|disagree(不同意)n",,recvmsg.msg);savefilefd = 0;continue;else if(strcmp(recvmsg.flag,"transf") = 0)int n;if(strcmp(recvmsg.msg,"end$") = 0)printf("文件傳輸結(jié)束n");close(savefilefd);savefilefd = -1;continue;elsen=write(savefilefd,recvmsg.msg,recvms
37、g.size);/printf("recvmsg.msg = %sn",recvmsg.msg);while(n < recvmsg.size && n > 0) lseek(savefilefd,n,SEEK_CUR);n=write(savefilefd,recvmsg.msg,recvmsg.size);continue; elsetime (&timep); sprintf(str,"%s%s發(fā)來的私聊消息:%snn",ctime(&timep),,recvmsg.msg);wr
38、ite(fd,str,strlen(str);msgsnd(qid,&msg,sizeof(struct msq),0);int main(int argc,char *argv)struct sockaddr_in server_addr;int port;int do_number;struct message a;char strMAXLEN;char bufMAXLEN;pthread_t pid;if(argc != 3)printf("請(qǐng)輸入服務(wù)器IP和端口n");exit(1);port = atoi(argv2);if(sockfd = socket
39、(AF_INET,SOCK_STREAM,0) = -1)printf("創(chuàng)建socket失敗n");exit(1);signal(SIGINT,handleQuit);printf("-n");printf("| |n");printf("| input a number to work |n");printf("|t1.loginttt |n");printf("|t2.registertt |n");printf("|t3.exitttt |n");
40、printf("| |n");printf("-n");scanf("%d",&do_number);gets(str);while(do_number != 1 && do_number != 2 && do_number != 3)printf("你輸入的不是上面的選項(xiàng),請(qǐng)重新輸入:n");scanf("%d",&do_number);gets(str);if(do_number=3)close(sockfd);printf("程序已
41、退出!n");exit(0);bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(argv1);server_addr.sin_port = htons(port);if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr) = -1)printf("與服務(wù)器無響應(yīng),請(qǐng)隔一段時(shí)間再連接n&
42、quot;);exit(2);if(do_number =1)int n = 3;while(n)printf("請(qǐng)輸入你的用戶名:n");scanf("%s",);printf("請(qǐng)輸入密碼:n");scanf("%s",a.msg);strcpy(a.flag,"login");/a.flag3 = '0'send(sockfd,&a,sizeof(a),0);printf("正在等待服務(wù)器應(yīng)答.n");recv(sockfd,buf,
43、MAXLEN,0);printf("接到服務(wù)器發(fā)來的信息:%sn",buf);if(strcmp(buf,"登錄成功!") = 0)/int i,j,k;pthread_create(&pid,NULL,(void *)handlerecvmsg,(void *)&sockfd);gets(str);strcpy(a.flag,"all");while(1)memset(a.msg,0,strlen(a.msg);memset(str,0,strlen(str);gets(str);strcpy(buf,a.flag)
44、;cutStr(str,a.flag,15,a.msg,MAXLEN,'$');printf("標(biāo)志信息為:%sn",a.flag);if(strcmp(a.flag,"view") = 0)send(sockfd,&a,sizeof(a),0);strcpy(a.flag,buf);continue;else if (strcmp(a.flag,"trans") = 0) && (savefilefd <=0)/printf("f=%s,a=%s,s=%d",a.fl
45、ag,a.msg,savefilefd);if (strcmp(a.msg,"agree") = 0) && (savefilefd = 0)char savefilename20;/char savefileallname22;printf("請(qǐng)輸入保存的文件名,文件將保存在當(dāng)前目錄下!n");dogets(savefilename);savefilefd = open(savefilename,O_RDWR|O_CREAT|O_EXCL,0666);if(savefilefd = -1)printf("文件名可能存在請(qǐng)重新命
46、名.n");while(savefilefd = -1);if(savefilefd < 0)printf("創(chuàng)建文件失?。");savefilefd = -1;elsestrcpy(,filefromname);send(sockfd,&a,sizeof(a),0);/printf("agree :%s,%s,%sn",a.flag,,a.msg);elsememset(,0,strlen();memset(str,0,strlen(str);cutStr(a.msg,a.nam
47、e,10,str,MAXLEN,'$');if (str0 != '0' && 0 != '0')char transfileallname22;sprintf(transfileallname,"./%s",str);savefilefd = open(str,O_RDWR,0666);if(savefilefd < 0)printf("打開文件失敗!n");savefilefd = -1;elsememset(a.msg,0,strlen(a.msg);strcpy(a
48、.msg,str);send(sockfd,&a,sizeof(a),0);/printf("tansmit :%s,%s,%s",a.flag,,a.msg);elsestrcpy(a.msg,"disagree");strcpy(,filefromname);send(sockfd,&a,sizeof(a),0);/printf("disagree :%s,%s,%s",a.flag,,a.msg);strcpy(a.flag,buf);continue;if (strcmp(a
49、.flag,"trans") = 0)strcpy(a.flag,buf);send(sockfd,&a,sizeof(a),0);elsen-;printf("您還有%d次機(jī)會(huì),之后將推出程序!n",n); close(sockfd); exit(3); /登陸 else if(do_number =2) /registerint i =1 ;char username10;char password20;char password_t20;char temp20;printf("請(qǐng)輸入你的用戶名:n");scanf(&qu
50、ot;%s",username);while(i)printf("請(qǐng)輸入密碼:n");scanf("%s",password);printf("you pass : %sn",password);printf("請(qǐng)?jiān)俅屋斎朊艽a:n");scanf("%s",password_t);printf("pass you : %sn",password_t);if(strcmp(password, password_t) != 0)printf("輸入的密碼不一樣n");i = 1;elsei = 0;strcpy(,username);strcpy(a.msg,passwor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版高科技產(chǎn)品出口許可與合同履行協(xié)議3篇
- 二零二五版國(guó)際貿(mào)易合同擔(dān)保法風(fēng)險(xiǎn)管理合同3篇
- 碎石加工設(shè)備2025年度保險(xiǎn)合同2篇
- 二零二五版企業(yè)員工勞務(wù)派遣與員工福利保障合同3篇
- 二零二五年度糧食儲(chǔ)備與農(nóng)業(yè)產(chǎn)業(yè)化合作合同3篇
- 二零二五年度高層綜合樓公共收益分配管理合同3篇
- 二零二五年度校車運(yùn)營(yíng)服務(wù)與兒童座椅安全檢測(cè)合同3篇
- 二零二五版帶儲(chǔ)藏室裝修包售二手房合同范本3篇
- 二零二五年房地產(chǎn)合作開發(fā)與股權(quán)讓渡綜合合同2篇
- 二零二五年度花木種植與生態(tài)農(nóng)業(yè)園區(qū)建設(shè)合同3篇
- 畢淑敏心理咨詢手記在線閱讀
- 亞硝酸鈉安全標(biāo)簽
- pcs-985ts-x說明書國(guó)內(nèi)中文版
- GB 11887-2012首飾貴金屬純度的規(guī)定及命名方法
- 小品《天宮賀歲》臺(tái)詞劇本手稿
- 醫(yī)院患者傷口換藥操作課件
- 欠薪強(qiáng)制執(zhí)行申請(qǐng)書
- 礦山年中期開采重點(diǎn)規(guī)劃
- 資源庫建設(shè)項(xiàng)目技術(shù)規(guī)范匯編0716印刷版
- GC2級(jí)壓力管道安裝質(zhì)量保證體系文件編寫提綱
- 預(yù)應(yīng)力混凝土簡(jiǎn)支小箱梁大作業(yè)計(jì)算書
評(píng)論
0/150
提交評(píng)論