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

作业社区

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

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

阿大月 的学生作业:

main.c #include "squelist.h" int main() { seqlist_t *l = create_empty_seqlist(); datatype_t st; printf("请输入学生信息:\n"); while(is_full_seqlist(l)){ scanf("%s%d%d", st.name, &(st.id), &(st.age)); insert_data_seqlist(l, st); } printf_data_seqlist(l); return 0; } squelish.c #include "squelist.h" seqlist_t *create_empty_seqlist() { seqlist_t *l = (seqlist_t*)malloc(sizeof(seqlist_t)); if (NULL == l){ printf("malloc is failed\n"); return NULL; } memset(l, 0, sizeof(seqlist_t)); return l; } int is_full_seqlist(seqlist_t *l) { if (l->n >= MAX) return 0; return 1; } void insert_data_seqlist(seqlist_t *l,datatype_t data) { l->buf[l->n] = data; l->n++; } void printf_data_seqlist(seqlist_t *l) { int i = 0; printf("NAME\tID\tage\n"); for (i=0;in;i++){ printf("%s\t%d\t%d\n", (l->buf)[i].name, (l->buf)[i].id, (l->buf)[i].age); } } squelist.h #ifndef __SQUELIST_H__ #define __SQUELIST_H__ // 头文件中放的都是宏、结构体的定义声明,对应.c文件中的函数声明,全局变量的extren的声明 #include #include #include #define MAX 3 //实际学⽣的存储 struct student { char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct{ datatype_t buf[MAX]; //定义数组记录班级学⽣每个学⽣的信息。 int n; //学⽣实际到来的个数。 }seqlist_t; seqlist_t *create_empty_seqlist(); int is_full_seqlist(seqlist_t *l); void insert_data_seqlist(seqlist_t *l,datatype_t data); void printf_data_seqlist(seqlist_t *l); #endif

得分 100
学习任务

胡汉三66 的学生作业:

ex_poll_read.c #include #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 //使用 poll 函数监控 有名管道,如果 有名管道有数据时,读取数据并打印 int main(void) { int ret,fd_f; ret = mkfifo(PATH,0644);//创建有名管道 if (ret == -1) { perror("[ERROR] mkfifo() :\n"); exit(EXIT_FAILURE); } fd_f = open(PATH,O_RDONLY);//以只读方式打开管道文件,返回文件描述符 if (fd_f == -1) { perror("[ERROR] open ():\n"); exit(EXIT_FAILURE); } for(;;) { struct pollfd fds = { .fd = fd_f,//"0",标准输入 文件描述符 .events = POLLIN,//定义事件,普通可读数据 }; ret = poll(&fds,1,3000);//"3000",超时时间3000毫秒,1000毫秒 = 1秒 if (ret == -1) { perror("[ERROR] select () :\n"); close(fd_f);//关闭文件描述符 exit(EXIT_FAILURE);//失败退出 }else if(ret == 0)//超时退出 { printf("TIMEOUT!\n"); }else if(ret > 0)//有就绪的文件描述符 { if (fds.revents & POLLIN)//判断是否有可读数据 { char buffer[64] = {0}; ssize_t rbytes; rbytes = read(fd_f,buffer,64);//读取管道文件中的数据,保存在数组buffer中 if(rbytes == -1) { perror("[ERROR] read () :\n"); close(fd_f);//关闭文件描述符 exit(EXIT_FAILURE); } printf("buffer : %s\n",buffer); } } } close(fd_f);//关闭文件描述符 return 0; } ex_write.c #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 //循环 输入数据 到 管道文件 中 int main(void) { int fd_f; ssize_t wbytes;//定义实际写入的字节数 char buffer[64] = {0}; fd_f = open(PATH,O_WRONLY);//以 只写方式 打开 管道文件,并返回文件描述符 if (fd_f == -1) { perror("[ERROE] open() :\n"); exit(EXIT_FAILURE); } for(;;) { fgets(buffer,sizeof(buffer),stdin);//从标准输入 获取 一行数据,保存在buffer中 wbytes = write(fd_f,buffer,64);//将数组buffer中的数据 写入 管道文件 中 if (wbytes == -1) { perror("[ERROR] write() :\n"); close(fd_f); exit(EXIT_FAILURE); } } close(fd_f);//关闭文件描述符 return 0; } 管道输入数据: 【图片】 读取管道数据,并打印【图片】

得分 100
学习任务

大禹123 的学生作业:

#include "server.h" #define LOGIN_FAIL 0 #define LOGIN_SUCCESS 1 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static int login_flag = 0; int create_socket_and_bind(const char *ip, const char *port) { int sockfd; struct sockaddr_in addr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); socklen_t addrlen = sizeof(struct sockaddr_in); if(sockfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; //端口字符---》整数---》网络字节序 addr.sin_port = htons(atoi(port)) ; //ip字符---》网络字节序 addr.sin_addr.s_addr = inet_addr(ip); if((bind(sockfd, (const struct sockaddr *)&addr, addrlen))==-1) { perror("[ERROR] bind():"); return -1; } return sockfd; } void *recive_data(void *arg) { int ret; char buf[256] = {0}; struct sockaddr_in client_addr; int newsockfd = *(int *)arg; int addrlen = sizeof(struct sockaddr_in); memset(&client_addr, 0, sizeof(struct sockaddr_in)); while(1) { memset(buf, 0, sizeof(buf)); if((recvfrom(newsockfd, (void *)buf, sizeof(buf), 0,(struct sockaddr *)&client_addr, &addrlen))==-1) { perror("[ERROR] recvfrom():"); pthread_exit(NULL); } print_client_info(&client_addr, buf); if(strncmp(buf,"quit",4) == 0) { close(newsockfd); pthread_exit(NULL); } } } void msg_handle(const char *ip, const char *port, socklen_t addrlen) { char buf[256] = {0}; struct sockaddr_in client_addr; int ret; pthread_t tid; int newsockfd; int sockfd = create_socket_and_bind(ip, port); if(sockfd == -1) { exit(EXIT_FAILURE); } memset(&client_addr, 0, sizeof(struct sockaddr_in)); while(1) { if((recvfrom(sockfd, (void *)buf, sizeof(buf), 0,(struct sockaddr *)&client_addr, &addrlen))==-1) { perror("[ERROR] recvfrom():"); exit(EXIT_FAILURE); } login_flag = (strncmp(buf,"root",4) == 0) ? LOGIN_SUCCESS : LOGIN_FAIL; //如果登录成功了,那么创建子进程处理消息发送 if(login_flag == LOGIN_SUCCESS) { newsockfd = create_socket_and_bind(ip, "0"); if(newsockfd == -1) { exit(EXIT_FAILURE); } ret = sendto(newsockfd, (const void *)&login_flag, sizeof(login_flag), 0, (const struct sockaddr*)&client_addr, addrlen); if(ret == -1) { perror("[ERROR] sendto():"); pthread_exit(NULL); } ret = pthread_create(&tid, NULL, recive_data, (void *)&newsockfd); if(ret!=0) { fprintf(stderr,"[ERROR] pthread_create(): < %s >", strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); }else { //如果失败了,那么告诉客户端登录失败 sendto(sockfd, (const void *)&login_flag, sizeof(login_flag), 0, (const struct sockaddr*)&client_addr, addrlen); } } return ; } void print_client_info(struct sockaddr_in *client_addr, char *buf) { pthread_mutex_lock(&mutex); printf("\n==========================\n"); printf("client ip: %s\n", inet_ntoa(client_addr->sin_addr)); printf("client port: %d\n", ntohs(client_addr->sin_port)); printf("client buf: %s\n", buf); pthread_mutex_unlock(&mutex); } //server ip port int main(int argc, char const *argv[]) { int new_sockfd; socklen_t addrlen = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port\n", argv[0]); exit(EXIT_FAILURE); } msg_handle(argv[1], argv[2], addrlen); return 0; }

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include /* See NOTES */ #include #include #include /* superset of previous */ #include #include #include #include #include "sem.h" #define LOGIN_FAIL 0 #define LOGIN_SUCCESS 1 static int g_semid; int create_socket_and_bind(const char *ip, const char *port) { int sockfd; struct sockaddr_in addr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); socklen_t addrlen = sizeof(struct sockaddr_in); if(sockfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; //端口字符---》整数---》网络字节序 addr.sin_port = htons(atoi(port)) ; //ip字符---》网络字节序 addr.sin_addr.s_addr = inet_addr(ip); if((bind(sockfd, (const struct sockaddr *)&addr, addrlen))==-1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } return sockfd; } void sig_wait_do(int signum) { printf("receive msg: %s\n", strsignal(signum)); wait(NULL); } int login_handle(const char *ip, const char *port, socklen_t addrlen) { char buf[256] = {0}; struct sockaddr_in client_addr; int sockfd = create_socket_and_bind(ip, port); int new_sockfd; int login_flag = 0; memset(&client_addr, 0, sizeof(struct sockaddr_in)); while(1) { if((recvfrom(sockfd, (void *)buf, sizeof(buf), 0,(struct sockaddr *)&client_addr, &addrlen))==-1) { perror("[ERROR] recvfrom():"); exit(EXIT_FAILURE); } login_flag = (strncmp(buf,"root",4) == 0) ? LOGIN_SUCCESS : LOGIN_FAIL; //如果登录成功了,那么创建子进程处理消息发送 if(login_flag == LOGIN_SUCCESS) { if(fork() == 0) { close(sockfd); new_sockfd = create_socket_and_bind(ip, "0"); sendto(new_sockfd, (const void *)&login_flag, sizeof(login_flag), 0, (const struct sockaddr*)&client_addr, addrlen); break; } }else { //如果失败了,那么告诉客户端登录失败 sendto(sockfd, (const void *)&login_flag, sizeof(login_flag), 0, (const struct sockaddr*)&client_addr, addrlen); } } return new_sockfd; } void print_client_info(struct sockaddr_in *client_addr, char *buf) { sem_p(g_semid, 0); printf("\n==========================\n"); printf("client ip: %s\n", inet_ntoa(client_addr->sin_addr)); printf("client port: %d\n", ntohs(client_addr->sin_port)); printf("client buf: %s\n", buf); sem_v(g_semid, 0); } void recive_data(int sockfd, socklen_t addrlen) { char buf[256] = {0}; struct sockaddr_in client_addr; memset(&client_addr, 0, sizeof(struct sockaddr_in)); while(1) { if((recvfrom(sockfd, (void *)buf, sizeof(buf), 0,(struct sockaddr *)&client_addr, &addrlen))==-1) { perror("[ERROR] recvfrom():"); exit(EXIT_FAILURE); } print_client_info(&client_addr, buf); if(strncmp(buf,"quit",4) == 0) { close(sockfd); exit(EXIT_FAILURE); } } } //server ip port int main(int argc, char const *argv[]) { int new_sockfd; socklen_t addrlen = sizeof(struct sockaddr_in); unsigned short values[]={1}; g_semid = sem_create(1,values); if(argc!=3) { fprintf(stderr,"Usage: %s ip port\n", argv[0]); exit(EXIT_FAILURE); } __sighandler_t ret = signal(SIGCHLD, sig_wait_do); new_sockfd = login_handle(argv[1], argv[2], addrlen); recive_data(new_sockfd, addrlen); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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