国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linux C 多進程下載文件demo

2019-11-08 03:06:29
字體:
來源:轉載
供稿:網友

1、使用多進程,實現多個客戶端同時下載文件

目錄: 目錄

目錄1

頭文件

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/uio.h>#include <sys/socket.h>#include <string.h>#include <sys/epoll.h>#include <netinet/in.h>#include <arpa/inet.h>#define FILENAME "file"typedef struct childdata{ pid_t pid; int fdw; short busy;//標示子進程是否忙碌}cdata,*pcdata;typedef struct tdata{ int len; char buf[1000];}td,*ptd;void make_child(pcdata,int);void set_init(int,char*,char*);void send_file(int);

main

#include "func.h"int main(int argc,char* argv[]){ if(argc!=4) { make_child。c#include "func.h"http://實現子進程處理事件描述符void handle_request(int fdr){ int new_fd; short flag=1; while(1) { // 子進程之間接收消息 recv_fd(fdr,&new_fd); printf("new_fd=%d/n",new_fd); // 處理發送數據 send_file(new_fd); // 改變子進程的狀態 write(fdr,&flag,sizeof(flag)); } }// 創建子進程數void make_child(pcdata p,int count){ int fds[2]; int i; pid_t pid; for(i=0;i<count;i++) { // 全雙工tcp通信 socketpair(AF_LOCAL,SOCK_STREAM,0,fds); pid=fork(); if(0==pid) { // 關閉寫端 close(fds[1]); //子進程處理函數 handle_request(fds[0]); } // 父進程傳遞每個進程的狀態 p[i].pid=pid; // 父進程寫端打開 p[i].fdw=fds[1]; p[i].busy=0; // 關閉讀端 close(fds[0]); } }

pool_n.c

#include "func.h"void send_n(int fd,char *buf,int len){ int total=0; int pos; while(total<len) { pos=send(fd,buf+total,len-total,0); total=total+pos; }}void recv_n(int fd,char *buf,int len){ int total=0; int pos; while(total<len) { pos=recv(fd,buf+total,len-total,0); total=total+pos; }}

send_fd.c

#include "func.h"http:// 發送描述符void send_fd(int fdw,int fd){ // 進程同時可以進行讀和寫,通信消息機制 struct msghdr msg; // 接收消息 memset(&msg,0,sizeof(msg)); char buf[10]="hello"; char buf1[10]=" world"; struct iovec iov[2]; iov[0].iov_base=buf; iov[0].iov_len=5; iov[1].iov_base=buf1; iov[1].iov_len=6; msg.msg_iov=iov; msg.msg_iovlen=2; // 處理消息 struct cmsghdr *cmsg; int len=CMSG_LEN(sizeof(int)); cmsg=(struct cmsghdr *)calloc(1,len); cmsg->cmsg_len=len; cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; // 數據處理 *(int*)CMSG_DATA(cmsg)=fd; msg.msg_control=cmsg; msg.msg_controllen=len; int ret; // 發送數據 ret=sendmsg(fdw,&msg,0); if(-1==ret) { perror("sendmsg"); return; }} void recv_fd(int fdr,int* fd){ struct msghdr msg; memset(&msg,0,sizeof(msg)); char buf[10]="hello"; char buf1[10]=" world"; struct iovec iov[2]; iov[0].iov_base=buf; iov[0].iov_len=5; iov[1].iov_base=buf1; iov[1].iov_len=6; msg.msg_iov=iov; msg.msg_iovlen=2; struct cmsghdr *cmsg; int len=CMSG_LEN(sizeof(int)); cmsg=(struct cmsghdr *)calloc(1,len); cmsg->cmsg_len=len; cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; msg.msg_control=cmsg; msg.msg_controllen=len; int ret; ret=recvmsg(fdr,&msg,0); if(-1==ret) { perror("sendmsg"); return; } *fd=*(int*)CMSG_DATA(cmsg);}

send_file.c

#include "func.h"void send_file(int new_fd){ td t; memset(&t,0,sizeof(t)); t.len=strlen(FILENAME); strcpy(t.buf,FILENAME); send_n(new_fd,&t,4+t.len); int fd; fd=open(FILENAME,O_RDONLY); if(-1==fd) { perror("open"); return; } while(memset(&t,0,sizeof(t)),(t.len=read(fd,t.buf,sizeof(t.buf)))>0) { send_n(new_fd,&t,4+t.len); } t.len=0; send_n(new_fd,&t.len,4);//發送結束符給客戶端 close(new_fd);}

send_init.c

#include "func.h"http:// 初始化網絡
ip和端口綁定進程void set_init(int sfd,char* ip,char* port){ struct sockaddr_in ser; memset(&ser,0,sizeof(ser)); ser.sin_family=AF_INET; ser.sin_port=htons(atoi(port));//port轉網絡字節序 ser.sin_addr.s_addr=inet_addr(ip);//IP地址轉網絡字節序 int ret; ret=bind(sfd,(struct sockaddr*)&ser,sizeof(ser)); if(-1==ret) { perror("bind"); return; }}

client

pool_n.c

#include "func.h"void send_n(int fd,char *buf,int len){ int total=0; int pos; while(total<len) { pos=send(fd,buf+total,len-total,0); total=total+pos; }}void recv_n(int fd,char *buf,int len){ int total=0; int pos; while(total<len) { pos=recv(fd,buf+total,len-total,0); total=total+pos; }}

pro_pool_client.c

#include "func.h"int main(int argc,char* argv[]){ if(argc!=3) { printf("error args/n"); return -1; } int sfd; sfd=socket(AF_INET,SOCK_STREAM,0); if(-1==sfd) { perror("socket"); return -1; } struct sockaddr_in ser; memset(&ser,0,sizeof(ser)); ser.sin_family=AF_INET; ser.sin_port=htons(atoi(argv[2])); ser.sin_addr.s_addr=inet_addr(argv[1]); int ret; // connect ret=connect(sfd,(struct sockaddr*)&ser,sizeof(ser)); if(-1==ret) { perror("connect"); return -1; } char buf[1000]={0}; int len; // client recv 文件描述符 recv_n(sfd,(char*)&len,4); printf("len=%d/n",len); // 接收數據 recv_n(sfd,buf,len); int fd; //本地創建文件 fd=open(buf,O_RDWR|O_CREAT,0666); if(-1==fd) { perror("open"); return -1; } while(1) { recv_n(sfd,(char*)&len,4); memset(buf,0,sizeof(buf)); if(len >0) // 接收數據,并將buf寫入 { recv_n(sfd,buf,len); write(fd,buf,len); }else{ break; } } close(fd); close(sfd);}

服務器端: 這里寫圖片描述 客服端: 這里寫圖片描述

進程數 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长顺县| 遵义县| 乌兰县| 元江| 米脂县| 香港| 建宁县| 韩城市| 安宁市| 大埔区| 新郑市| 岑溪市| 江都市| 通渭县| 前郭尔| 科尔| 城市| 保靖县| 利辛县| 兴安盟| 金乡县| 万全县| 信阳市| 萨嘎县| 宣威市| 双鸭山市| 西藏| 邹城市| 嘉善县| 红安县| 台州市| 习水县| 中江县| 开平市| 寿光市| 增城市| 罗江县| 汝阳县| 湟中县| 台中县| 沙雅县|