一、使用TCP模型創建服務器和客戶端完成簡單通信。
服務器代碼:
#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//1.創建監聽的套接字int sfd=-1;sfd=socket(AF_INET,SOCK_STREAM,0);//參數1表示使用的是ipv4的通信//參數2表示使用tcp通信類型//表示前面以及特定了通信協議if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2.綁定ip地址和端口號struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.啟動監聽 允許客戶端鏈接if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.當有客戶端發來連接請求后 創建新的用于通信的套接字struct sockaddr_in cin;socklen_t socklen=sizeof(cin);int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept error");return -1;}printf("newfd=%d 有新客戶以及上線\n",newfd);printf("客戶端IP:%s,端口:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//5.通信套接字和客戶端進行數據收發char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0){puts("客戶端已下線");break;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);}//6.關閉套接字close(newfd);close(sfd);return 0;
}
客戶端代碼:
#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//1.創建用于通信的套接字文件描述符int cfd =socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.綁定(非必須) //3.鏈接服務器struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//4.數據收發char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;send(cfd,wbuf,strlen(wbuf),0);printf("發送成功\n");if(strcmp(wbuf,"quit")==0)break;bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到消息:%s\n",wbuf);}//5.關閉套接字close(cfd);return 0;
}
運行:
二、使用UDP模型 創建服務器和客戶端完成簡單通信。
服務器代碼:
#include<myhead.h>
#define SER_IP "192.168.32.130"
#define SER_PORT 6666
int main(int argc, const char *argv[])
{//創建套接字int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}//定義通用地址結構體存入服務器地址信息struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//綁定端口號和ipif(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//定義通用地址結構體用來獲取發來信息的對端地址struct sockaddr_in cin;socklen_t cinlen=sizeof(cin);char sbuf[128]="";while(1){bzero(sbuf,sizeof(bzero));//接收信息并獲取對方地址recvfrom(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,&cinlen);printf("收到消息:%s\n",sbuf);strcat(sbuf,"*_*");//回復信息sendto(sfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&cin,cinlen);}close(sfd);//關閉套接字文件return 0;
}
客戶端代碼:
#include<myhead.h>
#define SER_IP "192.168.32.130"//客戶端ip
#define SER_PORT 6666 //客戶端端口號
int main(int argc, const char *argv[])
{int rfd=socket(AF_INET,SOCK_DGRAM,0);//創建套接字if(rfd==-1){perror("socket error");return -1;}//將服務器的信息存入地址通用結構體struct sockaddr_in sin;sin.sin_family =AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);char sbuf[128]="";while(1){bzero(sbuf,sizeof(sbuf));printf("請輸入>>>:");fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;//發送信息給服務器sendto(rfd,sbuf,sizeof(sbuf),0,(struct sockaddr*)&sin,sizeof(sin));bzero(sbuf,sizeof(sbuf));//接收對端服務器回復的信息 不接收對端地址信息recvfrom(rfd,sbuf,sizeof(sbuf),0,NULL,NULL);printf("收到信息:%s\n",sbuf);}close(rfd);//關閉套接字return 0;
}
運行:
思維導圖: