freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于c語(yǔ)言的局域網(wǎng)聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)論文-閱讀頁(yè)

2024-11-28 06:26本頁(yè)面
  

【正文】 。i 30。 } } void* do_service(void* arg) //使用這個(gè)線程進(jìn)行 ,登錄注冊(cè)業(yè)務(wù) ,如果登錄成功 ,則添加 fd 到順序表中 { long fd = (long)*((int *)arg)。 int len。 char passwd[15]。 len = read(fd, buff, sizeof(buff))。 close(fd)。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 18 deletefdname(fd)。 }else if(len == 0){ close(fd)。 deletefdname(fd)。 } else { if(strstr(buff, Reg) != NULL) //收到注冊(cè)信息 ,分離出 name,passwd { char swapname[20]。 int size = strlen(swappasswd)。 strncpy(swapname, buff, (strlen(buff) strlen(swappasswd)))。\039。\039。 int Reg = Regmsgwrite(name, passwd)。 write(fd, buff, sizeof(buff))。 write(fd, buff, sizeof(buff))。 write(fd, buff, sizeof(buff))。 char* swappasswd = strstr(buff, Passwd)。 strcpy(passwd, swappasswd+8)。 swapname[strlen(buff) strlen(swappasswd)] = 39。 //strncpy 需要手動(dòng)在末尾添加 39。 strcpy(name, swapname+9)。 if(Log == 0){ //登錄失敗 strcpy(buff, Log:error)。 }else if(Log == 1){ //登錄成功 //將客戶(hù)端 fd 添加到數(shù)組里面 add_fd_v(v, fd)。 //返回客戶(hù)端 name 登錄信息 strcat(buff, name)。 //綁定 name 到數(shù)組的 fd printf(%s 成功登錄 \t,name)。 write(fd, buff, sizeof(buff))。 write(fd, buff, sizeof(buff))。 write(fd, buff, sizeof(buff))。amp。 char *str = ctime(amp。 strcat(buff, time:)。 //信息加上時(shí)間戳 int i。i vcount。 } } } if(strstr(buff, who) amp。 strstr(buff, chat:) amp。 strstr(buff, :)){ //私聊內(nèi)容的實(shí)現(xiàn) 解析要發(fā)送給誰(shuí) char *swapa1 = strstr(buff, chat:)。 strcpy(a1, swapa1)。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 21 char a2[1024]。 char a3[1024]。 a3[strlen(a1) strlen(a2)] = 39。 strcpy(a3, a3+7)。 time_t t = time(0)。t)。 strcat(buff, str)。 } } //else } //while return (void*)0。 if((fd = open(, O_CREAT|O_RDWR|O_APPEND,0644)) 0) sys_error(open, errno)。 memset(amp。 int flag = 0。Reg, sizeof(Reg))。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 22 return 0。 strcpy(, name)。 if(write(fd, amp。 return 1。 } if(size 0) flag++。 } close(fd)。 } int Logmsgwrite(const char*name, const char* passwd) //處理用戶(hù)登錄 { int fd。 struct Regmsg Log。Log, 0, sizeof(Log))。Log, sizeof(Log))。 return 0。 } if(size 0){ if((strcmp(, name) == 0) amp。 \ (strcmp(, passwd) == 0)) //用戶(hù)名密碼匹配 return 1。amp。 } } close(fd)。 } int main(int argc, char** argv) { if(argc 2) sys_error(argc, errno)。 printf(===================================\n)。 printf(===================================\n\n)。 //建立順序表 v = create_fd_v()。 for(i = 0。i++) //初始化指針數(shù)組 存 fd 對(duì)應(yīng) name fdname[i] = 。 if(sockfd 0) sys_error(socket, errno)。 memset(amp。 = AF_INET。 = INADDR_ANY。 if(bind(sockfd, (struct sockaddr*)amp。 //4. if(listen(sockfd, 10) 0) sys_error(listen, errno)。 //5. while(1){ int clientfd = accept(sockfd, NULL, NULL)。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 25 pthread_t th。th, NULL, do_service, (void*)amp。 pthread_detach(th)。 } 服務(wù)器的啟動(dòng)截圖如圖 61 圖 62 所示 圖 61 服務(wù)器端啟動(dòng)成功 圖 62 已成功登陸的用戶(hù)在服務(wù)器端進(jìn)行顯示 用戶(hù)注冊(cè) 客戶(hù)端的 用戶(hù)發(fā)送注冊(cè)請(qǐng)求 , 實(shí)質(zhì)上是給服務(wù)器發(fā)送 reg 協(xié)議 , 服務(wù)器是根據(jù)該協(xié)議來(lái)判斷用戶(hù)的請(qǐng)求是什么服務(wù) , 當(dāng)判斷是注冊(cè)請(qǐng)求時(shí) , 運(yùn)行相應(yīng)的注冊(cè)代碼 進(jìn)行注冊(cè)判斷,比如用戶(hù)名是否可以以被注冊(cè),以及兩次的密碼是否相同,注冊(cè)判斷通過(guò),就將用戶(hù)名密碼寫(xiě)入 文件中 。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 26 if((fd = open(, O_CREAT|O_RDWR|O_APPEND,0644)) 0) sys_error(open, errno)。 memset(amp。 int flag = 0。Reg, sizeof(Reg))。 return 0。 strcpy(, name)。 if(write(fd, amp。 return 1。 } if(size 0) flag++。 } close(fd)。 } 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 27 用戶(hù)注冊(cè)成功如圖 63 所示。 int Logmsgwrite(const char*name, const char* passwd) //處理用戶(hù)登錄 { int fd。 struct Regmsg Log。Log, 0, sizeof(Log))。Log, sizeof(Log))。 return 0。 } if(size 0){ if((strcmp(, name) == 0) amp。 \ (strcmp(, passwd) == 0)) //用戶(hù)名密碼匹配 return 1。amp。 } } close(fd)。 } while(1){ if(read(sockfd, buff, sizeof(buff)) 0) sys_error(client read, errno)。 printf(恭喜您注冊(cè)成功 !\n)。 } if(strcmp(buff, Reg:error) == 0) { close(sockfd)。 break。 printf(用戶(hù)名重復(fù) ,注冊(cè)失敗 !\n)。 } } if(strstr(buff, Log)){ //登錄結(jié)果 if(strstr(buff, Log:successed) != NULL) { printf(恭喜您登錄成功 !\n)。 strcpy(buff, buff+14)。 break。 printf(很抱歉登錄失敗 !\n)。 } if(strcmp(buff, Log:username) == 0) { close(sockfd)。 break。 printf(用戶(hù)名存在 ,密碼不匹配 !\n)。 } } } 成功登陸的截圖如圖 64 所示: 圖 64 登陸成功 私聊 群聊的實(shí)現(xiàn) 群聊的協(xié)議為 who, 私聊的協(xié)議為 chat, 服務(wù)器通過(guò)這兩個(gè)協(xié)議來(lái)判斷該用戶(hù)的請(qǐng)求是私聊請(qǐng)求還是群聊請(qǐng)求 , 如果是群聊請(qǐng)求 , 就將該用戶(hù)的信息 ,通過(guò)循環(huán)順序表的方式發(fā)送給每一個(gè)在線用戶(hù),如果是私聊請(qǐng)求,則將該信息通過(guò)制定 socketfd 的方式制定給特定的用戶(hù)。 int size。 char chat[1024]={0}。 while(1){ size = read(sockfd, buff, sizeof(buff))。 }else if(size == 0){ printf(服務(wù)器斷開(kāi)連接 \n)。 exit(1)。amp。 strcpy(time, timeswap)。 //解析時(shí)間 char* chatswap = strstr(buff, chat:)。 strncpy(name, buff, strlen(buff)strlen(chatswap))。\039。 //解析用戶(hù)名 strncpy(chat, buff, strlen(buff)strlen(timeswap))。\039。 //解析聊天內(nèi)容 printf(%s 在群聊中說(shuō) :%s, Time:%s,name,chat,time)。amp。 strcpy(time, timeswap)。 //解析時(shí)間 char* chatswap = strstr(buff, chat:)。 strncpy(name, buff, strlen(buff)strlen(chatswap))。\039。 //解析用戶(hù)名 char* chatswap1 = strstr(buff, :)。 strncpy(chat, chat, strlen(chat)strlen(timeswap))。\039。 //解析聊天內(nèi)容 printf(%s 給你發(fā)送了一條悄悄話 :%s, Time:%s, name, chat, time)。 } 群聊的實(shí)現(xiàn)截圖如圖 65 圖 66 所示,私聊的實(shí)現(xiàn)如圖 所示。換句話說(shuō),軟件測(cè)試是一種實(shí)際輸出與預(yù)期輸出間的審核或者比較過(guò)程。 軟件測(cè)試原理 測(cè)試主要依據(jù)是被試系統(tǒng)的研制任務(wù)書(shū)和技術(shù)規(guī)格書(shū),是對(duì)軟件雄體功能和性能的綜合測(cè)試與評(píng)估?;谲浖墓残?,對(duì)于軟件的測(cè)試要遵循一般軟件的測(cè)試原理和方法。 測(cè)試用例的合理性對(duì)于軟件的測(cè)試與評(píng)估具有關(guān)鍵作用,而如何使設(shè)計(jì)的用例、合理并且典型有效并不容易。另一方面,軟件運(yùn)行環(huán)境的復(fù)雜程度對(duì)軟件評(píng)估具有重要作用,所以應(yīng)產(chǎn)生盡量逼真的運(yùn)行背景以便于研究。 職場(chǎng)大變樣社區(qū)( ):下載畢業(yè)設(shè)計(jì)成品 35 圖 71 軟件測(cè)試 周期 示意圖 軟件測(cè)試的方法 軟件測(cè)試的方法和技術(shù)是多種多樣的。從測(cè)試是否針對(duì)系統(tǒng)的內(nèi)部結(jié)構(gòu)和具體實(shí)現(xiàn)算法的角度來(lái)看,可分為白盒測(cè)試和黑盒測(cè)試
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1