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

下載本文檔

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

文檔簡(jiǎn)介

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

connect()函數(shù)用于建立套接字的連接函數(shù)原型為:intconnect(SOCKETs,conststructscokaddrFAR*name,intnamelen);參數(shù)s是要建立連接的本地套接字的句柄。參數(shù)name指對(duì)方套接字地址結(jié)構(gòu)的指針,對(duì)方套接字的地址長(zhǎng)度由參數(shù)namelen說(shuō)明。accept()函數(shù)原型為:Socketaccept(SOCKETs,structsockaddraddr,intaddrlen);參數(shù)s為本地套接字的句柄。參數(shù)addr是指客戶(hù)方套接字地址結(jié)構(gòu)的指針,用來(lái)接收實(shí)體的地址,addr的確切格式由套接字創(chuàng)建時(shí)建立的地址簇決定。參數(shù)addrlen為客戶(hù)方套接字地址的長(zhǎng)度。2.2流程圖文件(£)偏輯CD查看任)終轍D待劍幫助(H)[TtJiu^lucaIhfls1ftJig]3i./subweicom127.0.0J-dmifang:-ditifang:你好!你好DWE:尚甲也.:查看①終情⑴覆到國(guó)指助曲[feng^loca[hastfejigjSL/sev127.0.0.Ihaverujinected你好duEf卯g:你好4、總結(jié)與體會(huì)通過(guò)這次的設(shè)計(jì)自己了解到在LINUX上進(jìn)行的網(wǎng)絡(luò)通信SOCKET原理,和線(xiàn)程的創(chuàng)建和使用方法加深了自己對(duì)LINUX操作系統(tǒng)的理解。5、原程序代碼客戶(hù)端#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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論