当前位置: 首页 > Linux

《Linux网络开发必学教程》2_服务器端编程初体验

时间:2023-04-06 03:05:37 Linux

客户端/服务器端编程模式服务器长时间在网络上(公开自己的IP地址),等待客户端连接客户端发起连接动作,等待供服务器响应特点:Service客户端不能主动连接客户端。客户端只能以预定义的方式(协议)连接到服务器。绑定&监听&接收绑定:intbind(intsock,structsockaddr*addr,socklen_taddrlen);聆听:intlisten(intsock,intbacklog);接收:intaccept(intsock,structsockaddr*addr,socklen_taddrlen);深入分析服务器。服务器套接字仅用于接收连接,不用于实际通信。当接收到连接时,accept()函数返回与客户端通信的套接字。服务器套接字生成用于通信的客户端套接字。因此,究竟什么是套接字?如何理解?深入理解socket()函数socket()是什么?socket()是一个多功能函数socket()返回什么?socket()的返回值是用于通信的资源标识符。socket()还能做什么?socket()可以提供不同类型的通信功能(本地进程间通信)编程实验:服务器端编程初体验#include#include#include#include#include#include#includeintmain(){intserver=0;结构sockaddr_insaddr={0};intclinet=0;结构sockaddr_incaddr={0};socklen_t大小=0;intlen=0;字符buf[32]={0};整数r=0;服务器=套接字(PF_INET,SOCK_STREAM,0);if(server==-1){printf("服务器套接字错误\n");返回-1;}saddr.sin_family=AF_INET;saddr.sin_addr.s_addr=htonl(INADDR_ANY);saddr.sin_port=htons(8899);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("服务器绑定错误\n");返回-1;}if(listen(server,1)==-1){printf("服务器监听错误\n");返回-1;}printf("服务器启动成功\n");asize=sizeof(caddr);clinet=accept(server,(structsockaddr*)&caddr,&asize);if(clinet==-1){printf("客户端接受错误\n");返回-1;}printf("客户端:%d\n",clinet);长度=0;做{inti=0;r=recv(clinet,buf,sizeof(buf),0);如果(r>0){len+=r;}对于(i=0;i"0.0.0.0",表示接受本机的所有连接(例如本机有多网卡,多个IP时)客户端/服务器编程的核心模式服务器运行为长时间(死循环)接收客户端的请求,客户端连接后向服务器发送请求(协议数据)模式编程实验:客户端/服务器编程实验服务端持续监听客户端连接服务端连接后,回显客户端数据服务器收到退出然后断开连接客户端收到用户输入并发送给服务器#include#include#include#include#include#include#includeintmain(){intserver=0;结构sockaddr_insaddr={0};int客户=0;结构sockaddr_incaddr={0};socklen_t大小=0;intlen=0;字符buf[32]={0};整数r=0;服务器=套接字(PF_INET,SOCK_STREAM,0);if(server==-1){printf("服务器套接字错误\n");return-1;}saddr.sin_family=AF_INET;saddr.sin_addr.s_addr=htonl(INADDR_ANY);saddr.sin_port=htons(8888);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("serverbinderror\n");return-1;}if(listen(server,1)==-1){printf("serverlistenerror\n");return-1;}printf("serverstartsuccess\n");while(1){asize=sizeof(caddr);client=accept(server,(structsockaddr*)&caddr,&asize);if(client==-1){printf("clientaccepterror\n");return-1;}printf("client:%d\n",client);do{r=recv(client,buf,sizeof(buf),0);if(r>0){printf("接收:%s\n",buf);if(strcmp(buf,"quit")!=0){len=send(client,缓冲区,r,0);}else{休息;}}}而(r>0);关闭(客户端);}关闭(服务器);return0;}客户端#include#include#include#include#include#include#includeintmain(){intsock=0;结构sockaddr_in地址={0};int长度=0;字符buf[128]={0};字符输入[32]={0};整数r=0;sock=socket(PF_INET,SOCK_STREAM,0);if(sock==-1){printf("套接字错误\n");返回-1;}addr.sin_family=AF_INET;地址.sin_addr.s_addr=inet_addr("192.168.2.46");地址.sin_port=htons(8888);if(connect(sock,(structsockaddr*)&addr,sizeof(addr))==-1){printf("连接错误\n");返回-1;}printf("连接成功\n");while(1){printf("输入:");scanf("%s",输入);len=send(sock,输入,strlen(输入)+1,0);r=recv(sock,buf,sizeof(buf),0);if(r>0){printf("接收:%s\n",buf);}else{休息;}}关闭(袜子);return0;}思考:如何增强Server能力,同时支持多个client?