編寫一個使用UDP的服務(wù)端和用戶端程序_第1頁
編寫一個使用UDP的服務(wù)端和用戶端程序_第2頁
編寫一個使用UDP的服務(wù)端和用戶端程序_第3頁
編寫一個使用UDP的服務(wù)端和用戶端程序_第4頁
編寫一個使用UDP的服務(wù)端和用戶端程序_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

北方民族大學(xué)課程設(shè)計報告系(部、中心)計算機(jī)科學(xué)與工程學(xué)院課程名稱計算機(jī)操作系統(tǒng)設(shè)計題目名稱基于SOCKETUDP套接字的信息通信程序成績指導(dǎo)教師簽名北方民族大學(xué)教務(wù)處制TOC\o"1-5"\h\z1、課程設(shè)計說明21.1LINUX下基于的UDP的簡單字符通信程序21.2課程設(shè)計要求2\o"CurrentDocument"1.3系統(tǒng)原理介紹2\o"CurrentDocument"2、課程設(shè)計過程32.1系統(tǒng)調(diào)用32.2流程圖3、運行后44、結(jié)束語5\o"CurrentDocument"5、原程序代碼5\o"CurrentDocument"參考資料121、課程設(shè)計說明1.1LINUX下基于的UDP的簡單字符通信程序基于該連接的字符通信程序需要具備服務(wù)器端(Server),客戶端(Client)。1.2課程設(shè)計要求這次課程設(shè)計完一個簡單的通信程序,程序分為服務(wù)端和客戶端,通過調(diào)用系統(tǒng)的SOCKET套接字實現(xiàn)兩臺主機(jī)的通信。通過創(chuàng)建一個接收的字線程,實現(xiàn)兩個功能的并發(fā)執(zhí)行,所以程序可以隨時接收和發(fā)送字符信息。1.3系統(tǒng)原理介紹由于在默認(rèn)情況下WinSock接口的recvfrom()和sendto()都會在被調(diào)用時阻塞當(dāng)前線程,也就是說如果程序正在接受其他用戶發(fā)來的數(shù)據(jù),那么它就不能夠執(zhí)行發(fā)送數(shù)據(jù)的任務(wù),反之相同。也就是說,在程序中創(chuàng)建兩個線程,一個線程負(fù)責(zé)發(fā)送消息,另一個消息負(fù)責(zé)接受消息。兩個線程交替運行,從而達(dá)到同時收發(fā)消息的目的。當(dāng)然采用多線程方式解決消息收發(fā)同步問題可以移除上個程序中每個用戶一次只能發(fā)送一條消息的限制。sendto()和recvfrom()用于在無連接的數(shù)據(jù)報socket方式下進(jìn)行數(shù)據(jù)傳輸。由于本地socket并沒有與遠(yuǎn)端機(jī)器建立連接,所以在發(fā)送數(shù)據(jù)時應(yīng)指明目的地址。2、課程設(shè)計過程2.1系統(tǒng)調(diào)用Socket用于創(chuàng)建套接字函數(shù)原型為:SOCKETPASCALFARsocket(intaf,inttype,intprtocol);參數(shù)af指定通信發(fā)生的區(qū)域,一般為AF_INET。參數(shù)type描述要建立的套接字類型,也就是指流式套接字還是數(shù)據(jù)報套接字。參數(shù)protocl說明該套接字使用的特定類型。sendto()函數(shù)原型為:intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);該函數(shù)比send()函數(shù)多了兩個參數(shù),to表示目地機(jī)的IP地址和端口號信息,而tolen常常被賦值為sizeof(structsockaddr)。Sendto函數(shù)也返回實際發(fā)送的數(shù)據(jù)字節(jié)長度或在出現(xiàn)發(fā)送錯誤時返回-1。Recvfrom()函數(shù)原型為:intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);from是一個structsockaddr類型的變量,該變量保存源機(jī)的IP地址及端口號。fromlen常置為sizeof(structsockaddr)。當(dāng)recvfrom()返回時,fromlen包含實際存入from中的數(shù)據(jù)字節(jié)數(shù)。Recvfrom()函數(shù)返回接收到的字節(jié)數(shù)或當(dāng)出現(xiàn)錯誤時返回-1,并置相應(yīng)的errno。如果你對數(shù)據(jù)報socket調(diào)用了connect()函數(shù)時,你也可以利用send()和recv()進(jìn)行數(shù)據(jù)傳輸,但該socket仍然是數(shù)據(jù)報socket,并且利用傳輸層的UDP服務(wù)。但在發(fā)送或接收數(shù)據(jù)報時,內(nèi)核會自動為之加上目地和源地址信息。當(dāng)所有的數(shù)據(jù)操作結(jié)束以后,你可以調(diào)用close()函數(shù)來釋放該socket,從而停止在該socket上的任何數(shù)據(jù)操作:close(sockfd);bind()函數(shù)原型為:intbind(SOCKETs,conststroutsockaddrFAR*name,intnamelen);參數(shù)s是由socket()函數(shù)調(diào)用返回的并且未作連接的套接句柄。參數(shù)name是賦給套接字s的本地地址,其長度是可變的。參數(shù)namelen指參數(shù)name的長度。

connect()函數(shù)用于建立套接字的連接函數(shù)原型為:intconnect(SOCKETs,conststructscokaddrFAR*name,intnamelen);參數(shù)s是要建立連接的本地套接字的句柄。參數(shù)name指對方套接字地址結(jié)構(gòu)的指針,對方套接字的地址長度由參數(shù)namelen說明。accept()函數(shù)原型為:Socketaccept(SOCKETs,structsockaddraddr,intaddrlen);參數(shù)s為本地套接字的句柄。參數(shù)addr是指客戶方套接字地址結(jié)構(gòu)的指針,用來接收實體的地址,addr的確切格式由套接字創(chuàng)建時建立的地址簇決定。參數(shù)addrlen為客戶方套接字地址的長度。2.2流程圖文件(£)偏輯CD查看任)終轍D待劍幫助(H)[TtJiu^lucaIhfls1ftJig]3i./subweicom127.0.0J-dmifang:-ditifang:你好!你好DWE:尚甲也.:查看①終情⑴覆到國指助曲[feng^loca[hastfejigjSL/sev127.0.0.Ihaverujinected你好duEf卯g:你好4、總結(jié)與體會通過這次的設(shè)計自己了解到在LINUX上進(jìn)行的網(wǎng)絡(luò)通信SOCKET原理,和線程的創(chuàng)建和使用方法加深了自己對LINUX操作系統(tǒng)的理解。5、原程序代碼客戶端#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<pthread.h>#include<stdio.h>#include<errno.h>#include<unistd.h>#defineMAX100voidrecvf(void*sock){intn;int*socked=(int*)sock;charmes[MAX];charbuffer[100];while(1){bzero(buffer,100);bzero(mes,100);n=recvfrom(*socked,mes,MAX,0,NULL,NULL);if(n==-1){printf("recvfailed");}sprintf(buffer,"%s%s”,"duifang:",mes);printf("%s\n”,buffer);}}intmain(void){pthread_tid;charbuffer[MAX];bzero(buffer,MAX);charhow[]="successedinsendingdatafromsbufunction!\n";intn,numto,addrlen;structsockaddr_inaddr;intsockfd,port,num,rnum;charrebuffer[MAX];port=5000;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"socketerror:%s\n”,strerror(errno));}bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(port);if(inet_aton(〃127.0.0.1〃,&addr.sin_addr)<0){fprintf(stderr,"iperror:%s\n”,strerror(errno));}numto=sendto(sockfd,how,strlen(how),0,(structsockaddr*)&addr,sizeof(structsockaddr));if(numto==-1){printf("sendfailed.\n〃);}bzero(buffer,MAX);n=recvfrom(sockfd,buffer,MAX,0,NULL,NULL);if(n<0){printf("rescvfailed\n");}printf("%s\n",buffer);pthread_create(&id,NULL,(void*)recvf,(void*)&sockfd);while(1){bzero(how,MAX);fgets(how,MAX,stdin);numto=sendto(sockfd,how,strlen(how),0,(structsockaddr*)&addr,sizeof(structsockaddr));if(numto==-1){printf("sendfailed.\n");{}close(sockfd);}服務(wù)端#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<stdio.h>#include<errno.h>#include<pthread.h>#include<curses.h>#defineSERVER_PORT5000#defineMAX100voidrecvf(void*sock){intn;int*socked=(int*)sock;charmes[MAX];charbuffer[100];while(1){bzero(buffer,100);bzero(mes,100);n=recvfrom(*socked,mes,MAX,0,NULL,NULL);if(n==-1){printf("recvfailed");}sprintf(buffer,"%s%s”,"duifang:",mes);printf("%s”,buffer);}}intmain(void){intaddrlen,n;charmsg[MAX];intsen;bzero(msg,MAX);charsentstr[MAX];bzero(sentstr,MAX);intsockfd;structsockaddr_inaddr;pthread_trecvs;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd<0){fprintf(stderr,"SocketError:%s\n”,strerror(errno));}bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(SERVER_PORT);addr.sin_addr.s_addr=INADDR_ANY;if(bind(sockfd,(structsockaddr*)&addr,sizeof(structsockaddr))<0){fprintf(stderr,"BindError:%s\n”,strerror(errno));}n=recvfrom(sockfd,msg,MAX,0,(structsockaddr*)&addr,&addrlen);if(n==-1){printf("recverror1");}fprintf(stdout,"%shaveconnected”,inet_ntoa(addr.sin_addr));sprintf(sentstr,"welcom%s”,inet_ntoa(addr.sin_addr));n=pthread_create(&recvs,NULL,(void*)recvf,(void*)&sockfd);sen=sendto(sockfd,sentstr,MAX,0,(structsockaddr*)&addr,addrlen);i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論