《網(wǎng)絡(luò)編程實驗課程》_第1頁
《網(wǎng)絡(luò)編程實驗課程》_第2頁
《網(wǎng)絡(luò)編程實驗課程》_第3頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《網(wǎng)絡(luò)編程實驗課程》綜合實驗報告1、實驗題目關(guān)于tcp套接字編程2、源代碼服務(wù)器端:#include<stdio.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#definePORT1234#defineBACKLOG1main(){intlistenfd,connectfd;structsockaddr_inserver;structsockaddr_inclient;socklen_taddrlen;if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket()error.");exit(1);}intopt=SO_REUSEADDR;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(listenfd,(structsockaddr*)&server,sizeof(server))==-1){perror("Bind()error");exit(1);}if(listen(listenfd,BACKLOG)==-1){perror("listen()error\n");exit(1);}addrlen=sizeof(client);if((connectfd=accept(listenfd,(structsockaddr*)&client,&addrlen))==-1){perror("accept()error\n");exit(1);}printf("yougotaconnectionfromcient'sipis%s,portis%d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));send(connectfd,"welcome\n",8,0);close(connectfd);close(listenfd);}客戶端:#include<stdio.h>#include<unistd.h>#include<strings.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<stdlib.h>#definePORT1234#defineMAXDATASIZE 100intmain(intargc,char*argv[]){intsockfd,num;charbuf[MAXDATASIZE];structhostent*he;structsockaddr_inserver;if(argc!=2){printf("usage:%s<IPaddress>\n",argv[0]);exit(1);}if((he=gethostbyname(argv[1]))==NULL){printf("gethostbyname()error\n");exit(1);}if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){printf("socket()error\n");exit(1);}bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr=*((structin_addr*)he->h_addr);if(connect(sockfd,(structsockaddr*)&server,sizeof(server))==-1){printf("connect()error\n");exit(1);}if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1){buf[num-1]='\0';exit(1);}buf[num-1]='\0';//以\0printf("servermessage:%s\n",buf);close(sockfd);}3、實驗運行結(jié)果步驟:首先運行服務(wù)器端程序,再運行客戶端程序(./客戶端程序名稱+空格+127.0.0.1)客戶端根據(jù)用戶提供的IP地址172.0.0.1將用戶從終端輸入的信息發(fā)送給服務(wù)器,然后等待服務(wù)器的回應(yīng)。服務(wù)器:客戶端:4、源代碼解析服務(wù)器端:#include<stdio.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h> //1~8#definePORT1234 //1234;#defineBACKLOG1 //BACKLOG1main()12.{intlistenfd,connectfd;structsockaddr_inserver;structsockaddr_inclient;socklen_taddrlen;if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)18.{perror("socket()error.");exit(1);} //17~21socket()TCP息。intopt=SO_REUSEADDR;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//22~23行:設(shè)置套接字選項SO_REUSEADDR只允許一個套接字綁定在一個特定的協(xié)議地址上,并且當(dāng)該套接字關(guān)閉后,系統(tǒng)仍不允許在該地址上綁定其它套接字。如果去掉這兩行,程序運行時產(chǎn)生的錯誤信息為:Bind()error;Addressalreadyinuse.bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=htonl(INADDR_ANY);//24`27serverINADDR_ANY,接收目的地址是本機IPIPif(bind(listenfd,(structsockaddr*)&server,sizeof(server))==-1)31.{perror("Bind()error");exit(1);}//28~32if(listen(listenfd,BACKLOG)==-1)36.{perror("listen()error\n");exit(1);}//33~37addrlen=sizeof(client);if((connectfd=accept(listenfd,(structsockaddr*)&client,&addrlen))==-1)42.{perror("accept()error\n");exit(1);}//39~43clientprintf("yougotaconnectionfromcient'sipis%s,portistoa(client.sin_addr),htons(client.sin_port));//IPinet_ntoa()IPSCIIhtons()函數(shù)將端口號轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序。send(connectfd,"welcome\n",8,0);//Welcomeclose(connectfd);close(listenfd);//46~47行:關(guān)閉套接字。先關(guān)閉已連接套接字,再關(guān)閉監(jiān)聽套接字51.}客戶端:1.#include<stdio.h>2.#include<unistd.h>3.#include<strings.h>4.#include<sys/types.h>5.#include<sys/socket.h>6.#include<netinet/in.h>7.#include<netdb.h>8.#include<stdlib.h>//1~89.#definePORT1234//1234;10.#defineMAXDATASIZE 100//11.intmain(intargc,char*argv[])12.{13.intsockfd,num;14.charbuf[MAXDATASIZE];15.structhostent*he;16.structsockaddr_inserver;17.if(argc!=2)18.{19.printf("usage:%s<IPaddress>\n",argv[0]);20.exit(1);21.}//17~2122.if((he=gethostbyname(argv[1]))==NULL)23.{24.printf("gethostbyname()error\n");25.exit(1);}//22~26IP信息if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)28.{29.printf("socket()error\n");30.exit(1);31.}//27~31socket()32.bzero(&server,sizeof(server));33.server.sin_family=AF_INET;34.server.sin_port=htons(PORT);35.server.sin_addr=*((structin_addr*)he->h_addr);36.//32~35行:初始化服務(wù)器的地址結(jié)構(gòu),并為地址結(jié)構(gòu)的成員賦值37.if(connect(sockfd,(structsockaddr*)&server,sizeof(server))==-1)38.{39.printf("connect()error\n");40.exit(1);41.}//36~40connect()42.if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)43.{44.buf[num-1]='\0';45.exit(1);} //41~45bufnumbuf[num-1]='\0';//以\0printf("servermessage:%s\n",buf);//buf49.close(sockfd);//關(guān)閉套接字50.}二、綜合實驗項目21、實驗題目(自擬題目與局域網(wǎng)通信相關(guān))多線程編程2、源代碼服務(wù)器:#include<pthread.h>#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#include<netdb.h>#include<string.h>#definePORT1234#defineBACKLOG2#defineMAXCHARSIZE100voidprocess_client(intconnectfd,structsockaddr_inclient);void*start_routine(void*arg);structARG{intconnfd;structsockaddr_inclient;};structARG*arg;intmain(void){intlistenfd,connectfd;structsockaddr_inserver,client;intsin_size;intopt=SO_REUSEADDR;pthread_ttid;sin_size=sizeof(structsockaddr_in);if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("Createsocketfailed.");exit(-1);}setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(listenfd,(structsockaddr*)&server,sizeof(structsockaddr))==-1){perror("Binderror.");exit(-1);}if(listen(listenfd,BACKLOG)==-1){perror("listenerror.");exit(-1);}while(1){if((connectfd=accept(listenfd,(structsockaddr*)&client,&sin_size))==-1){perror("Accepterror.");exit(-1);}arg=(structARG*)malloc(sizeof(structARG));arg->connfd=connectfd;memcpy((void*)&arg->client,&client,sizeof(client));if(pthread_create(&tid,NULL,start_routine,(void*)arg)){perror("pthread_createerror.\n");exit(-1);}}close(listenfd);}voidprocess_client(intconnectfd,structsockaddr_inclient){charrecvbuf[MAXCHARSIZE];charsendbuf[MAXCHARSIZE];charclient_name[MAXCHARSIZE];intrecvlen,i;printf("Yougetaconnetionfrom%s.",inet_ntoa(client.sin_addr));send(connectfd,"Welcometomyserver.\n",22,0);recvlen=recv(connectfd,client_name,MAXCHARSIZE,0);if(recvlen==0){close(connectfd);printf("Clientdisconnected.\n");return;}elseif(recvlen<0){close(connectfd);printf("Connectbroked.\n");return;}client_name[recvlen]='\0';printf("Clientnameis%s.\n",client_name);bzero(recvbuf,100);while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0)){recvbuf[recvlen]='\0';printf("Receiveclient(%s)message:%s\n",client_name,recvbuf);for(i=0;i<recvlen;i++)sendbuf[i]=recvbuf[recvlen-i-1];sendbuf[recvlen]='\0';send(connectfd,sendbuf,strlen(sendbuf),0);bzero(recvbuf,100);}printf("Clinet(%s)disconnected.n\n",client_name);close(connectfd);}void*start_routine(void*arg){structARG*info;info=(structARG*)arg;process_client(info->connfd,info->client);free(arg);pthread_exit(NULL);}客戶端:#include<stdio.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<stdlib.h>#definePORT1234#defineMAXDATASIZE100intmain(intargc,char*argv[]){intfd,numbytes;charbuf[MAXDATASIZE];structhostent*he;structsockaddr_ininti=1;if(argc!=2){printf("Usage:%s<IPaddress>exit(-1);}if((he=gethostbyname(argv[1]))==NULL){perror("gethostbynameerror.");exit(-1);}if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("Createsocketfailed");exit(-1);}bzero(&server,sizeof(server));server.sin_family=AF_INET;server.sin_port=htons(PORT);server.sin_addr=*((structin_addr*)he->h_addr);if(connect(fd,(structsockaddr*)&server,sizeof(structsockaddr))==-1){perror("Binderror.");exit(1);}if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1){perror("recverror.");exit(1);}buf[numbytes]='\0';printf("servermessage:%s\n",buf);printf("Inputyourname:");scanf("%s",buf);if((numbytes=send(fd,buf,strlen(buf),0))==-1){perror("senderror.");exit(1);}bzero(buf,100);while(i){printf("Inputyourmessage(max:%d):",MAXDATASIZE);scanf("%s",buf);if(strlen(buf)<1)i=0 ;if((numbytes=send(fd,buf,strlen(buf),0))==-1){perror("senderror.");exit(1);}bzero(buf,100);if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1){perror("readerror.\n");exit(1);}buf[numbytes]='\0';printf("Theconvinceofyourmessage:%s\n",buf);printf("\n");bzero(buf,100);}close(fd);}3、實驗運行結(jié)果服務(wù)器端:gccs.c-os-lpthread-lpthreadpthread.h選項。服務(wù)器:客戶端:4、源代碼解析服務(wù)器:#include<pthread.h>#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#include<netdb.h>#include<string.h>#definePORT1234 //定義端口號#defineBACKLOG2 //定義最大允許的連接數(shù)#defineMAXCHARSIZE100 //定義緩沖區(qū)的大voidprocess_client(intconnectfd,structsockaddr_inclient);void*start_routine(void*arg);//聲明新線程的執(zhí)行函數(shù)structARG{intconnfd;structsockaddr_inclient;};structARG*arg;intmain(void){intlistenfd,connectfd; //定義監(jiān)聽描述符,已連接描述符structsockaddr_inserver,client; //定義sockaddr_inintsin_size;intopt=SO_REUSEADDR; //將套接字選項賦給optpthread_ttid; //定義將獲得線程自身的ID送入sin_size=sizeof(structsockaddr_in);//初始化sockaddr_in結(jié)構(gòu)體,并賦給sin_sizeif((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("Createsocketfailed.");exit(-1);} //調(diào)用socket函數(shù),產(chǎn)生TCP套接字,AF_INET:IPv4協(xié)議setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//設(shè)置套接字選項為SO_REUSEADDR,SO_REUSEADDR這個套接字選項通知內(nèi)核,如端口忙,但TCP狀態(tài)位于TIME_WAIT,可以重用端口bzero(&server,sizeof(server)); //初始化server結(jié)構(gòu)體server.sin_family=AF_INET; //定義server結(jié)構(gòu)體的Internet地址族為IPv4協(xié)議server.sin_port=htons(PORT); //把端口號1234賦給serverhtons()數(shù)將地址轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序server.sin_addr.s_addr=htonl(INADDR_ANY); //設(shè)置IP地址為INADDR_ANY收目的地址是本機任何IP地址的客戶鏈接;htons()函數(shù)將地址轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序if(bind(listenfd,(structsockaddr*)&server,sizeof(structsockaddr))==-1){perror("Binderror.");exit(-1);}//調(diào)用bind(structsockaddr*)&serverer的套接字地址;sizeof(structsockaddr):初始化套接字地址if(listen(listenfd,BACKLOG)==-1){perror("listenerror.");exit(-1);//調(diào)用listenwhile(1){if((connectfd=accept(listenfd,(structsockaddr*)&client,&sin_size))==-1){perror("Accepterror.");exit(-1);}//接受客戶端的鏈接請求arg=(structARG*)malloc(sizeof(structARG)); //malloc 辟一段連續(xù)的空間;參數(shù)是開辟空間的大小,返回值為void*型arg->connfd=connectfd; //設(shè)置線程執(zhí)行函數(shù)的參數(shù)memcpy((void*)&argclient,&client,sizeof(client));//分配空間給arg,然后把已連接描述符和客戶信息付給argif(pthread_create(&tid,NULL,start_routine,(void*)arg)){perror("pthread_createerror.\n");exit(-1);}//產(chǎn)生新線程,調(diào)用start_routine函數(shù),關(guān)鍵是釋放arg的內(nèi)容,參數(shù)tid返回新生線程ID,一個進程中的每個線程都由一個線程ID標識,其類型為pthread_t;}close(listenfd); //服務(wù)器退出時關(guān)閉監(jiān)聽描述符}voidprocess_client(intconnectfd,structsockaddr_inclient){charrecvbuf[MAXCHARSIZE]; //定義接收數(shù)據(jù)的緩沖charsendbuf[MAXCHARSIZE]; //定義發(fā)送數(shù)據(jù)緩沖區(qū)charclient_name[MAXCHARSIZE]; //定義客戶名字的最大長intrecvlen,i; //定義緩沖區(qū)長度printf("Yougetaconnetionfrom%s.",inet_ntoa(client.sin_addr));//顯示客戶的IP地址,通過inet_ntoainet_ntoa()數(shù):返回點分十進制的字符串在靜態(tài)內(nèi)存中的指針send(connectfd,"Welcometomyserver.\n",22,0);recvlen=recv(connectfd,client_name,MAXCHARSIZE,0);if(recvlen==0){close(connectfd); //printf("Clientdisconnected.\n");return;}elseif(recvlen<0){close(connectfd);printf("Connectbroked.\n");return;}client_name[recvlen]='\0'; //printf("Clientnameis%s.\n",client_name);bzero(recvbuf,100); //recvbuf100字節(jié)個數(shù)while(recvlen=recv(connectfd,recvbuf,MAXCHARSIZE,0)){recvbuf[recvlen]='\0'; //遇到'\0'時停止接收printf("Receiveclient(%s)message:%s\n",client_name,recvbuf);//顯示客戶名和緩沖區(qū)的內(nèi)容for(i=0;i<recvlen;i++)sendbuf[i]=recvbuf[recvlen-i-1];sendbuf[recvlen]='\0';send(connectfd,sendbuf,strlen(sendbuf),0);bzero(recvbuf,100);} //重復(fù)接收客戶的數(shù)據(jù),接收成功則顯示printf("Clinet(%s)disconnected.n\n",client_name);//接收不成功,顯示client(client_name)disconnnected.close(connectfd);}void*start_routine(void*arg){structARG*info;info=(structARG*)arg;process_client(info->connfd,info->client); //調(diào)用process_client()函free(arg); //釋放分配給該線程的arg空間pthread_exit(NULL); //退出線程}客戶端:#include<stdio.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include<stdlib.h>#definePORT1234#defineMAXDATASIZE100intmain(intargc,char*argv[]){intfd,numbytes;charbuf[MAXDATASIZE]; //定義數(shù)據(jù)緩沖區(qū)打大小structhostent*he; //定義hostent結(jié)構(gòu)體的指structsockaddr_inserver; //定義sockaddr_ininti=1;if(argc!=2){printf("Usage:%s<IPaddress>\

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論