TCP实现网络通信
1.服务端
#include<myhead.h>//1服务端定义:端口号\id号
#define SER_PIPR 6666
#define SER_IP "196.168.111.186" //通过ifconfig查看ip
int main(int argc, const char *argv[])
{//1创建套接字int sfd =socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//2.将端口号快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockipt error");return -1;}//2为套接字绑定端口号和ip//2.1填充地址结构体struct sockaddr_in sin;sin.sin_family=AF_INET; //通信域名sin.sin_port=htons(SER_PIPR); //端口号sin.sin_addr.s_addr=inet_addr(SER_IP); //IP地址//2.2绑定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//3.将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen error");return -1;}//4.阻塞等待客户的连接请求//4.1定义勇于接收客户端的信息struct sockaddr_in cin;//用于接收地址信息socklen_t addrlen = sizeof(cin); //用于接收长度//4.2接收连接int newfd= accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]:已成功连接一个客户端\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//5.数据的收发char buf[128]="";while(1){//清空容器bzero(buf,sizeof(buf));//从可读端读取信息int res=recv(newfd,buf,sizeof(buf),0);if(res==-1){perror("recv error");return -1;}else if(res == 0){printf("客户端已经下线\n");close(newfd);break;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//对收到的消息进行一顿操作strcat(buf,"*_*");//将消息回复给客户端if(send(newfd,buf,strlen(buf),0)==-1){perror("发送error");return -1;}printf("发送成功\n");}//关闭监听close(sfd);return 0;
}
2.客户端
1 #include<myhead.h>2 #define SER_PORT 6666 //与服务器保持一致3 #define SER_IP "192.168.111.186" //服务器ip地址4 5 #define CLI_PORT 8888 //客户端端口号6 #define CLI_IP "192.168.111.186" //客户端ip地址7 int main(int argc, const char *argv[])8 {9 //1.创建用于通信的套接字文件描述符10 int cfd=socket(AF_INET,SOCK_STREAM,0);11 if(cfd==-1)12 {13 perror("socket error");14 return -1;15 }16 printf("cfd = %d",cfd);17 //2.绑定ip地址和端口号18 //2.1填充地址信息结构体19 struct sockaddr_in cin;20 cin.sin_family = AF_INET; //通信域21 cin.sin_port = htons(CLI_PORT); //端口号22 cin.sin_addr.s_addr = inet_addr(CLI_IP); //ip地址23 24 //2.2绑定工作25 if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)26 {27 perror("bind error");28 return -1;29 }30 printf("bind success\n");31 32 //3.连接到服务器33 //3.1填充服务器地址信息结构体34 struct sockaddr_in sin;35 sin.sin_family=AF_INET; //服务器的通信域36 sin.sin_port= htons(SER_PORT); //服务器端口号37 sin.sin_addr.s_addr=inet_addr(SER_IP); //服务器ip地址38 39 //3.2连接服务器40 if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)41 {42 perror("connect error");43 return -1;44 }45 printf("连接服务器成功\n");46 //4.数据收发47 char buf[128]="";48 while(1)49 {50 printf("请输入>>>");51 fgets(buf,sizeof(buf),stdin); //从终端获取字符串52 buf[strlen(buf)-1]=0;53 54 //将数据发送给服务器55 send(cfd,buf,strlen(buf),0);56 printf("发送成功\n");57 58 //清空容器59 bzero(buf,sizeof(buf));60 61 //接受服务器发来的的数据62 recv(cfd,buf,sizeof(buf),0);63 64 printf("收到服务器消息为:%s\n",buf);65 66 }67 68 //5.关闭套接字69 close(cfd);70 71 return 0;72 }
UDP实现网路通信
1.服务端
1 #include<myhead.h>2 #define SER_PORT 9999 //服务器端口号3 #define SER_IP "192.168.111.186" //服务器ip地址4 int main(int argc, const char *argv[])5 {6 //创建用于通信的服务器套接字描述符7 int sfd = socket(AF_INET,SOCK_DGRAM,0);8 if(sfd==-1)9 {10 perror("socket error");11 return -1;12 }13 14 printf("sfd = %d\n",sfd);15 16 //将端口号快速重用17 int resuse = 1;18 if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&resuse,sizeof(resuse))==-1)19 {20 perror("setsockopt error");21 return -1;22 }23 24 printf("将端口号快速重用成功\n");25 26 //2.绑定ip地址和端口号27 //2.1填充地址信息结构体28 struct sockaddr_in sin;29 sin.sin_family = AF_INET; //通信域30 sin.sin_port = htons(SER_PORT); //端口号31 sin.sin_addr.s_addr = inet_addr(SER_IP); //IP地址32 //2.2绑定工作33 if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)34 {35 perror("bind error");36 return -1;37 }38 39 //3.数据收发40 char buf[128]="";41 struct sockaddr_in cin; //接受对端地址信息42 socklen_t addrlen = sizeof(cin); //接收地址长度43 while(1)44 {45 //清空容器46 bzero(buf,sizeof(buf));47 48 //从套接字中读取数据49 recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);50 printf("收到的消息为:%s\n",buf);51 52 //收到的消息进行处理53 strcat(buf,"*_*");54 55 if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1)56 {57 perror("发送error");58 return -1;59 }60 printf("发送成功\n");61 }62 //4.关闭文件描述符63 64 return 0;65 }
2.客户端
思维导图: