前言
进⾏⽹络通信的计算机,通信双为了能够通信做出⼀种"约定"---协议。⽹络协议采⽤分⽽治之,将⽹络的功能分成不同的模块,以分层的形式组合在⼀起,每⼀层(协议)实现不同的作⽤。本文讲述的就是在TCP/IP协议下如何实现客户端与服务器通信。
一、TCP通信流程
TCP通信必须先建⽴连接,只有建⽴了连接之后TCP才能实现可靠传输;所以在进⾏TCP通信时,通信双⽅的操作会有部分区别,应该是⼀个主动去建⽴连接,另⼀个是等待连接请求,然后就建⽴连接进⾏通信,把主动的⼀端叫做客户端,把被动的⼀端叫做服务端(服务器端)
二、客户端代码
1.引入头文件
#include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <arpa/inet.h>
2.创建套接字int clientfd = socket(AF_INET,SOCK_STREAM,0);//tcp通信套接字 if(clientfd < 0) { printf("error\n"); return -1; }
3.绑定套接字------在TCP通信套接字上绑定本地网络信息(ip、port)struct sockaddr_in clientaddr;//结构体变量,用于表示本地网络信息,需要加入到bind函数中使用 clientaddr.sin_family = AF_INET;//选择tcp协议 clientaddr.sin_port = htons(xxxx);//填写本机端口号 clientaddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//填写本机ip地址 bind(clientfd,(struct sockaddr *)&clientaddr,sizeof(clientaddr));
4.请求服务器连接,客户端使用自己的套接字请求与对应的服务器建立连接struct sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(xxxx); serveraddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx"); int ret; ret = connect(clientfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); if(ret == 0) { printf("connect ok\n"); } else { printf("connect error\n"); return -1; }
5.开始通信char buf[20]; while(1) { //先发送 fgets(buf,20,stdin); send(clientfd,buf,20,0); //再接收 recv(clientfd,buf,20,0); printf("client recv data is %s",buf); } close(clientfd);//把套接字关闭 return 0;
三、服务器端代码
代码如下(示例):
1.头文件
#include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <arpa/inet.h>
2.创建套接字int serverfd = socket(AF_INET,SOCK_STREAM,0);//按照ipv4、tcp创建的套接字
3.绑定套接字struct sockaddr_in serveraddr;//结构体变量,表示本地网络信息内容 serveraddr.sin_family = AF_INET;//地址族 serveraddr.sin_port = htons(xxxx);//端口port号 serveraddr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");//ip地址 bind(serverfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
4.监听套接字,监听服务端自己的网络信息,查看有客户端来进行连接请求listen(serverfd,3);//等待队列大小3,自动进行监听 printf("listen ok\n");
5.接收客户端连接请求//cfd1就是与对应客户端进行通信的套接字 printf("accept ok\n");
6.通信char buf[20]; while(1) { recv(cfd1,buf,20,0);//接收客户端的数据 printf("recv data is %s",buf); send(cfd1,buf,20,0); } close(cfd1); close(serverfd); return 0; }
总结
以上就是通过TCP/IP协议实现客户端与服务器端进行网络通信的方法。