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

作业社区

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

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

胡汉三66 的学生作业:

#include #include #include #include #include #include #include //探测用户是否已经输入,如果用户在3秒内没有输入,则提示超时一次,如果超时三次,程序自动结束 void do_alarm(int sig) { printf("Timeout: < %s >\n",strsignal(sig)); } void do_child(int sig) { printf("Child exit : < %s >\n",strsignal(sig)); wait(NULL);//用在此处不会阻塞父进程,会立即释放子进程的资源. } int main(void) { pid_t cpid; char buf[100] = {0}; __sighandler_t sigret_child; __sighandler_t sigret_alarm; sigret_child = signal(SIGCHLD,do_child);//将信号和函数关联. sigret_alarm = signal(SIGALRM,do_alarm);//将信号和函数关联. if (sigret_child == SIG_ERR || sigret_alarm == SIG_ERR)//出错处理 { perror("[ERROR] signal():"); exit(EXIT_FAILURE); } cpid = fork();//创建子进程 if (cpid == -1) { perror("[ERROR] fork(): "); exit(EXIT_FAILURE); }else if (cpid == 0)//子进程 { printf("Child process < %d > start.\n",getpid()); for(int i = 0;i < 3;i++) { alarm(3);//定时器设置为3秒后,向当前进程发出SIGALRM信号 pause();//进程暂停,等待信号唤醒. } //结束子进程 kill(getppid(),SIGUSR1); exit(EXIT_SUCCESS); }else if (cpid > 0) //父进程 { printf("Please input:\n"); fgets(buf,sizeof(buf),stdin);//保存输入数据,如果没有数据输入会持续等待,子进程运行 buf[strlen(buf)-1] = '\0';//将'\n'换为'\0' printf("buf: %s\n",buf);//打印输入数据 printf("Parent process < %d > has exited.\n",getpid()); //结束子进程 kill(cpid,SIGUSR2); wait(NULL);//等待子进程进入僵尸状态,释放(父进程创建子进程过程中产生的)资源. } return 0; } 【图片】

得分 100
学习任务

weixin_慕哥3021856 的学生作业:

server.c #include #include #include #include #include #include #include #include #define BACKLOG 3 // 监听队列的长度 int main(int argc, const char *argv[]) { int sockfd, cfd, ret; int buflength, total_recv; struct sockaddr_in server_addr, client_addr; ssize_t rbytes = 0, sbytes = 0; char buffer[1024] = {0}; if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return -1; } socklen_t len = sizeof(struct sockaddr_in); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); ret = bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr)); if (ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if (ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } printf("Server listening...\n"); cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if (cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("Connection established. Client ip: %s, port: %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); for (;;) { buflength = 0; total_recv = 0; rbytes = recv(cfd, &buflength, 4, 0); if (rbytes == -1) { perror("[ERROR] data packet recv()"); exit(EXIT_FAILURE); } for (;;) { rbytes = recv(cfd, buffer + total_recv, buflength - total_recv, 0); if (rbytes == -1) { perror("[ERROR] inner packet recv()"); exit(EXIT_FAILURE); } else if (rbytes > 0) { total_recv += rbytes; if (total_recv == buflength) break; } else if (rbytes == 0) { printf("Connection closed.\n"); break; } } printf("buffer: %s\n", buffer); memset(buffer, 0, sizeof(buffer)); sleep(1); } close(sockfd); close(cfd); return 0; } client.c #include #include #include #include #include #include #include #include int main(int argc, const char *argv[]) { int sockfd, ret; ssize_t sbytes, rbytes; struct sockaddr_in server_addr; char sbuffer[] = "Hello, server."; int buflen = 0; char *pbuffer = NULL; if (argc != 3) { fprintf(stderr, "Usage: %s ip port\n", argv[0]); return -1; } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } printf("sockfd = %d\n", sockfd); bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); ret = connect(sockfd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr)); if (ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("The connection is established, please send message...\n"); for (;;) { buflen = strlen(sbuffer); pbuffer = (char *)malloc(buflen + 4); memcpy(pbuffer, &buflen, 4); memcpy(pbuffer+4, sbuffer, buflen); sbytes = send(sockfd, pbuffer, buflen+4, 0); if (sbytes == -1) { perror("[ERROR] send()"); exit(EXIT_FAILURE); } free(pbuffer); pbuffer = NULL; } close(sockfd); return 0; } 【图片】

得分 100
学习任务

weixin_慕哥3021856 的学生作业:

TCP协议是基于字节流的。当发送方发送多个小的数据包时,TCP会将其合并在一起发送,这就可能会导致粘包的现象出现;另一种情况是发送方一次发送的数据包空间较大时,即大于MTU(MTU默认是1500字节),TCP会将其拆分为多个包分别发送,这就会导致粘包的发生可能;第三种原因是接收方接受的速度小于发送方发送数据包的速度,接收方一次性读取多个数据包。 client.c #include #include #include #include #include #include #include #include int main(int argc, const char *argv[]) { int sockfd, ret; ssize_t sbytes, rbytes; struct sockaddr_in server_addr; char sbuffer[1024] = {0}; char rbuffer[1024] = {0}; if (argc != 3) { fprintf(stderr, "Usage: %s ip port\n", argv[0]); return -1; } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } printf("sockfd = %d\n", sockfd); bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); ret = connect(sockfd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr)); if (ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("The connection is established, please send message...\n"); for (int i = 0; i < 100; i++) { strncpy(sbuffer, "hello server.123456789", sizeof(sbuffer)); sbytes = send(sockfd, sbuffer, strlen(sbuffer)+1, 0); if (sbytes == -1) { perror("[ERROR] send()"); exit(EXIT_FAILURE); } } close(sockfd); return 0; } server.c #include #include #include #include #include #include #include #include #define BACKLOG 3 // 监听队列的长度 int main(int argc, const char *argv[]) { int sockfd, cfd, ret; struct sockaddr_in server_addr, client_addr; ssize_t rbytes = 0, sbytes = 0; char buffer[1024] = {0}; if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return -1; } socklen_t len = sizeof(struct sockaddr_in); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); ret = bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)); if (ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if (ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } printf("Server listening...\n"); cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if (cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("Connection established. Client ip: %s, port: %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); for (;;) { rbytes = recv(cfd, buffer, sizeof(buffer), 0); if (rbytes == -1) { perror("[ERROR] recv()"); exit(EXIT_FAILURE); } else if (rbytes > 0) { printf("Receive: %s\n", buffer); } else if (rbytes == 0) { printf("Connection closed.\n"); break; } sleep(1); } close(sockfd); close(cfd); return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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