1.基于TCP通信服務器
程序代碼:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服務器IP3 #define SER_PORT 8888//服務器端口號4 int main(int argc, const char *argv[])5 {6 //1.創建用于監聽的套接字7 int sfd=-1;8 sfd=socket(AF_INET,SOCK_STREAM,0);9 //參數1:IPv4的通信10 //參數2:使用TCP通信類型11 //參數3:參數2以確定通信類型,012 if(sfd==-1)13 {14 perror("socket error");15 return -1;16 }17 printf("sfd=%d\n",sfd);//3 返回文件描述符,最小分配原則18 //2.綁定IP地址和端口號19 //2.1填充地址信息結構體20 struct sockaddr_in sin;21 sin.sin_family=AF_INET;//地址族22 sin.sin_port=htons(SER_PORT);//要2字節無符號整數端口號(網絡字節序)23 //將主機字節序轉換為網絡字節序24 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址(sin的sin_addr的s_addr)25 //要IP地址的網絡字節序,將點分十進制數據轉換為4字節無符號整數的網絡字節序26 //2.2綁定27 if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)28 //要綁定的套接字文件描述符,通用地址信號結構體,結構體大小29 {30 perror("bind error");31 return -1;32 }33 printf("bind success\n");34 //3.啟動監聽,允許客戶端連接35 if(listen(sfd,128)==-1)36 {37 perror("listen error");38 return -1;39 }40 printf("listen success\n");41 //4.客戶端發來連接請求后,創建新的用于通信的套接字42 //不想接收客戶端地址信息結構體,則無需傳參2,參343 //想要獲取客戶端地址信息結構體,要傳入相關參數44 struct sockaddr_in cin;//用于接收客戶端地址信息結構體45 socklen_t socklen=sizeof(cin);//用于接收客戶端地址信息大小46 int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);47 //阻塞等待客戶端請求,客戶端發來連接請求后,創建新的套接字,返回套接字文件描述符48 //參數1:服務器套接字文件描述符49 //參數2:通用地址信號結構體,接收最新連接的客戶端地址信息50 //參數3:客戶端套接字大小,地址傳遞51 if(newfd==-1)//成功返回套接字文件描述符,失敗-152 {53 perror("accept error");54 return -1;55 }56 printf("newfd=%d您有新的客戶已經上線\n",newfd);57 printf("客戶端IP:%s,端口號:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));58 //將IP地址的網絡字節序(4字節無符號整數)轉換為點分十進制字符串(IP地址的網絡字節序)59 //將端口的網絡字節序(2字節無符號整數)轉換為主機字節序(端口的網絡字節序)60 //5.通信套接字與客戶端進行數據收發61 char rbuf[128]="";62 while(1)63 {64 //清空容器65 bzero(rbuf,sizeof(rbuf));66 //從套接字中讀取數據67 int res=read(newfd,rbuf,sizeof(rbuf));68 if(res==0)69 {70 printf("客戶端已下線\n");71 break;72 }73 printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);74 //將收到的消息加上其他字符回過去75 strcat(rbuf,"*_*");76 write(newfd,rbuf,strlen(rbuf));77 }78 //6.關閉套接字79 close(newfd);80 close(sfd);81 return 0;82 }
運行結果:
2. 基于TCP通信客戶端
程序代碼:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服務器IP3 #define SER_PORT 8888//服務器端口號4 int main(int argc, const char *argv[])5 {6 //1.創建用于通信的套接字文件描述符7 int cfd=socket(AF_INET,SOCK_STREAM,0);8 //使用IPv4通信,使用TCP通信類型,已確定通信類型09 if(cfd==-1)10 {11 perror("socket error");12 return -1;13 }14 printf("cfd=%d\n",cfd);//返回文件描述符,最小分配315 //2.綁定(不寫系統默認綁定)16 //3.連接服務器17 //3.1填充要連接的服務器地址信息結構體18 struct sockaddr_in sin;19 sin.sin_family=AF_INET;//地址族20 sin.sin_port=htons(SER_PORT);//端口號21 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址22 //3.2連接服務器23 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)24 {25 perror("connect error");26 return -1;27 }28 printf("connect success\n");29 //4數據收發30 char wbuf[128]="";31 while(1)32 {33 //清空數據34 bzero(wbuf,sizeof(wbuf));35 printf("請輸入>>>");36 fgets(wbuf,sizeof(wbuf),stdin);//終端輸入37 wbuf[strlen(wbuf)-1]=0;38 //將數據發送給服務器39 send(cfd,wbuf,strlen(wbuf),0);40 printf("發送成功\n");41 if(strcmp(wbuf,"quit")==0)42 break;43 //接收服務器發來的消息44 //清空數據45 bzero(wbuf,sizeof(wbuf));46 recv(cfd,wbuf,sizeof(wbuf),0);47 printf("收到消息為;%s\n",wbuf);48 }49 //5.關閉套接字50 close(cfd);51 return 0;52 }
~
運行結果:
3.基于UDP通信服務器
程序代碼:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服務器IP3 #define SER_PORT 8888//服務器端口號4 int main(int argc, const char *argv[])5 {6 //1.創建用于通信的套接字7 int sfd=socket(AF_INET,SOCK_DGRAM,0);8 if(sfd==-1)9 {10 perror("socket error");11 return -1;12 }13 printf("sfd=%d\n",sfd);14 //2.綁定IP地址和端口號15 //2.1填充地址信息結構體16 struct sockaddr_in sin;17 sin.sin_family=AF_INET;//地址族18 sin.sin_port=htons(SER_PORT);//端口號19 sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址20 //2.2綁定21 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)22 {23 perror("bind error");24 return -1;25 }26 printf("bind success\n");27 //3.收發數據28 char rbuf[128]="";29 //定義容器接收對端地址信息結構體30 struct sockaddr_in cin;31 socklen_t socklen=sizeof(cin);32 while(1)33 {34 //清空數組35 bzero(rbuf,sizeof(rbuf));36 //接收數據37 recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen);38 printf("收到消息為:%s\n",rbuf);39 //將消息加*_*回過去40 strcat(rbuf,"*_*");41 if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cin,socklen)=42 {43 perror("sendto error");44 return -1;45 }46 }47 //4.關閉套接字48 close(sfd);49 return 0;50 }
運行結果:
4.基于UDP的客戶端
程序代碼:
1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//IP地址3 #define SER_PORT 8888//服務器端口4 int main(int argc, const char *argv[])5 {6 //1.創建用于通信的套接字7 int cfd=socket(AF_INET,SOCK_DGRAM,0);8 if(cfd==-1)9 {10 perror("socket error");11 return -1;12 }13 printf("cfd=%d\n",cfd);14 //2.綁定IP地址和端口號15 //非必要16 //3.收發數據17 char wbuf[128]="";18 //定義容器,記錄服務器的地址信息結構體19 struct sockaddr_in sin;20 sin.sin_family=AF_INET;21 sin.sin_port=htons(SER_PORT);22 sin.sin_addr.s_addr=inet_addr(SER_IP);23 while(1)24 {25 //清空數組26 bzero(wbuf,sizeof(wbuf));27 //從終端獲取數據28 printf("請輸入>>>");29 fgets(wbuf,sizeof(wbuf),stdin);30 wbuf[strlen(wbuf)-1]=0;31 //將數據發送給服務器32 sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,sizeof(sin));33 printf("發送成功\n");34 //接收服務器回復的消息35 bzero(wbuf,sizeof(wbuf));36 recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);37 printf("收到消息:%s\n",wbuf);38 }39 //關閉套接字40 close(cfd);41 return 0;42 }
運行結果:
?流程圖:
面試:
?