![《網(wǎng)絡編程實驗課程》_第1頁](http://file4.renrendoc.com/view/60b542c567d72cd0ff72906e436395c7/60b542c567d72cd0ff72906e436395c71.gif)
![《網(wǎng)絡編程實驗課程》_第2頁](http://file4.renrendoc.com/view/60b542c567d72cd0ff72906e436395c7/60b542c567d72cd0ff72906e436395c72.gif)
![《網(wǎng)絡編程實驗課程》_第3頁](http://file4.renrendoc.com/view/60b542c567d72cd0ff72906e436395c7/60b542c567d72cd0ff72906e436395c73.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
《網(wǎng)絡編程實驗課程》綜合實驗報告1、實驗題目關于tcp套接字編程2、源代碼服務器端:#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、實驗運行結果步驟:首先運行服務器端程序,再運行客戶端程序(./客戶端程序名稱+空格+127.0.0.1)客戶端根據(jù)用戶提供的IP地址172.0.0.1將用戶從終端輸入的信息發(fā)送給服務器,然后等待服務器的回應。服務器:客戶端:4、源代碼解析服務器端:#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行:設置套接字選項SO_REUSEADDR只允許一個套接字綁定在一個特定的協(xié)議地址上,并且當該套接字關閉后,系統(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ù)將端口號轉換成網(wǎng)絡字節(jié)序。send(connectfd,"welcome\n",8,0);//Welcomeclose(connectfd);close(listenfd);//46~47行:關閉套接字。先關閉已連接套接字,再關閉監(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行:初始化服務器的地址結構,并為地址結構的成員賦值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);//關閉套接字50.}二、綜合實驗項目21、實驗題目(自擬題目與局域網(wǎng)通信相關)多線程編程2、源代碼服務器:#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、實驗運行結果服務器端:gccs.c-os-lpthread-lpthreadpthread.h選項。服務器:客戶端:4、源代碼解析服務器:#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結構體,并賦給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));//設置套接字選項為SO_REUSEADDR,SO_REUSEADDR這個套接字選項通知內(nèi)核,如端口忙,但TCP狀態(tài)位于TIME_WAIT,可以重用端口bzero(&server,sizeof(server)); //初始化server結構體server.sin_family=AF_INET; //定義server結構體的Internet地址族為IPv4協(xié)議server.sin_port=htons(PORT); //把端口號1234賦給serverhtons()數(shù)將地址轉換成網(wǎng)絡字節(jié)序server.sin_addr.s_addr=htonl(INADDR_ANY); //設置IP地址為INADDR_ANY收目的地址是本機任何IP地址的客戶鏈接;htons()函數(shù)將地址轉換成網(wǎng)絡字節(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; //設置線程執(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ù),關鍵是釋放arg的內(nèi)容,參數(shù)tid返回新生線程ID,一個進程中的每個線程都由一個線程ID標識,其類型為pthread_t;}close(listenfd); //服務器退出時關閉監(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);} //重復接收客戶的數(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結構體的指structsockaddr_inserver; //定義sockaddr_ininti=1;if(argc!=2){printf("Usage:%s<IPaddress>\
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店管理晉升路徑
- 酒店管理工作目標
- All Touch移動信息化管理平臺介紹課件
- 2025-2030全球動畫工作室行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國超細玻璃棉行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球機器人電子皮膚行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國光伏增效膜行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國近紅外(NIR)超透鏡行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國3D感知數(shù)智化解決方案行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球數(shù)字布局軟件行業(yè)調(diào)研及趨勢分析報告
- 快遞代收點合作協(xié)議
- 食堂項目組織架構圖
- 食材配送公司機構設置及崗位職責
- 2023年版一級建造師-水利工程實務電子教材
- 房地產(chǎn)工程管理 -中建八局機電工程質量通病治理辦法
- GB/T 6403.4-2008零件倒圓與倒角
- GB/T 2518-2019連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
- 企業(yè)合規(guī)管理-課件
- 火電廠安全工作規(guī)程
- GB∕T 33047.1-2016 塑料 聚合物熱重法(TG) 第1部分:通則
- 特發(fā)性肺纖維化IPF
評論
0/150
提交評論