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

作业社区

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

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

慕神4583458 的学生作业:

tcp粘包的原因,一个是有可能传输的数据大小小于缓冲区的大小,一个是传输的数据超过了最大传输单元 另外一个原因是,服务器接收的速度小于客户端发送的速度 代码 server.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #define BACKLOG 100 int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in 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]); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { fprintf(stderr, "Bind error\n"); } ret = listen(socketfd, BACKLOG); if (ret == -1) { perror("listen():"); exit(EXIT_FAILURE); } struct sockaddr_in recvaddr_in; socklen_t len; int newsocketfd = accept(socketfd, (void *)&recvaddr_in, &len); if (ret == -1) { perror("accpet():"); exit(EXIT_FAILURE); } printf("source ip = %s port = %d\n", inet_ntoa(recvaddr_in.sin_addr), ntohs(recvaddr_in.sin_port)); char read_buf[1024]; ssize_t rsize; ssize_t wsize; while(1) { memset(read_buf, 0, sizeof(read_buf)); rsize = recv(newsocketfd, read_buf, sizeof(read_buf), 0); if (rsize < 0) { perror("recv():"); } else if (rsize > 0) { printf("recv=%s\n", read_buf); } else if (rsize == 0) { printf("client exit\n"); break; } sleep(1); } close(socketfd); close(newsocketfd); return 0; } client.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in 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]); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { perror("connet():"); close(socketfd); return -1; } char w_buf[1024]; strcpy(w_buf, "Hello world"); ssize_t rsize; int i = 0; while (1) { rsize = send(socketfd, w_buf, strlen(w_buf), 0); if (rsize == -1) { perror("recv():"); break; } else if (rsize == 0) { break; } } close(socketfd); return 0; }

得分 100
学习任务

慕神4583458 的学生作业:

server.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #define BACKLOG 100 int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in 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]); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { fprintf(stderr, "Bind error\n"); } ret = listen(socketfd, BACKLOG); if (ret == -1) { perror("listen():"); exit(EXIT_FAILURE); } struct sockaddr_in recvaddr_in; socklen_t len; int newsocketfd = accept(socketfd, (void *)&recvaddr_in, &len); if (ret == -1) { perror("accpet():"); exit(EXIT_FAILURE); } printf("source ip = %s port = %d\n", inet_ntoa(recvaddr_in.sin_addr), ntohs(recvaddr_in.sin_port)); char read_buf[1024]; ssize_t rsize; ssize_t wsize; while(1) { memset(read_buf, 0, sizeof(read_buf)); rsize = recv(newsocketfd, read_buf, sizeof(read_buf), 0); if (rsize < 0) { perror("recv():"); } else if (rsize > 0) { if (strcmp(read_buf, "quit") == 0) { printf("quit exit\n"); break; } printf("recv=%s\n", read_buf); wsize = send(newsocketfd, read_buf, strlen(read_buf), 0); if (wsize == -1) { perror("send():"); } } else if (rsize == 0) { printf("client exit\n"); break; } } close(socketfd); close(newsocketfd); return 0; } client.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in 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]); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { perror("connet():"); close(socketfd); return -1; } pid_t pid = fork(); if (pid == 0) { char read_buf[1024]; ssize_t rsize; while(1) { bzero(read_buf,sizeof(read_buf)); rsize = recv(socketfd, read_buf, sizeof(read_buf), 0); if (rsize == -1) { perror("recv():"); break; } else if (rsize == 0) { break; } printf("%s\n", read_buf); } close(socketfd); exit(EXIT_FAILURE); } char buf[1024]; ssize_t sz; while(1) { bzero(buf, sizeof(buf)); putchar('>'); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; if (strcmp(buf, "quit") == 0) break; sz = send(socketfd, buf, strlen(buf), 0); } close(socketfd); wait(NULL); return 0; }

得分 100
学习任务

SamstagBaron 的学生作业:

sender #include #include #include #include #include #include #include #include #define SHMPATH "." const int projectId = 100; const int cache = 1024; void handle_signal(int signum){ printf("get signal %s \n",strsignal(signum)); } int main(){ key_t key = ftok(SHMPATH,projectId); if(-1==key){ perror("[ERROR] ftok() : "); exit(EXIT_FAILURE); } int shmid = shmget(key,cache,IPC_CREAT|0644); if(shmid==-1){ perror("[ERROR] shmget() : "); exit(EXIT_FAILURE); } printf("Create shm : %d \n",shmid); signal(SIGUSR1,handle_signal); void* addr = shmat(shmid,NULL,0); if(addr==(void*)-1){ perror("[ERROR] shmat() : "); exit(EXIT_FAILURE); } memset(addr,0,1024); FILE* f = fopen("log.txt","r"); char data[20] = {0}; size_t rbytes; rbytes = fread(data,1,20,f); while(rbytes>0){ while(*(int*)addr!=0); memcpy(((int*)addr +1),data,rbytes); *(int*)addr |= rbytes; rbytes = fread(data,1,20,f); } while(*(int*)addr!=0); *(int*)addr |= -1; shmdt(addr); return 0; } receiver #include #include #include #include #include #include #include #include #define SHMPATH "." const int projectId = 100; const int cache = 1024; void handle_signal(int signum){ printf("get signal %s \n",strsignal(signum)); } int main(){ key_t key = ftok(SHMPATH,projectId); if(-1==key){ perror("[ERROR] ftok() : "); exit(EXIT_FAILURE); } int shmid = shmget(key,cache,IPC_CREAT|0644); if(shmid==-1){ perror("[ERROR] shmget() : "); exit(EXIT_FAILURE); } printf("Create shm : %d \n",shmid); signal(SIGUSR1,handle_signal); void* addr = shmat(shmid,NULL,0); if(addr==(void*)-1){ perror("[ERROR] shmat() : "); exit(EXIT_FAILURE); } FILE* f = fopen("log_copy.txt","w+"); char data[20] = {0}; size_t res; while(*(int*)addr!=-1){ while(*(int*)addr==0); res = *(int*)addr ; if(res==-1){ break; } memcpy(data,((int*)addr +1),res); size_t rbytes = fwrite(data,1,res,f); memset(addr,0,rbytes+4); } shmdt(addr); int res1 = shmctl(shmid,IPC_RMID,NULL); if(res1==-1){ perror("[ERROR] shmctl() : "); exit(EXIT_FAILURE); } printf("SHM %d has erased\n",shmid); return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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