1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include //inet_ntoa
12 #include
13
14 #define SERVER_PORT 12138
15 #define LISTEN_QUEUE 20
16 #define BACKLOG 200
17 #define BUFFER_SIZE 1024
18
19 //传输控制信号宏定义20 //struct Control中control的取值
21 #define USER_CHECK_LOGIN 1
22 #define FILE_PUSH 2
23 #define FILE_PULL 3
24 #define FILE_LIST 4
25 #define FILE_SENDTO 5
26 #define FILE_DELECT 6
27
28 structUser29 {30 intuid;31 char username[64];32 char password[64];33 };34
35 structControl36 {37 intuid;38 intcontrol;39 };40
41 void print_time(char *ch);//打印时间
42 int MAX(int a,intb);43 int mysql_check_login(structUser user);44
45
46 int main(int argc,char *argv[])47 {48 structsockaddr_in server_addr;49 structsockaddr_in client_addr;50 structUser user;51 structControl control;52 char ch[64];53 intclientfd;54 pid_t pid;55 socklen_t length;56 bzero(&server_addr,sizeof(server_addr));57 server_addr.sin_family=AF_INET;58 server_addr.sin_addr.s_addr=htons(INADDR_ANY);59 server_addr.sin_port=htons(SERVER_PORT);60
61 //创建套接字
62 int sockfd=socket(AF_INET,SOCK_STREAM,0);63 if(sockfd<0)64 {65 perror("创建套接字失败");66 exit(-1);67 }68
69 if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1)70 {71 perror("bind 失败");72 exit(-1);73 }74
75 if(listen(sockfd,LISTEN_QUEUE))76 {77 perror("listen 失败");78 exit(-1);79 }80
81 length=sizeof(structsockaddr);82
83 while(1)84 {85 clientfd=accept(sockfd,(struct sockaddr *)&client_addr,&length);86 if(clientfd==-1)87 {88 perror("accept 失败");89 continue;90 }91 printf(">>>>>%s:%d 连接成功,当前所在的ID(fd)号: %d \n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),clientfd);92 print_time(ch);93 printf("加入的时间是:%s\n",ch);94
95 //来一个连接就创建一个进程进行处理
96 pid=fork();97 if(pid<0)98 {99 perror("fork error");100 }101 else if(pid==0)102 {103 recv(clientfd,(char *)&control,sizeof(struct Control),0);104 printf("用户 %d 使用命令 %d\n",control.uid,control.control);105 switch(control.control)106 {107 caseUSER_CHECK_LOGIN:108 {109 //身份验证处理
110 recv(clientfd,(char *)&user,sizeof(struct User),0);111 printf("客户端发送过来的用户名是:%s,密码:%s\n",user.username,user.password);112 if((user.uid=mysql_check_login(user))>0)113 {114 printf("验证成功\n");115 }116 else
117 {118 printf("验证失败\n");119 }120 send(clientfd,(char *)&user,sizeof(struct User),0);121 break;122 }123 caseFILE_PUSH:124 {125 charbuffer[BUFFER_SIZE];126 intdata_len;127 FILE * fp=NULL;128 bzero(buffer,BUFFER_SIZE);129 if((fp=fopen("data","wb"))==NULL)130 {131 perror("文件打开失败");132 exit(-1);133 }134 //循环接收数据
135 int size=0;//表示有多少个块
136 while(data_len=recv(clientfd,buffer,BUFFER_SIZE,0))137 {138 if(data_len<0)139 {140 perror("接收数据错误");141 exit(-1);142 }143 size++;144 if(size==1)145 printf("正在接收来自%s:%d的文件\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));146 else
147 printf(".");148 //向文件中写入
149 int write_len=fwrite(buffer,sizeof(char),data_len,fp);150 if(write_len>data_len)151 {152 perror("写入数据错误");153 exit(-1);154 }155 bzero(buffer,BUFFER_SIZE);156 }157 if(size>0)158 printf("\n%s:%d的文件传送完毕\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));159 else
160 printf("\n%s:%d的文件传送失败\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));161 fclose(fp);162 //rename("data","asdf");//这里可以修改文件的名字
163 exit(0);164 break;165 }166 caseFILE_PULL:167 {168 break;169 }170 caseFILE_LIST:171 {172 break;173 }174 caseFILE_DELECT:175 {176 break;177 }178 default:179 {180 break;181 }182 }183 close(clientfd);//短连接结束
184 exit(0);//退出子进程
185 }186 }187
188 return 0;189 }190
191
192 //函数定义
193 int mysql_check_login(structUser user)194 {195 MYSQL conn;196 MYSQL_RES *res_ptr;197 MYSQL_ROW result_row;198 intres;199 introw;200 intcolumn;201 intuid;202 char sql[256]={0};203 strcpy(sql,"select uid from users where username=\"");204 strcat(sql,user.username);205 strcat(sql,"\" and password=\"");206 strcat(sql,user.password);207 strcat(sql,"\";");208 printf("查询的sql:%s\n",sql);209 uid=-1;210 mysql_init(&conn);211 if(mysql_real_connect(&conn,"localhost","root","","filetranslate",0,NULL,CLIENT_FOUND_ROWS))212 {213 res=mysql_query(&conn,sql);214 if(res)215 {216 perror("Select SQL ERROR!");217 exit(-1);218 }219 else
220 {221 res_ptr=mysql_store_result(&conn);222 if(res_ptr)223 {224 column=mysql_num_fields(res_ptr);//获取列数
225 row=mysql_num_rows(res_ptr)+1;//获取行数,加1表示还有第一行字段名
226 if(row<=1)227 {228 ;//验证失败
229 }230 else
231 {232 //这里先假定username是唯一
233 result_row=mysql_fetch_row(res_ptr);234 printf("获取到的uid是:%s\n",result_row[0]);235 uid=atoi(result_row[0]);236 }237 }238 else
239 {240 printf("没有查询到匹配的数据\n");241 }242 }243 }244 else
245 {246 perror("Connect Failed!\n");247 exit(-1);248 }249 mysql_close(&conn);250 returnuid;251 }252
253 void print_time(char *ch)254 {255 time_t now;256 struct tm *stm;257 time(&now);258 stm=localtime(&now);259 sprintf(ch,"%02d:%02d:%02d\n",stm->tm_hour,stm->tm_min,stm->tm_sec);260 return;261 }262
263 int MAX(int a,intb)264 {265 if(a>b)266 returna;267 returnb;268 }