mysql socket 编程 pdf_Socket网络编程--小小网盘程序(2)

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值