⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receiver部分说明.cpp

📁 多线程文件的传输实现 需要在linux shell 下操作
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

//**********   五个socket连接为多线程准备 ***********//
int mySocket[5];

//*********  Linux 下的IP地址和端口描述,是一个数据结构 ***********//
struct sockaddr_in adr_s;

//********* 线程号 **********//
pthread_t thread_id[5];

//*********  用语错误处理 **********//
void EOP(const char* errorCode) { printf("Receiver error: %s;\n",errorCode); exit(1); }

//********* 连接并合并各个tmpX的临时文件 ********//
void Combine(char *fileName) {
	FILE *out = fopen(fileName,"w+"),*in;
	char infn[5];
	char buf[513]; int byte;
	strcpy(infn,"tmp ");
	for(int i=0;i<5;i++) {
		infn[3]=(char)(i+'0');
		in = fopen(infn,"r");
		if (in==NULL) EOP("Combine failed.");
		while( (byte=fread(buf,1,512,in))!=0 ) {
			if (byte==-1) EOP("Combine failed in read *in.");
			fwrite(buf,1,byte,out);
		}
		fclose(in);		
	}
	fclose(out);
}


//********* 此函数有多线程抛出,负责接受和保存临时文件 *********//
void ReceiveAndSave(int id) {
	long fileLens; int segment,temp,len;

	//********* 获得该段流的长度 **********//
	temp = read(mySocket[id],&fileLens,sizeof(long));
	if (temp<0) EOP("ReceiveAndSave() failed.");

	//********* 接受该段字节流对应的段号 **********//
	temp = read(mySocket[id],&segment,sizeof(int));
	if (temp<0) EOP("ReceiveAndSave() failed.");

	char *buf = (char*)malloc(sizeof(char)*fileLens+1),*buf_p;
	buf_p = buf;
	len = fileLens;

	while( (temp=read(mySocket[id],buf_p,len))!=0 ) {
		if (temp == -1) EOP ("One socket read failed");
		len -= temp;
		buf_p += temp;
	}

	close(mySocket[id]);

	printf("Thread %d connect & received ok. --len:%ld--seg:%d-- now saving..\n",id,fileLens,segment);	

	buf[sizeof(char)*fileLens] = 0;	

	//********** 保存临时文件 **********//
	char tmpName[5];
	strcpy(tmpName,"tmp ");
	tmpName[3] = (char)(segment+'0');  tmpName[4] = 0;
	FILE *file = fopen(tmpName,"w+");
	if (file==NULL) EOP("in R&S file error.");
	fwrite(buf,1,fileLens,file);

	fclose(file);
	free (buf);
	printf("Thread %d saving complete.\n",id);	
}

//********** 连接并获得Socket **********//
void Connect(char *IPaddress,int port) {	
	int tmp;
	
	//******** 初试化对方IP地址 *********//
	memset(&adr_s,0,sizeof adr_s);
	adr_s.sin_family=AF_INET;
	adr_s.sin_port=htons(port);
	adr_s.sin_addr.s_addr=inet_addr(IPaddress);
	if (adr_s.sin_addr.s_addr==INADDR_NONE) EOP("wrong address..");
	
	int len,t_s,id[5];
	len = sizeof adr_s;

	for (int i=0;i<5;i++) {
	  mySocket[i]=socket(PF_INET,SOCK_STREAM,0); 
	  if(mySocket[i]<0) EOP("socket create failed..");	
	  
	  tmp=connect(mySocket[i],(struct sockaddr*)&adr_s,len);
	   if(tmp<0) EOP("connect failed");
	  id[i] = i;
		
	  //******** 为每个接受到的Socket抛出对应的线程********//
  	  t_s=pthread_create(&thread_id[i],NULL,(void*(*)(void*))ReceiveAndSave,(void*)id[i]);
	  if (t_s!=0) EOP("thread creating failed.");
	}
}

int main(void) {
	char fileName[128],IP[20];

	printf("Please input the Sender's IP address: ");
	scanf("%s",IP);
	printf("Then Input the filename want to save: ");
	scanf("%s",fileName);
	
	Connect(IP,8083);

	//******** 同步所抛出的5个线程 *********//
	for(int i=0;i<5;i++) pthread_join(thread_id[i],NULL);
	printf("Client Receive OK,now Combine them..\n");
	
	Combine(fileName);

	printf("+-- Combining complete --+\n");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -