1.基于TCP的通信(面向連接的通信)
服務器代碼實現:
#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{//1、創建套接字int sfd=-1;if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//2、綁定//將服務器的地址信息結構體綁定到sfd文件描述符中struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//設置監聽if(listen(sfd,128)==-1){perror("listen error");return -1;}//accept連接//創建連接之后的客戶端地址信息結構體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("[%s:%d]連接成功\n",inet_ntoa(cin.sin_addr)\,ntohs(cin.sin_port));//進行數據的收發char rbuf[128]="";while(1){//接收客戶端的消息bzero(rbuf,sizeof(rbuf));int res=recv(newfd,rbuf,sizeof(rbuf),0);if(res==0||strcmp(rbuf,"quit")==0){printf("客戶端下線\n");break;}printf("[%s:%d]:發送的消息為%s\n",inet_ntoa(cin.sin_addr)\,ntohs(cin.sin_port),rbuf);//發送消息到客戶端strcat(rbuf,"*_*");send(newfd,rbuf,sizeof(rbuf),0);}//關閉文件描述符close(sfd);close(newfd);return 0;
}
客戶端的代碼實現:
#include <myhead.h>
#define IP "192.168.126.91"
#define PORT 9999
int main(int argc, const char *argv[])
{int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}//連接服務器struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(PORT);cin.sin_addr.s_addr=inet_addr(IP);if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("connect error");return -1;}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);if(strcmp("quit",wbuf)==0){printf("客戶端下線\n");break;}//接收的數據bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到的消息是:%s\n",wbuf);}return 0;
}
運行結果:
2.基于UDP的通信(面向無連接的通信)
服務器端代碼實現:
#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{//創建套接字int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//綁定端口號和ipstruct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//創建對端地址信息結構體struct sockaddr_in cin;socklen_t socklen=sizeof(cin);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));if(recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen)==-1){perror("recvfrom error");return -1;}if(strcmp(rbuf,"quit")==0){printf("客戶端下線\n");break;}printf("收到的消息是:%s\n",rbuf);//給客戶端回一個消息//bzero(rbuf,sizeof(rbuf));strcat(rbuf,"*_*");if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,socklen)==-1){perror("sendto error");return -1;} }close(sfd);return 0;
}
客戶端代碼實現:
#include <myhead.h>
#define PORT 3333
#define IP "192.168.126.91"
int main(int argc, const char *argv[])
{//創建套接字int cfd=-1;if((cfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//創建對端地址信息結構體struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(PORT);cin.sin_addr.s_addr=inet_addr(IP);socklen_t socklen=sizeof(cin);char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));printf("請輸入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;if(sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,socklen)==-1){perror("sendto error");return -1;}if(strcmp(wbuf,"quit")==0){printf("客戶端下線\n");break;}bzero(wbuf,sizeof(wbuf));if(recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&cin,&socklen)==-1){perror("recvfrom error");return -1;}printf("收到服務器的消息為%s\n",wbuf);}close(cfd);return 0;
}
運行結果: