付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、LinuxLinux 下 C C 語言多線程,網(wǎng)絡(luò)通信簡單聊天程序功能描述:程序應用多線程技術(shù),可是實現(xiàn) 1 1 對 N N 進行網(wǎng)絡(luò)通信聊天。但至今沒想出合適的退出機制,除了用 Ctr+CCtr+C。出于演示目的,這里采用 UNIXUNIX 域協(xié)議(文件系統(tǒng)套接字):程序分為客戶端和服務(wù)端。應用 selectselect 函數(shù)來實現(xiàn)異步的讀寫操作。先說一下服務(wù)端:首先先創(chuàng)建套接字,然后綁定,接下進入一個無限循環(huán),用acceptaccept 函數(shù),接受連接”請求,然后調(diào)用創(chuàng)建線程函數(shù),創(chuàng)造新的線程,進入下一個循環(huán)。這樣每當有一個新的連接”被接受都會創(chuàng)建一個新的線程,實現(xiàn) 1 1 對 N N 的
2、網(wǎng)絡(luò)通信。在服務(wù)端程序中線程中用一個 bufferbuffer 讀寫,為了避免錯誤,這時就要給關(guān)鍵代碼加上互斥鎖work_mutexwork_mutex,具體見代碼。國 E E 服務(wù)端代碼1#include2#include3#include4#include5#include6#include7#include8#include/這里沒有用二進制信號量可以刪掉910 charbuffer1024;/讀寫用的區(qū)域11 sem_tbin_sem;/沒用到的二進制信號量,可以刪掉12 void*pthread_function(void*arg);/線程入口函數(shù)聲明13 pthread_mutex
3、_twork_mutex;/聲明互斥鎖1415 intmain()16 intresult;/整數(shù)變量用來儲存調(diào)用函數(shù)的返回值17 structsockaddr_unserver_address,client_address;/UNIX 域的套接字,server_address 用于服務(wù)端的監(jiān)聽,client_address 用于客戶端連接后的套接字18 intclient_len;/連接后,accept 函數(shù)會把客戶端的地址的長度儲存在這19 intserver_socketfd,client_socketfd;/服務(wù)端和客戶端的套接字文件描述符20pthread_ta_thread;/線程
4、 ID 標志21pthread_attr_tthread_attr;被我注釋掉了,沒用到,可以刪掉。2223result=sem_init(&bin_sem,0,1);/初始化二進制信號量,因為用了互斥鎖,所以沒用到,可以刪掉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);/在綁定之前,把以前存在當前目錄下的套接字刪除4142result=bind(server_socketfd,(structsockaddr*)&server_address,sizeof(server_address)
6、;/綁定43if(result!=0)44perror(bind);45exit(EXIT_FAILURE);4647個連接請求/線程的屬性,后面可以看的,48result=listen(server_socketfd,5);/監(jiān)聽,最多允許 549if(result!=0)50perror(listen);51exit(EXIT_FAILURE);525354client_len=sizeof(client_address);55while(1)/開始進入無限循環(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);/接受一個連接請求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);/成功接受一個請求后,就會創(chuàng)建一個線程,然后主線程又進入
9、accept 函數(shù),如果此時沒有連接請求,那么主線程會阻塞75if(result!=0)76perror(pthread_create);77exit(EXIT_FAILURE);787980818283void*pthread_function(void*arg)/線程入口函數(shù),每調(diào)用一次 pthread_create,都會創(chuàng)建一個新的線程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);/將標準輸入放入監(jiān)聽的文件描述符集合,這個用于讀取標準輸入,即鍵盤的輸入94FD_SET(fd,&read_fds);/將連接后的客戶文件描述符放入監(jiān)聽的文件描述符集合,這個用于向客戶端讀取數(shù)據(jù)95max_fds=fd+1;9697/sem_wait(&bin_sem);98pthread_mutex_lock(&work_mutex);/對關(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)/如果標準輸入處于可讀狀態(tài),說明鍵盤有所輸入,將輸入的數(shù)據(jù)存放在 buffer 中,然后向客戶端寫回,如果輸入“quit”將會退出一個聊天線程讀,那么讀取存放在 buffer 中,然后顯示出來,如果對方中斷聊天,那么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);/如果沒有這一行,當前線程會一直占據(jù) buffer.
13、105memset(buffer,0,sizeof(buffer);/保險起見,清零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讓當前線程暫停一秒可以實現(xiàn) 1 對 N 的功能140/sem_post(&bin_sem);141/sleep(1);142)143/printf(Iamheren);144close(fd);145pthread_exit(NULL);146147)148讀者可以對比一下http:/ N N 個人進行聊天, 盡管有些 bug(bu
15、g(如果客戶端對方回復太快太頻繁, 服務(wù)端的鎖就會切換來切換去,無法回復到正確的客戶端)??蛻舳烁?wù)端很像,但比較簡單。這里面就不注釋了。這兩個程序我都運行過。沒什么基本大的問題。但是功能很不完善。還需改進。國 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工環(huán)境保護意識培訓
- 員工時間管理培訓
- 倉儲現(xiàn)場員工培訓
- 倉儲崗位培訓課件
- 基金行業(yè)銷售技巧培訓
- 文印項目經(jīng)理崗位責任制度
- 員工基礎(chǔ)技能培訓
- 基礎(chǔ)花藝培訓
- 員工培訓課程設(shè)計
- 員工培訓講解步驟
- 七大浪費考試試卷及答案
- GB/T 10810.1-2025眼鏡鏡片第1部分:單焦和多焦
- 新版GCP培訓課件
- 客戶開發(fā)流程圖
- 音樂節(jié)活動場地租賃合同
- 風險管理顧問協(xié)議
- 一年級下冊字帖筆順
- 2024屆高考語文復習:散文訓練王劍冰散文(含解析)
- SWITCH暗黑破壞神3超級金手指修改 版本號:2.7.7.92380
- 二尖瓣狹窄講課課件
- 腸造瘺術(shù)后護理查房
評論
0/150
提交評論