为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

Felixxx 的学生作业:

原因:TCP 是“流式协议”,它不保留消息边界 1.发送方合并(Nagle 算法) 小数据不会立刻发,等攒够了或超时再发 → 多次 send() 合成一个包 2.接收方缓冲(应用层读取时机) 对方可能一次 recv() 读走多个 send() 的数据 或一次 send() 的数据被分成多次 recv() 读(这叫“拆包”) client #include #include #include #include #include #include #include #include int main(int argc,char* argv[]){ int sockfd; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1){ perror("error for socket"); return -1; } struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[2])); addr.sin_addr.s_addr = inet_addr(argv[1]); int res = connect(sockfd,(const struct sockaddr* )&addr,sizeof(addr)); if(res==-1){ perror("error for connect"); return -1; } ssize_t rbytes=0,sbytes = 0; char buffer[] = {"hello server"}; while(1){ sbytes = send(sockfd,buffer,strlen(buffer)+1,0); } close(sockfd); return 0; } server #include #include #include #include #include #include #include #include const int BLOCKSOCK = 100; int main(int argc,char* argv[]){ if(argc!=3){ perror("input invalid"); return -1; } int sockfd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1){ perror("error for socket"); return -1; } struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[2])); addr.sin_addr.s_addr = inet_addr(argv[1]); int res = bind(sockfd,(const struct sockaddr*)&addr,sizeof(addr)); if(res==-1){ perror("error for bind"); return -1; } res = listen(sockfd,BLOCKSOCK); if(res==-1){ perror("error for listen"); return -1; } struct sockaddr_in client; bzero(&client,sizeof(client)); socklen_t len = sizeof(client); int sockfdc = accept(sockfd,(struct sockaddr*)&client,&len); if(sockfdc==-1){ perror("error for accept"); return -1; } while(1){ rbytes = recv(sockfdc,buffer,sizeof(buffer),0); if(rbytes==0){ printf("quit\n"); break; } else if (rbytes>0){ printf("receive %s \n",buffer); if(strncmp(buffer,"quit",4)==0){ printf("quit\n"); break; } }else{ perror("error for recv"); return -1; } sleep(1); } close(sockfdc); close(sockfd); return 0; }

得分 100
学习任务

Felixxx 的学生作业:

#include #include #include #include #include #include #include #include #define LISTEN_SZ 10 #define BUFFER_SIZE 1024 int main(int argc, const char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } int sfd = socket(AF_INET, SOCK_STREAM, 0); if (sfd == -1) { perror("socket"); exit(EXIT_FAILURE); } struct sockaddr_in svr_addr; bzero(&svr_addr, sizeof(svr_addr)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); if (bind(sfd, (struct sockaddr *)&svr_addr, sizeof(svr_addr)) == -1) { perror("bind"); close(sfd); exit(EXIT_FAILURE); } if (listen(sfd, LISTEN_SZ) == -1) { perror("listen"); close(sfd); exit(EXIT_FAILURE); } printf("Server listening on %s:%s...\n", argv[1], argv[2]); struct sockaddr_in cli_addr; socklen_t len = sizeof(cli_addr); int cfd = accept(sfd, (struct sockaddr *)&cli_addr, &len); if (cfd == -1) { perror("accept"); close(sfd); exit(EXIT_FAILURE); } printf("Client connected: %s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); char buffer[BUFFER_SIZE]; ssize_t rbytes; while (1) { bzero(buffer, sizeof(buffer)); rbytes = recv(cfd, buffer, sizeof(buffer) - 1, 0); if (rbytes == -1) { perror("recv"); break; } else if (rbytes == 0) { printf("Client disconnected\n"); break; } else { printf("Received: %s", buffer); send(cfd, buffer, rbytes, 0); } } close(cfd); close(sfd); return 0; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号