?? server.c
字號:
/******************************************************************** Copyright 2004 by YAAN all rights reserved. Filename: server.c Author: Edgar Liu Date: 2004.8.12 Description: Others: Main Function Lists: 1. History:********************************************************************/#include <stdio.h>#include <unistd.h>#include <errno.h>#include <dirent.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <netinet/in.h>#include <arpa/inet.h>#include "public.h"int g_nSwitch = 1;char g_szPath[MAX_PATH_LENTH];short int g_nPort = DEFAULT_PORT;unsigned long int g_nSequence = 1;unsigned long int g_nFileCount = 1;unsigned long int g_nTotalBytes = 0;/******************************************************************** Function: void Usage(int argc,char** argv,int nCode) Description: Show Usage of Software; Arguments: int argc ----The Number of CommandLine Paramiter char** argv -- Return: NULL Others:********************************************************************/void Usage(int argc,char** argv,int nCode){ switch (nCode) { case 1: break; case 2: fprintf(stderr,"Please Input your Directory!\n"); break; case 3: fprintf(stderr,"Port Error!\n"); break; } fprintf(stderr,"Usage:%s [-d Directory][-p Port]\n",argv[0]); exit(1);}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void parseCmdLine(int argc,char** argv){ int i,nErrCode = 0; if(argc == 1) { nErrCode = 1; Usage(argc,argv,nErrCode); } for(i=0;i<argc;i++) { if(argv[i][0] == '-') { switch (argv[i][1]) { case 'd': if(argv[i+1] == NULL) { nErrCode = 2; Usage(argc,argv,nErrCode); } memset(g_szPath,0,MAX_PATH_LENTH); strcpy(g_szPath,argv[i+1]); int nLen = strlen(g_szPath); if(g_szPath[nLen-1] != '/') g_szPath[nLen] = '/'; break; case 'p': if(argv[i+1] == NULL || IsNumber(argv[i+1])) { nErrCode = 3; Usage(argc,argv,nErrCode); } g_nPort = atoi(argv[i+1]); break; default: break; } } }}/******************************************************************* Function: Description: Arguments: Return: Other:*******************************************************************/void verifyUser(char* pClient,char* pPasswd){}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void parseCommand(char* pCommand){ if(!strcmp(pCommand,"q") || !strcmp(pCommand,"Q") || !strcmp(pCommand,"quit")) g_nSwitch = 0;}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void parseClientMsg(PCLIENT_INFO pCI){ printf("Logo : %s ",pCI->szLogo); printf("User: %s Passwd: %s Command:%s\n\n",pCI->szClient,pCI->szPasswd,pCI->szCommand); verifyUser(pCI->szClient,pCI->szPasswd); parseCommand(pCI->szCommand);}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int parsePath(char* pPath){ char szTemp[MAX_PATH_LENTH]; char* pPos; int nLen,nLen1; memset(szTemp,0,MAX_PATH_LENTH); strcpy(szTemp,pPath); nLen = strlen(szTemp); szTemp[nLen-1] = 0; pPos = strrchr(szTemp,'/'); nLen1 = strlen(pPos); return nLen-1-nLen1; }/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void sendData(int sockfd,struct sockaddr_in* addr,socklen_t len,char* pPath,int nLen){ FILE* fp; struct ServerData sd; struct stat fs; int nSize; memset(&sd,0,sizeof(struct ServerData)); if(stat(pPath,&fs) != 0) { perror("stat"); } fp = fopen(pPath,"r"); if(fp == NULL) { fprintf(stderr,"%s no exist!\n",pPath); fclose(fp); } strcpy(sd.Header.szLogo,"YAAN"); sd.Header.uFileCount = g_nFileCount++; strcpy(sd.Header.szFileName,pPath+nLen+1); sd.Header.uFileSize = fs.st_size; sd.Header.nMode = fs.st_mode; g_nTotalBytes += fs.st_size; if(fs.st_size < MAX_DATA_SIZE) { fread(sd.szData,1,fs.st_size,fp); sd.Header.uSequence = g_nSequence++; sendto(sockfd, (char*)&sd, SERVER_HEADER_SIZE+sd.Header.uFileSize+1, 0, (struct sockaddr*)addr,len); printf("%ld\tSend %s successfully\n",g_nSequence-1,pPath); } else { while((nSize = fread(sd.szData,1,MAX_DATA_SIZE,fp)) > 0) { sd.Header.uSequence = g_nSequence++; sd.Header.uFileSize = nSize; sendto(sockfd, (char*)&sd, SERVER_HEADER_SIZE+nSize, 0, (struct sockaddr*)addr,len); memset(sd.szData,0,MAX_DATA_SIZE); usleep(20); } printf("%ld\t Send %s successfully\n",g_nSequence-1,pPath); } fclose(fp); }/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void browseDir(int sockfd,struct sockaddr_in* addr,socklen_t len,char* pDir,int nLen){ DIR* dp; struct dirent* dirp; char szPath[MAX_PATH_LENTH]; struct stat buf; if((dp = opendir(pDir)) == NULL) perror("opendir"); while((dirp = readdir(dp)) != NULL) { memset(szPath,0,MAX_PATH_LENTH); strcpy(szPath,pDir); strcat(szPath,dirp->d_name); if(stat(szPath,&buf) != 0) perror("stat"); if(S_ISDIR(buf.st_mode)) //is Directory { if(!strcmp(dirp->d_name,".")||!strcmp(dirp->d_name,"..")) continue; strcat(szPath,"/"); browseDir(sockfd,addr,len,szPath,nLen); } else if(S_ISREG(buf.st_mode)) //is General File { sendData(sockfd,addr,len,szPath,nLen); } } closedir(dp);}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int initSocket(){ int sockfd; struct sockaddr_in servAddr; sockfd = socket(AF_INET,SOCK_DGRAM,0); if(sockfd < 0) { fprintf(stderr,"Socket Error:%s\n",strerror(errno)); exit(1); }// int on = 1;// ioctl(sockfd,FIONBIO,&on); bzero(&servAddr,sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(g_nPort); if(bind(sockfd,(struct sockaddr*)&servAddr,sizeof(servAddr)) < 0) { fprintf(stderr,"Bind Error: %s\n",strerror(errno)); exit(1); } return sockfd;}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void broadcastData(int sockfd,char* pDir){ int n,nLen; CLIENT_INFO clientInfo; struct sockaddr_in addr; socklen_t socklen; while(g_nSwitch) { memset(&clientInfo,0,sizeof(CLIENT_INFO)); n = recvfrom(sockfd,(char*)&clientInfo,sizeof(CLIENT_INFO),0,(struct sockaddr*)&addr,&socklen); printf("From %s received data:\n",inet_ntoa(addr.sin_addr)); parseClientMsg(&clientInfo); printf("Begin send data to %s ......\n",inet_ntoa(addr.sin_addr)); nLen = parsePath(pDir); browseDir(sockfd,&addr,socklen,pDir,nLen); printf("統計: 共發送 %ld個文件, %ld個數據包, %ldK字節數據\n", g_nFileCount-1,g_nSequence-1,g_nTotalBytes/1024); if(g_nSwitch == 0) fprintf(stderr,"Server Quit!!\n"); }}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int main(int argc,char** argv){ // int sockfd; //init block; memset(g_szPath,0,MAX_PATH_LENTH); strcpy(g_szPath,"/home/edgar/"); //parse Command Line parseCmdLine(argc,argv); printf("Path:%s============\n",g_szPath); //main block; sockfd = initSocket(); broadcastData(sockfd,g_szPath); close(sockfd);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -