一、使用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;
}
运行:
思维导图: