问题:下面的代码输出什么?为什么?printf("连接成功\n");send(sock,"A",1,0);send(sock,"B",1,0);send(sock,"C",1,0);close(sock);do{r=recv(client,buf,sizeof(buf),0);如果(r>0){printf("接收:%s\n",buf);}}while(1);关闭(客户端);完整代码client.c#include#include#include#include#include#include#includeintmain(){intsock=0;结构sockaddr_in地址={0};intlen=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("127.0.0.1");地址.sin_port=htons(8888);如果(连接(sock,(structsockaddr*)&addr,sizeof(addr))==-1){printf("连接错误\n");返回-1;}printf("连接成功\n");发送(袜子,“A”,1,0);发送(袜子,“B”,1,0);发送(袜子,“C”,1,0);关闭(袜子);return0;}完整代码:server.c#include#include#include#include#include#include#includeintmain(){intserver=0;结构sockaddr_insaddr={0};int客户=0;结构sockaddr_incaddr={0};socklen_t大小=0;int长度=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(8888);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("服务器绑定错误\n");返回-1;}if(listen(server,1)==-1){printf("服务器监听错误\n");返回-1;}printf("服务器启动成功\n");while(1){asize=sizeof(caddr);客户端=接受(服务器,(structsockaddr*)&caddr,&asize);if(client==-1){printf("客户端接受错误\n");返回-1;}printf("客户端:%d\n",客户端);做{r=recv(客户端,buf,sizeof(buf),0);if(r>0){printf("接收:%s\n",buf);}}而(r>0);关闭(客户端);}关闭(服务器);return0;}outputserverstartsuccessclient:4Receive:ABC小知识发送缓冲区数据先进入发送缓冲区,然后被操作系统发送到远程主机的接收缓冲区TCP应用程序编程中读取数据时的“问题”接收缓冲区!网络编程中的期望是每次发送一条完整的消息,每次接收一条完整的消息。即使接收缓冲区中有多个消息,也不会有消息粘性。消息中包含数据类型、数据长度等信息应用层协议设计什么是协议?协议是通信双方为进行数据交换而制定的规则。标准或预先确定的集体协议对数据传输的影响。通信双方可以按照约定正确发送和接收数据。通信双方可根据约定对数据的含义进行解释。协议设计实例目标:设计可用于数据传输协议的完整报文包括数据头:数据类型(即:数据区用途,定长)数据长度:数据区长度(定长)数据区:字节数据(变长区)如上图:消息必须至少12个字符Section(消息头+数据长度)可以通过计算消息总长度来避免数据粘连的问题typedefstruct{unsignedshorttype;无符号短命令;无符号短索引;无符号短总数;无符号整数长度;无符号字符负载[];//灵活数组}Message;编程实验:应用层协议设计与实现#include#include#include"message.h"intmain(){intsock=0;结构sockaddr_in地址={0};intlen=0;字符buf[128]={0};字符输入[32]={0};整数r=0;消息*pm=NULL;sock=socket(PF_INET,SOCK_STREAM,0);如果(袜子==-1){printf(“所以cketerror\n");return-1;}addr.sin_family=AF_INET;addr.sin_addr.s_addr=inet_addr("127.0.0.1");addr.sin_port=htons(8888);if(connect(sock,(结构sockaddr*)&addr,sizeof(addr))==-1){printf("连接错误\n");return-1;}printf("连接成功\n");pm=Message_New(0,0,1,3,"A",1);send(sock,pm,sizeof(Message)+1,0);pm=Message_New(0,0,2,3,"B",1);send(sock,pm,sizeof(Message)+1,0);pm=Message_New(0,0,3,3,"C",1);send(sock,pm,sizeof(Message)+1,0);close(sock);返回0;}server.c#include#include#include#include#include#include#includeintmain(){intserver=0;structsockaddr_insaddr={0};intclient=0;structsockaddr_incaddr={0};socklen_t大小=0;int长度=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(8888);if(bind(server,(structsockaddr*)&saddr,sizeof(saddr))==-1){printf("服务器绑定错误\n");返回-1;}if(listen(server,1)==-1){printf("服务器监听错误\n");返回-1;}printf("服务器启动成功\n");while(1){asize=sizeof(caddr);客户端=接受(服务器,(structsockaddr*)&caddr,&asize);if(client==-1){printf("客户端接受错误\n");返回-1;}printf("客户端:%d\n",客户端);做{r=recv(客户,缓冲区,sizeof(缓冲区),0);如果(r>0){inti=0;for(i=0;i0);关闭(客户端);}关闭(服务器);)?