如果想自己写一个服务端和客户端,我们需要掌握一定的网络编程技术。在我看来,网络编程中最重要的就是这个东西——套接字(socket)。Socket(套接字):简单来说,socket就是用来描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。TCP协议TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。在简化的计算机网络OSI模型中,它完成第四层传输层规定的功能。关键词:三向握手,可靠,基于字节流。可能有朋友会问,TCP有这么简单吗?当然不是。TCP作为一个非常重要的传输协议,有很多详细的知识,本文可能不足以详细讲解。不过在这篇文章中,我们只需要了解他的几个关键词特征,就可以很好地理解后面的内容。TCP服务器和客户端的运行过程如图所示。这是一个完整的TCP服务器-客户端操作流程图。其实我个人认为不管用哪种语言,程序都是一样的。核心在于算法的设计和函数的调用。.那么图中的函数是什么意思呢?1.创建socketsocket是在内核中创建的一个结构体sockfd=socket(AF_INET,SOCK_STREAM,0);//AF_INT:ipv4,SOCK_STREAM:tcpprotocol2.调用bind函数绑定socket和地址(包括ip,port).需要定义一个结构地址,将端口的主机字节序转换为网络字节序structsockaddr_inmyaddr;//地址结构体绑定函数bind(sockfd,(structsockaddr*)&myaddr,sizeof(serveraddr))3.listen,把接收到的clientconnectionintothequeuelisten(sockfd,8)//第二个参数为队列长度4.调用accept函数从队列中获取请求并返回socket描述符。如果没有请求,就会阻塞直到Getconnectionintfd=accept(sockfd,NULL,NULL);//这里使用默认参数5.调用read/write进行双向通信6.关闭socketclose(scokfd)接受返回;下面放出完整代码:/*server*/#include#include#include#include#include#include#include#includeintmain(){intsockfd=socket(AF_INET,SOCK_STREAM,0);//创建套接字if(sockfd<0){perror("socket");return-1;}//错误处理printf("socket......\n");//成功打印"socket..."structsockaddr_inmyaddr;//创建“我的地址”结构memset(&myaddr,0,sizeof(myaddr));//清除内存(保险起见)myaddr.sin_family=AF_INET;//选择IPV4地址类型myaddr.sin_port=htons(8888);//选择端口号myaddr.sin_addr.s_addr=inet_addr("192.168.3.169");//选择IP地址if(0>bind(sockfd,(structsockaddr*)&myaddr,sizeof(myaddr)))//bindsocket{perror("bind");return-1;}printf("bind......\n");if(0>listen(sockfd,8))//调用listen监听指定端口{perror("listen");return-1;}printf("listen......\n");intconnfd=accept(sockfd,NULL,NULL);//使用accept从消息中获取请求queueif(connfd<0){perror("accept");return-1;}printf("accept...........\n");charbuf[100];//定义一个数组存储接收到的数据intret;while(1){memset(buf,0,sizeof(buf));ret=read(connfd,buf,sizeof(buf));if(0>ret){perror("read");break;}//执行while循环读取数据,whenelseif(0==ret){printf("writeclose!\n");break;}printf("recv:");fputs(buf,stdout);//重新打印收到数据}关闭(sockfd);//关闭socketclose(connfd);//断开连接return0;}/*client*/(具体功能同server,所以不做注释)#include#include#include#include#include#include#include#includeintmain(){intsockfd;if(0>(sockfd=socket(AF_INET,SOCK_STREAM,0))){perror("socket");return-1;}printf("socket...........\n");structsockaddr_insrv_addr;memset(&srv_addr,0,sizeof(srv_addr));srv_addr.sin_family=AF_INET;srv_addr.sin_port=htons(8888);srv_addr.sin_addr.s_addr=inet_addr("192.198.3.16;if(0>connect(sockfd,(structsockaddr*)&srv_addr,sizeof(srv_addr))){perror("connect");return-1;//exit//pthread_exit}printf("connect……......\n");charbuf[100];intret;while(1){printf("发送:");fgets(buf,sizeof(buf),stdin);ret=write(sockfd,buf,sizeof(buf));if(ret<0){perror("write");break;}if(strncmp(buf,"退出",4)==0)中断;}关闭(sockfd);return0;}