/* udpserver.c 0118 */ #include #include #include #include #include #include #include #include #include //file size¸¦ ¾Ë¾Æ³»±â À§ÇÑ.. #include //Æú´õÀÇ file name¸¦ °¡Áö°í ¿À±â À§ÇÑ Çì´õ ÆÄÀÏ #define BUFSIZE 1024 void error_handling(char *message); int main(int argc, char **argv) { int serv_sock; char message[BUFSIZE]; int str_len , len; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; /*---- Æú´õ ³»¿ë °¡Á®¿À±â ---- */ DIR *pdir = opendir("."); //Æú´õÀÇ ÆÄÀÏ À̸§À» °¡Áö°í ¿À±âÀ§ÇÑ.. struct dirent *pent; struct stat st ; int serv_sd; int clnt_sd; char mes[BUFSIZE]; char file_name[BUFSIZE]; char buf[BUFSIZE]; int fd ; char size[BUFSIZE]; str_len = sizeof(&clnt_addr); int file_len; FILE *fp; int count = 0; if(argc!=2){ printf("Usage : %s \n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_DGRAM, 0); if(serv_sock == -1) error_handling("UDP ¼ÒÄÏ »ý¼º ¿À·ù"); /* ÀüÇüÀûÀÎ ÁÖ¼ÒŬ¸°°ú ¹ÙÀ̵ù */ memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1) error_handling("bind() error"); system ("clear"); /* ¼­¹ö ¿¬°á Å×½ºÆ® */ clnt_addr_size = sizeof(clnt_addr); str_len = recvfrom( serv_sock , message , BUFSIZE , 0 , (struct sockaddr*)&clnt_addr , &clnt_addr_size); sendto (serv_sock , message , str_len , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); /* ¼­¹ö ¿¬°á Å×½ºÆ® ¿Ï·á */ /* µð·ºÅ丮 Ãâ·Â°ú ¼­¹ö -----> Ŭ¶óÀ̾ðÆ® µð·ºÅ丮 ¸ñ·Ï º¸³»±â */ while ((pent=readdir(pdir)) != '\0'){ //client¿¡ º¸³»ÁÜ stat(pent->d_name, &st); if (S_ISDIR(st.st_mode)) { printf("%s\n", pent->d_name); pent->d_name[strlen(pent->d_name)+1]='\0'; pent->d_name[strlen(pent->d_name)]='/'; } sendto(serv_sock, pent->d_name, BUFSIZE , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); } sendto(serv_sock, "end", BUFSIZE , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); //client¿¡ ÆÄÀϸí Àü¼ÛÀÌ ³¡³µ´Ù´Â ¸Þ½ÃÁö closedir(pdir); /* ¿äû ÇÒ ÆÄÀÏÀ» Ŭ¶ó¾ðÆ® --> ¼­¹ö·Î Àü¼Û */ while (1){ while (1) { // str_len = sizeof(&clnt_addr); str_len=recvfrom(serv_sock, file_name, sizeof(file_name)-1 , 0 , (struct sockaddr*)&clnt_addr , &str_len); printf("1.%s\n",file_name); //test //client¿¡¼­ ÆÄÀÏ À̸§ ÀԷ¹ÞÀ½ // file_name[str_len]='\0'; fp=fopen(file_name,"rb"); //¹ÞÀº ÆÄÀÏ À̸§À» ¿­¾î¼­ printf("2.%s\n",file_name); //test //printf("%d" , fp); if(fp== NULL) { //ÆÄÀÏÀÌ ÀÖÀ¸¸é ÀÖÀ½ ¸Þ½ÃÁö¸¦ ¾øÀ¸¸é ¾ø´Ù´Â ¸Þ½ÃÁö º¸³¿ strcpy(mes,"NO"); sendto(serv_sock, mes, strlen(mes) , 0 , (struct sockaddr*)&clnt_addr, sizeof(clnt_addr)); error_handling("File open error"); } else { strcpy(mes, "Yes"); sendto(serv_sock, mes, strlen(mes) , 0 , (struct sockaddr*)&clnt_addr, sizeof(clnt_addr)); break; } } sleep(1); //´ë±â½Ã°£ //ÆÄÀÏ ³»¿ëÀ» client¿¡ º¸³»ÁÜ while(!feof(fp)) { file_len = fread( buf , sizeof(char) , BUFSIZE , fp ); sendto(serv_sock , buf , file_len , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); } /* ±× open()È£Ãâ½Ã ÆÄÀÏÀбâ while((file_len=read(fd, buf, BUFSIZE ) > 0)) { printf(" %d",count++); //Å×½ºÆ® ¸ñÀû sendto(serv_sock, buf, file_len , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); }*/ stat(file_name, &st); printf("%ld\n", st.st_size); sprintf(size, "%ld", st.st_size); sendto(serv_sock, size, strlen(size) , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); printf("%s\n", size); } /* Thank you */ //str_len = sizeof(&clnt_addr); str_len=recvfrom(serv_sock, buf, BUFSIZE , 0 , (struct sockaddr*)&clnt_addr , &str_len); sendto(1, buf, str_len , 0 , (struct sockaddr*)&clnt_addr , sizeof(clnt_addr)); fclose(fp); close(serv_sock); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }