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

📄 peer.c

📁 一个简单的p2p共享文件的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{	int pong_sockfd;
	struct sockaddr_in pong_addr, recv_addr;	int recv_addr_len;
		struct Message snd;//the package rcv & snd	struct Message rcv;	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	unsigned char buf2[BUFMAX];//rcv buffer	

	//create socket
	if ((pong_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
       		perror("create socket error!");
	}
	//set my listen port !
    	bzero((char *) &pong_addr, sizeof(pong_addr));
	pong_addr.sin_family = AF_INET;
	pong_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	pong_addr.sin_port = htons(atoi(port));  //7000 is very important!
	//bind
	if (bind(pong_sockfd, (struct sockaddr *)&pong_addr, sizeof(pong_addr)) < 0) {
        	perror("bind service socket error!");
	}
	//listen ping
	for(;;) {
		printf("In pong service...\n");
        	bzero((char *) &recv_addr, sizeof(recv_addr));//get the sender's ip		memset(buf2,'\0', BUFMAX);		memset(&rcv,'\0',BUFMAX);
		recvfrom(pong_sockfd, buf2, BUFMAX, 0, (struct sockaddr *) &recv_addr, &recv_addr_len);
		rcv=*(struct Message *)buf2;		if(rcv.head==PING && strcmp(inet_ntoa(recv_addr.sin_addr),"0.0.0.0")!=0){
			printf("got, recv_ip : %s, recv_port : %d\n", inet_ntoa(recv_addr.sin_addr), ntohs(recv_addr.sin_port));
           		//send pong!			snd.head=PRES;			strcpy(snd.content,"\n");			buf=(unsigned char *)&snd;
            		if (sendto(pong_sockfd, buf, BUFMAX, 0, (struct sockaddr *) &recv_addr, sizeof(recv_addr)) < 0) {
    				perror("sendto error\n");
    			}//end send		}//end if		//if quit then close sock	//	printf("fuc\n");		//printf("now is %d\n",isQuit);

	}//end for	//printf("close pong service\n");	//close(pong_sockfd);	return;};int doPING(struct Message msg){	char *peerip;	char *peerport;		//get ip port	strtok(msg.content,"#");	strtok(NULL,"#");	peerip=strtok(NULL,"#");	peerport=strtok(NULL,"\n");	struct sockaddr_in send_addr, bcast_addr;
    	int ping_sockfd;
    	int recv_addr_len;
    	struct sockaddr_in recv_addr;
    		struct Message snd;//the package rcv & snd	struct Message rcv;	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	unsigned char buf2[BUFMAX];//rcv buffer
    	//create sock
    	if ((ping_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        	perror("create socket error");
    	}
	//set source addr
	bzero((char *) &send_addr, sizeof(send_addr));
	send_addr.sin_family = AF_INET;
	send_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	send_addr.sin_port = htons(0); //
	//bind
	if (bind(ping_sockfd, (struct sockaddr *) &send_addr, sizeof(send_addr)) < 0) {
		perror("bind socket error");
	}
	//set destinate addr
    	bzero((char *) &recv_addr, sizeof(recv_addr));
    	recv_addr.sin_family = AF_INET;
    	recv_addr.sin_addr.s_addr = inet_addr(peerip);
    	recv_addr.sin_port = htons(atoi(peerport));//change to int	//build send buffer	snd.head=PING;	strcpy(snd.content,"\n");	buf=(unsigned char *)&snd;
 	//send
    	if (sendto(ping_sockfd, buf, BUFMAX, 0, (struct sockaddr *) &recv_addr, sizeof(recv_addr)) < 0) {
        	perror("sendto error");
    	}	//recv	signal(SIGALRM, alarm_handler);	alarm(5); // after 5s ,alert 	for (;;) {
       		if (setjmp(env_alrm) != 0) {
            		break;
        	}
       		bzero((char *) &recv_addr, sizeof(recv_addr));
        	recvfrom(ping_sockfd, buf2, BUFMAX, 0, (struct sockaddr *) &recv_addr, &recv_addr_len);
        	rcv=*(struct Message *)buf2;
        	if(rcv.head==PRES){			printf("got ping!\n");			close(ping_sockfd);			return 1;		}
    	}	printf("time out:%s\n",msg.content);	close(ping_sockfd);	return 0;};void doQUIT(int sockfd){	struct Message snd;//the package rcv & snd	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!		snd.head=QUIT;	strcpy(snd.content,"\n");	buf=(unsigned char *)&snd;
        printf("send %d bytes\n",write(sockfd, buf, BUFMAX));};void doSRCH(int sockfd){	struct Message snd;//the package rcv & snd	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!		char filename[20];		snd.head=SRCH;	printf("search file:");	gets(filename);	strcpy(snd.content,filename);	strcat(snd.content,"\n");	printf("look content:%s",snd.content);//test	buf=(unsigned char *)&snd;
        printf("send %d bytes\n",write(sockfd, buf, BUFMAX));	};void doSRES(struct Message msg){	char *temp;	temp=strtok(msg.content,"#");	printf("ENTER doSRES:%s\n");	printf("file:%s",temp);	temp=strtok(NULL,"#");	printf(" user:%s",temp);	temp=strtok(NULL,"#");	printf(" ip:%s",temp);	temp=strtok(NULL,"#");	printf(" port:%s\n",temp);		};void doSHRE(int sockfd){	struct Message snd;//the package rcv & snd	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!		char filename[20];//	char port[10]="7001";	FILE *file;	if((file=fopen(nowusername,"a+"))==NULL)
		printf("can not open file\n");		snd.head=SHRE;	//printf("your port number:");	//gets(port);	strcpy(snd.content,port);	printf("your filename:");	gets(filename);	while(filename[0]!='\0'){		printf("your filename:");		strcat(snd.content,"#");		strcat(snd.content,filename);			//share list add		fwrite(filename,1,strlen(filename),file);//copy to file		fwrite("\n",1,strlen("\n"),file);		gets(filename);		}	fclose(file);//close file!	strcat(snd.content,"\n");	printf("content:%s",snd.content);//test	buf=(unsigned char *)&snd;
        printf("send %d bytes\n",write(sockfd, buf, BUFMAX));	};
void doLGIN(int sockfd){	struct Message snd;//the package rcv & snd	unsigned char *buf; //snd buffer	buf=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	char password[20];	char usrpwd[50];	char *splits="#";//temp	int i;	int seed;	char *charseed;	charseed=(char *)malloc(1);	//ini the encrypt seed	srand((unsigned)time(NULL));	seed=rand()%9+1;	charseed[0]=seed+'0';		//log in! 	memset(&snd,'\0', BUFMAX);	memset(buf,'\0', BUFMAX);	snd.head=LGIN;	//get the username+password;	printf("Login:");	gets(nowusername);	printf("Password:");	gets(password);	//scrype the password	strcpy(snd.content,nowusername);	strcat(snd.content,splits);	strcat(snd.content,charseed);	for(i=0;i<strlen(password);i++)
		password[i]-=seed;	strcat(snd.content,password);	printf("content:%s\n",snd.content);//test	buf=(unsigned char *)&snd;
        printf("send %d bytes\n",write(sockfd, buf, BUFMAX));};
int main()
{	/////////do ipc//////////////////////	//////////////////////////////////////
    	int sockfd;
	struct sockaddr_in target_addr;	unsigned char buf2[BUFMAX];	pid_t pid;//for one ping	pid_t pid2;//for ping pong listen service!	pid_t pid3;//for file service!

	struct Message msg;//the package rcv & snd	int flag=0;//log on success flag;	char input[100];  //choice of menu!	char choice[10];// weather to download file!
 
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < -1) {
		perror("create socket error");
	}
	//set the server addr
	bzero(&target_addr, sizeof(target_addr));
	target_addr.sin_family = AF_INET;
	target_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	target_addr.sin_port = htons(8092);
	
	printf("Welcome, hello!\n");

	if (connect(sockfd, (struct sockaddr *)&target_addr, sizeof(target_addr)) < -1) {
		perror("connect error");
	}	doLGIN(sockfd);
	// read
   	for (;;) {		memset(&msg,'\0', sizeof(&msg));		memset(buf2,'\0', sizeof(buf2));		printf("read %d bytes\n",read(sockfd, buf2, BUFMAX));		msg=*(struct Message *)buf2;		if(msg.head==ERROR){			printf("%d,%s\n",msg.head,msg.content);			break;		}else if(msg.head==LRES){			printf("%d,%s\n",msg.head,msg.content);				flag=1;			break;		}
   	}	//if lgin sucuss	if(flag){	    //build up ping pong service!	     printf("input your listen port number:");	     gets(port);	    /////////fork///////////////	    pid2=fork();	    if(pid2>0){}	    else if(pid2==0){		//isQuit=0;	    	doPRES();	    }else {perror("fork error");}	    ///////end fork/////////////////////	    /////////fork///to file////////////	    pid3=fork();	    if(pid3>0){}	    else if(pid3==0){	    	doFILE();	    }else {perror("fork error");}	    ///////end fork/////////////////////	    while(1){		printf("Log in sucuss,please input your order(1=share,2=search,3=quit):");		gets(input);		if(input[0]=='1') //share			doSHRE(sockfd);		else if(input[0]=='2')//search			doSRCH(sockfd);		else if(input[0]=='3'){//quit			doQUIT(sockfd);			//isQuit=1;			kill(pid2,9);			kill(pid3,9);			break;		}//end if		//read respose		while(1){			memset(&msg,'\0', sizeof(&msg));			memset(buf2,'\0', sizeof(buf2));			printf("read %d bytes\n",read(sockfd, buf2, BUFMAX));			msg=*(struct Message *)buf2;			if(msg.head==ERROR){				printf("%d,%s\n",msg.head,msg.content);				break;			}else if(msg.head==SHOK){				printf("%d,%s\n",msg.head,"Share file sucuss");					break;			}else if(msg.head==SRES){			//	printf("%d,%s\n",msg.head,msg.content);					if(strncmp("\n",msg.content,strlen("\n"))==0)					break;				doSRES(msg);				//ping				if(doPING(msg)==1){					printf("ping yes:%s\n",msg.content);					//download					printf("do you want to download ?(y/n):");					gets(choice);					if(choice[0]=='y')							doGETF(msg);				}			}		//	if(msg.head!=0)		//		printf("head is %d",msg.head);		}//end while read	    }//end while get order			}//end if flag
	close(sockfd);
    return 0;
}

⌨️ 快捷键说明

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