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

作业社区

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

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

别摸我的键盘 的学生作业:

1.tcp粘包(主要是自定义结构)的原因,可以从两方面分析,一个是发送方,一个是接收方 (一)发送方角度: 1)当发送方发送的数据小于内核缓冲区时,默认情况下,会使用Nagle算法,合并多个包,导致TCP粘包 2)另外一个情况时,发送包的大小超过MTU,导致一个包被拆分成多个,也会导致TCP粘包问题 (二)接收方角度: 如果发送方发送的速度,远远大于接收方,接收方在读取缓存时,就有可能读取到多个包,或者读取到被拆分不完整的包 2.粘包代码验证(发送方速度大于接收方) 发送方 #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, const char *argv[]) { int sockfd,ret; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("please input send data\n"); while(1){ memset(buf, 0, sizeof(buf)); strcpy(buf, "hello server"); if(buf[sizeof(buf) -1] == '\n') buf[sizeof(buf) - 1] = '\0'; sz = send(sockfd, buf, strlen(buf), 0); if(sz == -1){ perror("[ERROR] send()"); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0){ break; } } close(sockfd); return 0; } 接收方 #include #include #include #include /* See NOTES */ #include #include #include #include #define QUEUE_SZ 10 int main(int argc, const char *argv[]) { int sockfd,ret,csockfd; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, QUEUE_SZ); if(-1 == ret){ perror("[ERROR] listen()"); exit(EXIT_FAILURE); } int len = sizeof(addr_in); csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len); if(-1 == csockfd){ perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr)); // printf("client port is %d\n", ntohs(addr_in.sin_port)); while(1){ memset(buf, 0, sizeof(buf)); sz = recv(csockfd, buf, sizeof(buf), 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); }else if(sz == 0){ printf("client quit!\n"); break; } printf("recv data is --> %s\n", buf); if(strncmp(buf, "quit", 4) == 0){ printf("server quit!\n"); break; } sleep(1); }; close(csockfd); close(sockfd); return 0; }

得分 100
学习任务

别摸我的键盘 的学生作业:

client #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, const char *argv[]) { int sockfd,ret; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("please input send data\n"); while(1){ printf(">"); memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf), stdin); if(buf[sizeof(buf) -1] == '\n') buf[sizeof(buf) - 1] = '\0'; sz = send(sockfd, buf, strlen(buf), 0); if(sz == -1){ perror("[ERROR] send()"); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0){ break; } } close(sockfd); return 0; } server #include #include #include #include /* See NOTES */ #include #include #include #include #define QUEUE_SZ 10 int main(int argc, const char *argv[]) { int sockfd,ret,csockfd; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, QUEUE_SZ); if(-1 == ret){ perror("[ERROR] listen()"); exit(EXIT_FAILURE); } int len = sizeof(addr_in); csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len); if(-1 == csockfd){ perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr)); // printf("client port is %d\n", ntohs(addr_in.sin_port)); while(1){ memset(buf, 0, sizeof(buf)); sz = recv(csockfd, buf, sizeof(buf), 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); }else if(sz == 0){ printf("client quit!\n"); break; } printf("recv data is --> %s\n", buf); if(strncmp(buf, "quit", 4) == 0){ printf("server quit!\n"); break; } }; close(csockfd); close(sockfd); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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