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

作业社区

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

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

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

file_transfer.h #ifndef __FILE_TRANSFER_H_ #define __FILE_TRANSFER_H_ #include #include #include #include #include #include #include #include #include #include #include #define FILENAME_SZ 1024 typedef struct file_protocol{ size_t filesize;//文件大小 char filename[FILENAME_SZ];//文件名 }file_protocol_t; //文件协议 extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_failedata(int cfd,const char *filename,size_t targetsize); #endif file_transfer.c 编译命令:gcc file_transfer.c file_transfer.h debug.h tcpsocket.h -o file_transfer #include "file_transfer.h" #include "tcpsocket.h" #include "debug.h" int recv_protocol_head(int cfd,file_protocol_t *p_head) { ssize_t rbytes; ssize_t total_received = 0;//收到的数量 char *buffer = (char *)p_head;//按照字节流接收 //进行循环接收,防止tcp粘包 for(;;){ rbytes = tcp_recv_pack(cfd,buffer+total_received,sizeof(file_protocol_t)-total_received); if(rbytes == -1) { DEBUG_INFO("[ERROR]: %s",strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO] : The client has been shutdown.\n"); break; }else if(rbytes>0) { total_received += rbytes; if(total_received == sizeof(file_protocol_t))//完成的接收了 break; } } if(total_received != sizeof(file_protocol_t)) { DEBUG_INFO("[ERROR] : Failed to receive data.\n"); return -1; } return 0; } //接收文件数据 int recv_failedata(int cfd,const char *filename,size_t targetsize) { int fd; ssize_t rbytes = 0,wbytes = 0,file_size = 0; char buffer[1024] = {0}; DEBUG_INFO("[INFO] : filename %s\n",filename); //检查文件是否存在 fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666); if(fd == -1) { DEBUG_INFO("[ERROR] Failed to open filename"); return -1; } for(;;) { //接收文件数据 rbytes = tcp_recv_pack(cfd,buffer,sizeof(buffer)); if(rbytes == -1) { DEBUG_INFO("[ERROR] :%s",strerror(errno)); return -1; }else if(rbytes == 0) { DEBUG_INFO("[INFO] : The client has been shutdown.\n"); break; }else if (rbytes >0) { wbytes = write(fd,buffer,rbytes);//写入fd,读多少写多少 if(wbytes != rbytes) { DEBUG_INFO("[ERROR] : Failed to write data.\n"); return -1; } //文件大小 file_size += rbytes; if(file_size == targetsize) break; } } close(fd); return file_size; }

得分 100
学习任务

枝wenz_fpJNR0 的学生作业:

#ifndef __SEM_HANDLE_H__ #define __SEM_HANDLE_H__ #include #include #include #include #include #include #include #include #include #define SEM_PRO_ID 0//进程的ID #define SEM_PATH "."//当前目录 //信号量集的初始化值 /* 创建信号量集合 @param nsems : 信号量的数量 @param values : 信号量的值 @return : 成功 : 0 失败 : -1 */ typedef union semun{ int val; unsigned short *array; }semunion; extern void error_handle(char *msg);//错误处理函数 extern int sem_create(int nsems,unsigned short values[]); //创建信号量集合 extern int sem_p(int semid,int semnum);// 占用资源 extern int sem_v(int semid,int semnum);// 释放资源 extern int sem_del(int semid); // 删除信号量集合 extern char *gettime(void);//获取当前时间 #endif #include "sem_handle.h" //错误处理函数 void error_handle(char *msg) { perror(msg); exit(EXIT_FAILURE); } //获取当前时间 char *gettime(void) { static char buf[64]; // static 保证返回后有效 time_t now; struct tm *tm_now; time(&now); // 获取当前时间戳 tm_now = localtime(&now); // 转成本地时间 // 格式化:年-月-日 时:分:秒 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_now); return buf; } //创建信号量集合 int sem_create(int nsems,unsigned short values[]) { int semid,ret; key_t key; semunion semun; //获取信号量集的键值 key = ftok(SEM_PATH,SEM_PRO_ID); if(key == -1) { error_handle("[ERROR] ftok(): "); } //创建信号量集 semid = semget(key,nsems,IPC_CREAT|0666); if(semid == -1) { error_handle("[ERROR] semget(): "); } semun.array = values; ret = semctl(semid,0,SETALL,semun);//设置信号量集的初始值 if(ret == -1) { perror("[ERROR] semctl(): "); return -1; } return semid; } //信号量P操作 int sem_p(int semid,int semnum) { struct sembuf sops; sops.sem_num = semnum; sops.sem_op = -1; sops.sem_flg = 0;//自动释放 return semop(semid,&sops,1); } //信号量V操作 int sem_v(int semid,int semnum) { struct sembuf sops; sops.sem_num = semnum; sops.sem_op = 1; sops.sem_flg = 0;//自动释放 return semop(semid,&sops,1); } //删除信号量集 int sem_del(int semid) { return semctl(semid,0,IPC_RMID,0); } #include "sem_handle.h" int main(int argc, char const *argv[]) { pid_t cpid;//子进程的ID int semid;//信号量集的ID key_t key;//信号量集的键值 char *time;//当前时间 unsigned short value[3]={1,0,0};//信号量集的初始值 semid = sem_create(3,value); if(semid == -1) { return -1; } cpid = fork();//创建子进程 if(cpid == -1) { error_handle("fork"); } else if(cpid == 0) { //child process for(int i=1; i error_handle("sem_v2 fail"); } } exit(EXIT_SUCCESS); }else if(cpid > 0) { //parent process for(int i=1; i error_handle("sem_v1 fail"); } if(sem_p(semid, 2) == -1) { // 添加错误检查,等子进程结束,打印 > error_handle("sem_p2 fail"); } printf(">\n"); fflush(stdout);//刷新缓冲区,确保立即打印 if(sem_v(semid, 0) == -1) { // 添加错误检查,唤醒子进程打印 < error_handle("sem_v0 fail"); } } wait(NULL); sem_del(semid); printf("信号量集删除成功\n"); exit(EXIT_SUCCESS); } return 0; }

得分 100
学习任务

万物皆流2026 的学生作业:

** linklist.h ** #ifndef _LINKLIST_H_ #define _LINKLIST_H_ #include #include #include typedef int datatype_t; typedef struct node { datatype_t data; struct node* next; }linknode_t; extern linknode_t* create_data_linklist(linknode_t* head,datatype_t data); extern void insert_data_linklist(linknode_t* head,datatype_t data); extern void reverse_data_linklist(linknode_t* head); extern void clean_up_linklist(linknode_t* head); extern void print_data_linklist(linknode_t* head); #endif ** linklsit.c ** #include "linklist.h" //创建新空链表 linknode_t* create_data_linklist (linknode_t* head,datatype_t data) { linknode_t* head=NULL; head=(linknode_t*)malloc(sizeof(linknode_t)); if (NULL==head) { printf("链表申请失败!\n"); return NULL; } memset(head,0,sizeof(linknode_t)); head->next=NULL; return head; } //向空链表中插入数据 void insert_data_linklist (linknode_t* head,datatype_t data) { linknode_t* temp=NULL; linknode_t* p=head; temp=(linknode_t*)malloc(sizeof(linknode_t)); if (NULL==temp) { printf("节点申请失败!\n"); return; } temp->data=data; while(p->next!=NULL) { p=p->next; } temp->next=p->next; p->next=temp; return; } //将链表置为逆序 void reverse_data_linklist (linknode_t* head) { linknode_t* p=NULL; linknode_t* q=NULL; p=head->next-next; head->next-next=NULL; while (p!=NULL) { q=p->next; p->next=head->next; head->next=p; p=q; } return; } //清除链表 void clean_up_linklist (linknode_t* head) { linknode_t* p=head; linknode_t* q=NULL; while (p!=NULL) { q=p->next; free(p); p=q; } head->next=NULL; //包括头节点在内的节点都被清除了,重置头指针为NULL return; } //打印链表 void print_data_linklist (linknode_t* head) { linknode_t* p=head; while (p->next!=NULL) { printf("%d ",p->next->data); p=p->next; } printf("\n"); } ** main.c ** #include "linklist.h" int main() { linknode_t* head=NULL; datatype_t data; int i=0; int n=0; head=create_data_linklist (head,data); printf("请输入需要数据的个数:\n"); scanf("%d",&n); printf("请输入%d个数据\n",n); for (i=0;i

微信客服

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

帮助反馈 APP下载

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

公众号

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