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

作业社区

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

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

枝wenz_fpJNR0 的学生作业:

#include #include #include #include #include #include #include #include #define MSG_PATH "." #define MSG_KEY 0x123456 #define MSG_TYPE_1 100 #define MSG_TYPE_2 200 #define MSG_SIZE 1024 // 消息队列消息结构体 typedef struct msgbuf{ long mtype; char mtext[MSG_SIZE]; }msgbuf_t; void error_exit(char *msg){ perror(msg); exit(EXIT_FAILURE); } int main(int argc, char const *argv[]) { size_t rbytes;//接收的字节数 size_t rbytes2;//接收的字节数2 msgbuf_t msg;//消息结构体 int msgid;//消息队列ID key_t key;//消息队列键值 // 生成消息队列键值 key = ftok(MSG_PATH, MSG_KEY); msgid = msgget(key, IPC_CREAT | 0666);//创建消息队列 if (msgid == -1) { error_exit("[ERROR] msgget() :"); } fprintf(stdout, "msgid = %d\n", msgid);//打印msgid pid_t cpid_1; cpid_1 = fork();//创建子进程1 if (cpid_1 == -1) { error_exit("[ERROR] fork() :"); } if (cpid_1 == 0){ // 子进程1 while(1){ //fprintf(stdout, "子进程1开始接收消息...\n"); rbytes = msgrcv(msgid, &msg, sizeof(msgbuf_t), MSG_TYPE_1, 0);//接收消息 if (rbytes == -1) { perror("[ERROR] msgrcv() :"); } if(strcmp(msg.mtext, "quit") == 0)//如果用户输入quit,则退出循环 { printf("子进程1收到退出信号,退出\n"); exit(EXIT_SUCCESS);//退出子进程1 } fprintf(stdout, "子进程1接收消息: %s\n", msg.mtext);//打印接收的消息 if (rbytes == 0) { fprintf(stdout, "子进程1接收消息失败\n");//打印接收消息失败 } } exit(EXIT_SUCCESS);//退出子进程1 } pid_t cpid_2; cpid_2 = fork();//创建子进程2 if (cpid_2 == -1) { error_exit("[ERROR] fork() :"); } if (cpid_2 == 0){ // 子进程2 while(1){ //fprintf(stdout, "子进程2开始接收消息...\n"); rbytes2 = msgrcv(msgid, &msg, sizeof(msgbuf_t), MSG_TYPE_2, 0);//接收消息 if (rbytes2 == -1) { perror("[ERROR] msgrcv() :"); } if(strcmp(msg.mtext, "quit") == 0)//如果用户输入quit,则退出循环 { printf("子进程2收到退出信号,退出\n"); exit(EXIT_SUCCESS);//退出子进程2 } fprintf(stdout, "子进程2接收消息: %s\n", msg.mtext);//打印接收的消息 if (rbytes2 == 0) { fprintf(stdout, "子进程2接收消息失败\n");//打印接收消息失败 } } exit(EXIT_SUCCESS);//退出子进程2 } //父进程 char input[MSG_SIZE];//要写入的数据 char target_str[10];//目标子进程字符串 int target;//目标子进程 printf("父进程(PID:%d)启动,输入消息发送给子进程\n", getpid());//提示用户输入 while(1)//循环读取用户输入,直到用户输入quit { printf("请输入要写入的数据: ");//提示用户输入 if(fgets(input, MSG_SIZE, stdin) == NULL)//读取用户输入 break; // 移除换行符 size_t len=strlen(input); if (len > 0 && input[len-1] == '\n') { input[len-1] = '\0'; } // 发送消息 if(strcmp(input, "quit") == 0){//如果用户输入quit,则退出循环 // 发送退出信号 msg.mtype = MSG_TYPE_1; // 发送消息到子进程1 strcpy(msg.mtext, "quit"); msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0); msg.mtype = MSG_TYPE_2; // 发送消息到子进程2 strcpy(msg.mtext, "quit"); msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0); wait(NULL);//等待子进程1结束 wait(NULL);//等待子进程2结束 printf("父进程收到退出信号,退出\n");//打印退出信息 exit(EXIT_SUCCESS);//退出父进程 } if(strcmp(input, "delete") == 0){//如果用户输入delete,则删除消息队列 fprintf(stdout, "父进程收到删除消息队列信号,正在通知子进程1和子进程2退出\n");//打印删除消息队列信号 // 发送退出信号 msg.mtype = MSG_TYPE_1; // 发送消息到子进程1 strcpy(msg.mtext, "quit"); msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0); msg.mtype = MSG_TYPE_2; // 发送消息到子进程2 strcpy(msg.mtext, "quit"); msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0); wait(NULL);//等待子进程1结束 wait(NULL);//等待子进程2结束 fprintf(stdout, "父进程收到子进程1和子进程2的退出信号,删除消息队列\n");//打印删除消息队列信号 // 删除消息队列 msgctl(msgid, IPC_RMID, 0);//删除消息队列 fprintf(stdout, "父进程删除消息队列成功\n");//打印删除消息队列成功 break; } while(1){ printf("请输入目标子进程(1:子进程1,2:子进程2): ");//提示用户输入 if(fgets(target_str, sizeof(target_str), stdin) == NULL)//读取用户输入 break; target = atoi(target_str);//将字符串转换为整数 if(target != 1 && target != 2)//如果用户输入不是1或2,则提示用户输入 { fprintf(stdout, "请输入1或2\n");//提示用户输入 continue;//继续循环 } break;//退出循环 } // 发送消息到子进程1 if(target == 1) { msg.mtype = MSG_TYPE_1;//消息类型 strcpy(msg.mtext, input); if(msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0) == -1) { perror("[ERROR] msgsnd() :"); fprintf(stdout, "父进程发送消息到子进程1失败\n");//打印发送消息失败 } } sleep(0.5);//等待0.5秒 // 发送消息到子进程2 if(target == 2) { msg.mtype = MSG_TYPE_2;//消息类型 strcpy(msg.mtext, input); if(msgsnd(msgid, &msg, strlen(msg.mtext)+1, 0) == -1) { perror("[ERROR] msgsnd() :"); fprintf(stdout, "父进程发送消息到子进程2失败\n");//打印发送消息失败 } } sleep(0.5);//等待0.5秒 } waitpid(cpid_1, NULL, 0);//等待子进程1结束 waitpid(cpid_2, NULL, 0);//等待子进程2结束 fprintf(stdout, "受到子进程1和子进程2的退出信号,退出\n");//打印退出信息 exit(EXIT_SUCCESS);//退出父进程 return 0; }

得分 100
学习任务

学无止境呀呀呀 的学生作业:

server.c #include #include #include #include #include #include #include #include #define BACKLOG 10 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } int sfd,ret,cfd; int length,total_received; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; char pbuffer[1024] = {0}; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //初始化服务端地址结构对象 bzero(&svr_addr,sizeof(struct sockaddr_in)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //绑定ip与端口号 ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } //设置监听套接字为监听状态,建立监听队列 ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen."); close(sfd); exit(EXIT_FAILURE); } printf("服务端启动成功,等待客户端连接....\n"); //与客户端进行三次握手,并建立连接默认是阻塞 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to accept."); close(sfd); exit(EXIT_FAILURE); } printf("ip : %s port :%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { //计算发送数据的长度 length = 0; total_received = 0; //接收数据长度 rbytes = recv(cfd,&length,4,0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); } for(;;) { //接收数据长度 rbytes = recv(cfd,buffer+total_received,length-total_received,0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); exit(EXIT_FAILURE); }else if(rbytes == 0) { printf("客户端已经端开连接\n"); }else if(rbytes>0) { total_received += rbytes;//累加已经接收的字节数 if(total_received == length)//当接收的长度与目标长度一致时,表示数据接收完成 break; } } send(cfd, buffer,sizeof(buffer),0); printf("buffer :%s\n",buffer); sleep(1); } //关闭套接字 close(cfd); close(sfd); return 0; } client.c #include #include #include #include #include #include #include #include void main(int argc,char *argv[]) { int sockfd; struct sockaddr_in addr; ssize_t sbytes = 0,rbytes = 0; char buffer[] = "Hello,server"; char rbuffer[1024] = {0}; int length; char *pbuffer = NULL; if(argc!=3) { fprintf(stderr,"Usage: %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } //创建套接字 sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd ==-1) { perror("socket error"); exit(EXIT_FAILURE); } printf("std = %d\n",sockfd); bzero(&addr,sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[2])); addr.sin_addr.s_addr = inet_addr(argv[1]); if(connect(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr_in)) == -1) { perror("connect error"); exit(EXIT_FAILURE); } while(1) { length = strlen(buffer); pbuffer = (char *)malloc(length+4);//分配空间,包含长度空间 与数据空间 memcpy(pbuffer,&length,4);//拷贝长度到缓冲区中 memcpy(pbuffer+4,buffer,length);//拷贝数据到缓冲区中 sbytes = send(sockfd,pbuffer,length+4,0);//发送数据给服务器 if(sbytes == -1) { perror("[ERROR] Failed to send."); close(sockfd); exit(EXIT_FAILURE); }else if(sbytes >0) { int ret = recv(sockfd,rbuffer,sizeof(rbuffer),0); if(ret >0) { printf("服务端收到客户端消息:%s\n",rbuffer); } } } }

得分 100
学习任务

枝wenz_fpJNR0 的学生作业:

//探测用户是否已经输入,如果用户在3秒内没有输入则提示超时一次,如果超时三次程序自动结束。 #include #include #include #include #include #include static int timeout_count = 0; // 静态变量,记录已超时次数,整个文件可见 static int input_received = 0; // 标志位:1表示用户已输入,0表示未输入 void error_handle(char *msg) { perror(msg); exit(EXIT_FAILURE); } void do_alarm(int signum) { if(input_received == 0) { timeout_count++;//超时次数加1 printf("\n[超时 %d/3] 未检测到输入!\n", timeout_count); if(timeout_count >= 3) { printf("\n[超时 3/3] 未检测到输入,程序自动结束!\n"); exit(EXIT_FAILURE); } alarm(3);//设置3秒的闹钟 } // 处理闹钟信号 fprintf(stdout, "%s闹钟信号被触发\n", strsignal(signum)); } int main(int argc, char const *argv[]) { char buf[1024];//用于存储用户输入的缓冲区 __sighandler_t sigret=signal(SIGALRM, do_alarm);//注册信号处理函数do_alarm if(sigret==SIG_ERR) { error_handle("[ERROR] signal(): 注册失败!\n"); } while(1) { input_received = 0;//重置标志位 alarm(3);//设置3秒的闹钟 // 等待用户输入 printf("请输入: ");//提示用户输入 if(fgets(buf, sizeof(buf), stdin) != NULL)//读取用户输入 { input_received = 1;//设置标志位为1 alarm(0);//取消闹钟 } buf[strlen(buf)-1] = '\0';//移除换行符 printf("您输入的内容是: %s\n", buf);//打印用户输入的内容 if(strcmp(buf, "quit") == 0)//如果用户输入quit,则退出循环 { exit(EXIT_SUCCESS); } } return 0; }

得分 100
学习任务

学无止境呀呀呀 的学生作业:

1.理解 tcp 粘包的原因:tcp优化机制和超过1500个字节 #include #include #include #include #include #include #include #include #define BACKLOG 10 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } int sfd,ret,cfd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //初始化服务端地址结构对象 bzero(&svr_addr,sizeof(struct sockaddr_in)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //绑定ip与端口号 ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen."); close(sfd); exit(EXIT_FAILURE); } printf("服务端启动成功,等待客户端连接....\n"); //接收客户端连接 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to accept."); close(sfd); exit(EXIT_FAILURE); } printf("ip : %s port :%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { memset(buffer,0,sizeof(buffer)); //接收客户端消息 rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); }else if (rbytes>0) { printf("buffer :%s\n",buffer); }else if (rbytes == 0) { printf("客户端已断开连接"); break; } sleep(1); } //关闭套接字 close(cfd); close(sfd); return 0; } #include #include #include #include #include #include #include #include #define BACKLOG 10 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } int sfd,ret,cfd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //初始化服务端地址结构对象 bzero(&svr_addr,sizeof(struct sockaddr_in)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //绑定ip与端口号 ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen."); close(sfd); exit(EXIT_FAILURE); } printf("服务端启动成功,等待客户端连接....\n"); //接收客户端连接 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to accept."); close(sfd); exit(EXIT_FAILURE); } printf("ip : %s port :%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { memset(buffer,0,sizeof(buffer)); //接收客户端消息 rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); }else if (rbytes>0) { //发回给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); } }else if (rbytes == 0) { printf("客户端已断开连接"); break; } printf("客户端发来:%s",buffer); //回显给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] send():"); close(cfd); close(sfd); exit(EXIT_FAILURE); } //收到quit 退出本次连接 if(strcmp(buffer,"quit\n") == 0) { printf("客户端请求退出,服务端结束本次连接\n"); break; } } //关闭套接字 close(cfd); close(sfd); return 0; }

得分 100
学习任务

学无止境呀呀呀 的学生作业:

tcp_echo_server.c #include #include #include #include #include #include #include #include #define BACKLOG 10 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } int sfd,ret,cfd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //初始化服务端地址结构对象 bzero(&svr_addr,sizeof(struct sockaddr_in)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //绑定ip与端口号 ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen."); close(sfd); exit(EXIT_FAILURE); } printf("服务端启动成功,等待客户端连接....\n"); //接收客户端连接 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to accept."); close(sfd); exit(EXIT_FAILURE); } printf("ip : %s port :%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { memset(buffer,0,sizeof(buffer)); //接收客户端消息 rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); }else if (rbytes>0) { //发回给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); } }else if (rbytes == 0) { printf("客户端已断开连接"); break; } printf("客户端发来:%s",buffer); //回显给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] send():"); close(cfd); close(sfd); exit(EXIT_FAILURE); } //收到quit 退出本次连接 if(strcmp(buffer,"quit\n") == 0) { printf("客户端请求退出,服务端结束本次连接\n"); break; } } //关闭套接字 close(cfd); close(sfd); return 0; } tcp_client.c #include #include #include #include #include #include #include #include int main(int argc,char *argv[]) { int sfd,ret; ssize_t sbytes = 0,rbytes = 0; char sbuffer[1024] = {0}; char rbuffer[1024] = {0}; struct sockaddr_in svr_addr; char buffer[1024] = {0}; if(argc != 3) { fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); return -1; } //创建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } printf("sfd = %d\n",sfd); //初始化服务器地址结构体 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]); //连接服务器 ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(svr_addr)); if(ret == -1) { perror("[ERROR] connect()"); close(sfd); exit(EXIT_FAILURE); } printf("已连接服务器\n"); while(1) { memset(sbuffer,0,sizeof(sbuffer)); memset(rbuffer,0,sizeof(rbuffer)); printf("请输入要发送的信息:"); if(fgets(sbuffer,sizeof(sbuffer),stdin) == NULL) { break; } //连同'\0'也发过去 strlen 当前字符串实际长度 sbytes = send(sfd,sbuffer,strlen(sbuffer)+1,0); if(sbytes == -1) { perror("[ERROR] send():"); close(sfd); exit(EXIT_FAILURE); } //接收服务端回显 rbytes = recv(sfd,rbuffer,sizeof(rbuffer),0); if(rbytes == -1) { perror("[ERROR] recv()"); close(sfd); exit(EXIT_FAILURE); }else if(rbytes == 0) { printf("服务端已端开连接\n"); break; } printf("服务端回显:%s",rbuffer); //输入quit后退出客户端 if(strcmp(sbuffer,"quit\n") == 0) { printf("客户端退出\n"); break; } } close(sfd); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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