📄 peer.c
字号:
{ 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 + -