![Linux下C語言多線程,網(wǎng)絡(luò)通信簡單聊天程序_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f22262/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f222621.gif)
![Linux下C語言多線程,網(wǎng)絡(luò)通信簡單聊天程序_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f22262/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f222622.gif)
![Linux下C語言多線程,網(wǎng)絡(luò)通信簡單聊天程序_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f22262/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f222623.gif)
![Linux下C語言多線程,網(wǎng)絡(luò)通信簡單聊天程序_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f22262/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f222624.gif)
![Linux下C語言多線程,網(wǎng)絡(luò)通信簡單聊天程序_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f22262/ed2bdf5e-d8c3-48a7-9e44-6cfbf0f222625.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、LinuxLinux 下 C C 語言多線程,網(wǎng)絡(luò)通信簡單聊天程序功能描述:程序應(yīng)用多線程技術(shù),可是實(shí)現(xiàn) 1 1 對(duì) N N 進(jìn)行網(wǎng)絡(luò)通信聊天。但至今沒想出合適的退出機(jī)制,除了用 Ctr+CCtr+C。出于演示目的,這里采用 UNIXUNIX 域協(xié)議(文件系統(tǒng)套接字):程序分為客戶端和服務(wù)端。應(yīng)用 selectselect 函數(shù)來實(shí)現(xiàn)異步的讀寫操作。先說一下服務(wù)端:首先先創(chuàng)建套接字,然后綁定,接下進(jìn)入一個(gè)無限循環(huán),用acceptaccept 函數(shù),接受連接”請(qǐng)求,然后調(diào)用創(chuàng)建線程函數(shù),創(chuàng)造新的線程,進(jìn)入下一個(gè)循環(huán)。這樣每當(dāng)有一個(gè)新的連接”被接受都會(huì)創(chuàng)建一個(gè)新的線程,實(shí)現(xiàn) 1 1 對(duì) N N 的
2、網(wǎng)絡(luò)通信。在服務(wù)端程序中線程中用一個(gè) bufferbuffer 讀寫,為了避免錯(cuò)誤,這時(shí)就要給關(guān)鍵代碼加上互斥鎖work_mutexwork_mutex,具體見代碼。國 E E 服務(wù)端代碼1#include2#include3#include4#include5#include6#include7#include8#include/這里沒有用二進(jìn)制信號(hào)量可以刪掉910 charbuffer1024;/讀寫用的區(qū)域11 sem_tbin_sem;/沒用到的二進(jìn)制信號(hào)量,可以刪掉12 void*pthread_function(void*arg);/線程入口函數(shù)聲明13 pthread_mutex
3、_twork_mutex;/聲明互斥鎖1415 intmain()16 intresult;/整數(shù)變量用來儲(chǔ)存調(diào)用函數(shù)的返回值17 structsockaddr_unserver_address,client_address;/UNIX 域的套接字,server_address 用于服務(wù)端的監(jiān)聽,client_address 用于客戶端連接后的套接字18 intclient_len;/連接后,accept 函數(shù)會(huì)把客戶端的地址的長度儲(chǔ)存在這19 intserver_socketfd,client_socketfd;/服務(wù)端和客戶端的套接字文件描述符20pthread_ta_thread;/線程
4、 ID 標(biāo)志21pthread_attr_tthread_attr;被我注釋掉了,沒用到,可以刪掉。2223result=sem_init(&bin_sem,0,1);/初始化二進(jìn)制信號(hào)量,因?yàn)橛昧嘶コ怄i,所以沒用到,可以刪掉24if(result!=0)25perror(sem_init);26exit(EXIT_FAILURE);272829result=pthread_mutex_init(&work_mutex,NULL);初始化互斥鎖30if(result!=0)31perror(pthread_mutex_init);32exit(EXIT_FAILURE);333435serve
5、r_socketfd=socket(AF_UNIX,SOCK_STREAM,0);/創(chuàng)建套接字,用 TCP 連接方式,出于演示目的只用 UNIX 域套接字。3637server_address.sun_family=AF_UNIX;38strcpy(server_address.sun_path,server_socket);3940unlink(server_socket);/在綁定之前,把以前存在當(dāng)前目錄下的套接字刪除4142result=bind(server_socketfd,(structsockaddr*)&server_address,sizeof(server_address)
6、;/綁定43if(result!=0)44perror(bind);45exit(EXIT_FAILURE);4647個(gè)連接請(qǐng)求/線程的屬性,后面可以看的,48result=listen(server_socketfd,5);/監(jiān)聽,最多允許 549if(result!=0)50perror(listen);51exit(EXIT_FAILURE);525354client_len=sizeof(client_address);55while(1)/開始進(jìn)入無限循環(huán)56/*printf(Ifyouwanttoquit,pleaseenterquitn);57printf(Doyouwantto
7、acceptaconnectiongn);58memset(buffer,0,sizeof(buffer);59fgets(buffer,sizeof(buffer),stdin);60if(strncmp(quit,buffer,4)=0)break;*/6162client_socketfd=accept(server_socketfd,(structsockaddr*)&client_address,&client_len);/接受一個(gè)連接請(qǐng)求6364/*result=pthread_attr_init(&thread_attr);65if(result!=0)66perror(pthr
8、ead_attr_init);67exit(EXIT_FAILURE);6869result=pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);70if(result!=0)71perror(pthread_attr_setdetachstate);72exit(EXIT_FAILURE);73*/74result=pthread_create(&a_thread,NULL,pthread_function,(void*)client_socketfd);/成功接受一個(gè)請(qǐng)求后,就會(huì)創(chuàng)建一個(gè)線程,然后主線程又進(jìn)入
9、accept 函數(shù),如果此時(shí)沒有連接請(qǐng)求,那么主線程會(huì)阻塞75if(result!=0)76perror(pthread_create);77exit(EXIT_FAILURE);787980818283void*pthread_function(void*arg)/線程入口函數(shù),每調(diào)用一次 pthread_create,都會(huì)創(chuàng)建一個(gè)新的線程84intfd=(int)arg;/把函數(shù)參數(shù),即連接成功后的套接字,賦給 fd.85intresult;86fd_setread_fds;/文件描述符集合,用于 select 函數(shù)87intmax_fds;/文件描述符集合的最大數(shù)8889printf(%
10、didhasconnected!n,fd);90while(1)9192FD_ZERO(&read_fds);/清空集合93FD_SET(0,&read_fds);/將標(biāo)準(zhǔn)輸入放入監(jiān)聽的文件描述符集合,這個(gè)用于讀取標(biāo)準(zhǔn)輸入,即鍵盤的輸入94FD_SET(fd,&read_fds);/將連接后的客戶文件描述符放入監(jiān)聽的文件描述符集合,這個(gè)用于向客戶端讀取數(shù)據(jù)95max_fds=fd+1;9697/sem_wait(&bin_sem);98pthread_mutex_lock(&work_mutex);/對(duì)關(guān)鍵區(qū)域上鎖99printf(%dhasgetthelockn,fd);100result=
11、select(max_fds,&read_fds,(fd_set*)NULL,(fd_set*)NULL,(structtimeval*)NULL);/開始監(jiān)聽那些文件描述符出于可讀狀態(tài)101if(result1)102printf(select);103104if(FD_ISSET(0,&read_fds)/如果標(biāo)準(zhǔn)輸入處于可讀狀態(tài),說明鍵盤有所輸入,將輸入的數(shù)據(jù)存放在 buffer 中,然后向客戶端寫回,如果輸入“quit”將會(huì)退出一個(gè)聊天線程讀,那么讀取存放在 buffer 中,然后顯示出來,如果對(duì)方中斷聊天,那么rememset(buffer,0,sizeof(buffer);resu
12、lt=read(fd,buffer,sizeof(buffer);if(result=-1)perror(read);exit(EXIT_FAILURE);elseif(result=0)printf(Theothersidehasterminalthec/sem_post(&bin_sem);pthread_mutex_unlock(&work_mutex);break;elseprintf(receivemessage:%s,buffer);138pthread_mutex_unlock(&work_mutex);/解鎖sleep(1);/如果沒有這一行,當(dāng)前線程會(huì)一直占據(jù) buffer.
13、105memset(buffer,0,sizeof(buffer);/保險(xiǎn)起見,清零106107108109110111112113114115116117118119120fgets(buffer,if(strncmp(printf(sizeof(buffer),quit,buffer,stdin);4)=0)Youhaveterminaledthechatn);121/sem_post(&bin_sem);pthread_mutex_unlock(&work_mutex);break;elseresult=write(fd,buffer,if(result=-1)perror(write)
14、;exit(EXIT_FAILURE);if(FD_ISSET(fd,&read_fds)sizeof(buffer);/如果客戶套接字符可sult=0122123124125126127128129hatn);130131132133134135136137139讓當(dāng)前線程暫停一秒可以實(shí)現(xiàn) 1 對(duì) N 的功能140/sem_post(&bin_sem);141/sleep(1);142)143/printf(Iamheren);144close(fd);145pthread_exit(NULL);146147)148讀者可以對(duì)比一下http:/ N N 個(gè)人進(jìn)行聊天, 盡管有些 bug(bu
15、g(如果客戶端對(duì)方回復(fù)太快太頻繁, 服務(wù)端的鎖就會(huì)切換來切換去,無法回復(fù)到正確的客戶端)??蛻舳烁?wù)端很像,但比較簡單。這里面就不注釋了。這兩個(gè)程序我都運(yùn)行過。沒什么基本大的問題。但是功能很不完善。還需改進(jìn)。國 E E 客戶端代碼1 #include2 #include3 #include4 #include5 #include6 #include7 #include89 intmain()10 intresult;11 intsocketfd;12 intlen;13 structsockaddr_unaddress;14 fd_setread_fds,test_fds;15 intfd;
16、16 intmax_fds;17 charbuffer1024;1819 socketfd=socket(AF_UNIX,SOCK_STREAM,0);2021 address.sun_family=AF_UNIX;22 strcpy(address.sun_path,server_socket);23len=sizeof(address);2425result=connect(socketfd,(structsockaddr*)&address,len);26if(result=-1)27perror(connect);28exit(EXIT_FAILURE);293031FD_ZERO(&
17、read_fds);32FD_SET(0,&read_fds);33FD_SET(socketfd,&read_fds);34max_fds=socketfd+1;3536printf(Chatnow!n);3738while(1)39test_fds=read_fds;40result=select(max_fds,&test_fds,(fd_set*)NULif(result1)perror(select);exit(EXIT_FAILURE);if(FD_ISSET(0,&test_fds)memset(buffer,0,sizeof(buffer);/printf(send:);fgets(buffer,sizeof(buffer),stdin);if(strncmp(quit,buffer,4)=0)printf(nYouaregoingtoquitn);break;result=write(socketfd,buffer,sizeof(buffeif(result=-1)perror(write);exit(EXIT_FAILURE);if(FD_ISSET(socketfd,&test_fds)memset(buffer,0,sizeof(buffer);result=read(socketfd,buffer,s
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球5C超快充電池行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國火藥量器行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025融資買賣合同范文
- 酒水購銷合同模板
- 分期付款買賣合同參考范文
- 2025太原市購房合同范本范文
- 水果長期供應(yīng)購銷合同范本
- 2025廚房設(shè)備購買合同樣本
- 燈具購銷合同書范本
- 探索未知世界主題班會(huì)
- 2024年中考語文 (湖北專用)專題一 字音、字形課件
- T-ACEF 095-2023 揮發(fā)性有機(jī)物泄漏檢測(cè)紅外成像儀(OGI)技術(shù)要求及監(jiān)測(cè)規(guī)范
- 2023年全國高考乙卷歷史真題試卷及答案
- 骨科手術(shù)的術(shù)后飲食和營養(yǎng)指導(dǎo)
- 旅游定制師入行培訓(xùn)方案
- 2024年中國南方航空股份有限公司招聘筆試參考題庫含答案解析
- 六年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題100題
- 個(gè)人代賣協(xié)議
- 賞析小說語言(二)
- 【立高食品公司的償債能力現(xiàn)狀及問題分析(論文9000字)】
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
評(píng)論
0/150
提交評(píng)論