?? client.c
字號:
/******************************************************************** Copyright 2004 by YAAN all rights reserved. Filename: client.c Author: Edgar Liu Date: 2004.8.12 Description: Others: Main Function Lists: 1. 2. History:********************************************************************/#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <netinet/in.h>#include <arpa/inet.h>#include <errno.h>#include "public.h"char g_szPath[MAX_PATH_LENTH];char szServerAddr[16];short int nPort = DEFAULT_PORT;/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void Usage(int argc,char** argv,int nCode){ switch (nCode) { case 1: break; case 2: fprintf(stderr,"IP Address Error!\n"); break; case 3: fprintf(stderr,"Please input IP Address!\n"); break; case 4: fprintf(stderr,"Port Error!\n"); break; } fprintf(stderr,"Usage: %s -s ServerAddress [-d Directory][-p Port]\n",argv[0]); exit(1);}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void parseCmdLine(int argc,char** argv){ int i,nErrCode = 0,on = 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 's': if((argv[i+1] == NULL) || (IsIPAddr(argv[i+1]))) { nErrCode = 2; Usage(argc,argv,nErrCode); } strcpy(szServerAddr,argv[i+1]); on = 1; break; case 'd': if(argv[i+1]) { 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 = 4; Usage(argc,argv,nErrCode); } nPort = atoi(argv[i+1]); break; default: break; } } } if(!on) { nErrCode = 3; Usage(argc,argv,nErrCode); }}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int initSocket(){ int sockfd; sockfd = socket(AF_INET,SOCK_DGRAM,0); if(sockfd < 0) { fprintf(stderr,"Socket Error:%s\n",strerror(errno)); exit(1); } return sockfd;}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void SendClientInfo(int sockfd,struct sockaddr_in* pAddr){ char szBuf[64]; int len,nBufLen; CLIENT_INFO clientInfo; /* 從鍵盤讀入,寫到服務端 */ memset(&clientInfo,0,sizeof(CLIENT_INFO)); printf("Please Input User Name: "); memset(szBuf,0,64); fgets(szBuf,64,stdin); nBufLen = strlen(szBuf); szBuf[nBufLen-1] = 0; strcpy(clientInfo.szClient,szBuf); printf("Please Input Password: "); memset(szBuf,0,64); fgets(szBuf,64,stdin); nBufLen = strlen(szBuf); szBuf[nBufLen-1] = 0; strcpy(clientInfo.szPasswd,szBuf); printf("Please Input Command: "); memset(szBuf,0,64); fgets(szBuf,32,stdin); nBufLen = strlen(szBuf); szBuf[nBufLen-1] = 0; strcpy(clientInfo.szCommand,szBuf); printf("user:%s passwd:%s Cmd:%s\n", clientInfo.szClient, clientInfo.szPasswd, clientInfo.szCommand); len = sizeof(struct sockaddr_in); strcpy(clientInfo.szLogo,"YAAN"); clientInfo.uSequence = 1; sendto(sockfd,(char*)&clientInfo,sizeof(CLIENT_INFO),0,(struct sockaddr*)pAddr,len); }/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int saveData(struct ServerData* pSD,int nSize){ FILE* fp; char szMkdir[MAX_PATH_LENTH],szBuf[MAX_PATH_LENTH]; char* pPos,*pPos1; mode_t mode = 0644; static unsigned long int g_uSequence = 0; // if(pSD->uSequence < g_uSequence)// {// return 1;// } g_uSequence = pSD->Header.uSequence; memset(szMkdir,0,MAX_PATH_LENTH); strcpy(szMkdir,g_szPath); pPos = pSD->Header.szFileName; while((pPos1 = strchr(pPos,'/')) != NULL) { memset(szBuf,0,MAX_PATH_LENTH); strncpy(szBuf,pPos,pPos1-pPos+1); strcat(szMkdir,szBuf); pPos = pPos1+1; mkdir(szMkdir,mode); } strcat(szMkdir,pPos); printf("%ld\tFileCount:%d\t FileName %s FileSize:%d\n", pSD->Header.uSequence, pSD->Header.uFileCount, szMkdir, pSD->Header.uFileSize); fp = fopen(szMkdir,"a"); if(fp == NULL) { fprintf(stderr,"open %s error:%s\n",pSD->Header.szFileName,strerror(errno)); fclose(fp); return 1; } fwrite(pSD->szData,1,pSD->Header.uFileSize,fp); fclose(fp); return 0;}/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/void DownloadData(int sockfd,struct sockaddr_in* pAddr,char* pDir){ struct ServerData sd; int nSize; fprintf(stderr,"Download Data to Directory:%s\n",pDir); SendClientInfo(sockfd,pAddr); fprintf(stderr,"Begin to Download Data......\n"); while(1) { /* 從網絡上讀, */ memset(&sd,0,sizeof(struct ServerData)); nSize = recvfrom(sockfd,(char*)&sd,sizeof(struct ServerData),0,NULL,NULL); saveData(&sd,nSize); } }/******************************************************************** Function: Description: Arguments: Return: Others:********************************************************************/int main(int argc,char**argv){ // int sockfd; struct sockaddr_in servAddr; //init block; memset(g_szPath,0,MAX_PATH_LENTH); strcpy(g_szPath,"./"); //parse Command Line; parseCmdLine(argc,argv); //main block; sockfd = initSocket(); bzero(&servAddr,sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_port = htons(nPort); inet_aton(szServerAddr,&servAddr.sin_addr); DownloadData(sockfd,&servAddr,g_szPath); close(sockfd);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -