69,368
社区成员
发帖
与我相关
我的任务
分享
10 #include "tcp_net_socket.h"
11
12 struct send
13 {
14 char name[10];
15 char toname[10];
16 char account[20];
17 char password[20];
18 char question[20];
19 char answer[20];
20 char signature[100];
21 char msg[200];
22 char filename[20];
23 char file[2000];
24 char emotion;
25 int likes;
26 int vip;
27 int cmd;
28 };
29
30 struct recv
31 {
32 char from_name[10];
33 char to_name[10];
34 char num[20][20];
35 char password[20];
36 char question[20];
37 char answer[20];
38 char signature[20];
39 char msg[200];
42 char emotion;
43 int likes;
44 int vip;
45 int online_num;
46 int result;
47 };
48
49 sqlite3 *db = NULL;
50 struct send userdata;
51 struct recv serverdata;
52 int ret;
53
54
55
56
57
58 typedef struct node
59 {
60 int socket;
61 char name[20];
62 struct node *next;
63 }usermsg,*pusermsg;
64
65 void save_user()
66 {
67 char *errmsg=NULL;
68 char a[200]={0};
69 char b[200]={0};
70 memset(&serverdata,0,sizeof(serverdata));
72 ret = sqlite3_exec(db,a,NULL,NULL,&errmsg);
73 if(ret != SQLITE_OK)
74 {
75 printf("插入失败:%d(%s)\n", ret, errmsg);
76 serverdata.result = existing_acc;
77 printf("用户%s插入失败...\n",userdata.name);
78 return;
79 }
80 sprintf(b, "insert into question values('%s','%s','%s','%s')",userdata.account, userdata.password, userdata.question, userdata.answer);
81 ret = sqlite3_exec(db,b,NULL,NULL,&errmsg);
82 if(ret != SQLITE_OK)
83 {
84 printf("插入失败");
85 return;
86 }
87 serverdata.result = reg_success;
88 printf("用户数据插入数据库成功..\n");
89 return;
90 }
91
92
93 void *server_requst(int cfd)
89 return;
90 }
91
92
93 void *server_requst(int cfd)
94 {
95 int ret1;
96 printf("服务器正在处理用户请求...\n");
97 char *errmsg=NULL;
98 while(1)
99 {
100 ret = read(cfd,&userdata,sizeof(userdata));
101 if(ret == 0)
102 pthread_exit(NULL);
103 switch(userdata.cmd)
104 {
105 case (reg):{
106 save_user(db);
107 printf("result= %d\n",serverdata.result);
108 ret1 = write(cfd,&serverdata,sizeof(serverdata));
109 if(ret1 == -1)
110 {
111 perror("write");
112 return;
113 }
114 break;
115 }
116 case (log):break;
117 }
118 }
119 }
120
#include "tcp_net_socket.h"
11
12
13 struct send
14 {
15 char name[10];
16 char toname[10];
17 char account[20];
18 char password[20];
19 char question[20];
20 char answer[20];
21 char signature[100];
22 char msg[200];
23 char filename[20];
24 char file[2000];
25 char emotion;
26 int likes;
27 int vip;
28 int cmd;
29 };
30
31 struct recv
32 {
33 char from_name[10];
34 char to_name[10];
35 char num[20][20];
36 char password[20];
37 char question[20];
38 char answer[20];
39 char signature[100];
40 char msg[200];
41 char filename[20];
42 char file[2000];
43 char emotion;
44 int likes;
45 int vip;
46 int online_num;
47 int result;
48 };
49
50 struct send userdata;
51 struct recv serverdata;
52 int ret;
53
54 password(char *str,int size)
55 {
56 int c,n = 0;
57 do
58 {
59 c = mygetch();
60 if(c != '\n' && c != 'r' && c != 8)
61 {
62 str[n] = c;
63 printf("*");
64 n++;
65 }
66 else if((c != '\n'|c != 'r') && c == 8)
67 {
68 if (n > 0)
69 {
70 n--;
71 printf("\b \b");
72 }
73 }
74 }while(c != '\n' && c != 'r' && n < (size-1));
75 str[n] = '0';
76 return n;
77 }
78
79 reg_menu()
80 {
81 userdata.cmd = reg;
82 int i=0,j=0;
83 char pass1[20] = {0};
84 char pass2[20] = {0};
85 userdata.vip = 0;
86 userdata.likes = 0;
87 printf("请输入账号:\n");
88 scanf("%s",userdata.account);
89 SCAN();
90 printf("请输入密码:\n");
91 i = password(pass1,20);
92 printf("\n");
93 while(i < 8)
94 {
95 printf("您的密码过短,请重新输入:\n");
96 i = password(pass1,20);
97 }
98 printf("\n");
99 printf("请确认您的密码:\n");
100 password(pass2,20);
101
102 printf("请输入您的昵称:\n");
103 scanf("%s",userdata.name);
104 SCAN();
105
106 printf("请输入您的个性签名:\n");
107 scanf("%s",userdata.signature);
108 SCAN();
109
110 printf("请输入密保问题:\n");
111 scanf("%s",userdata.question);
112 SCAN();
113
114 printf("请输入密保答案:\n");
115 scanf("%s",userdata.answer);
116 SCAN();
117 printf("正在注册......\n");
118 sleep(1);
119 if(strcmp(pass1,pass2) != 0)
120 {
121 printf("前后输入的密码不一致,请重新注册\n");
122 sleep(1);
123 return -1;
124 }
125 strcpy(userdata.password,pass1);
126 }
127
128
129
130
131
132 void menu()
133 {
134 system("clear");
135 printf("\n\n\n");
136 printf("\t\t\t\t 欢迎来到聊天室");
137 printf("\n\n\n\n\n");
138 printf("\t\t\t\t\t1 注册\n");
139 printf("\t\t\t\t\t2 登录\n");
140 printf("\t\t\t\t\t3 忘记密码\n");
141 printf("\t\t\t\t\t4 退出\n");
142 printf("\n\n\t\t\t请输入选择:");
143 }
144
145 int main(int argc,char *argv[])
146 {
147
148 if(argc<3)
149 {
150 printf("usage:./clienttcp ip port\n");
151 }
152 char sel;
153 int sfd = tcp_connect(argv[1],atoi(argv[2]));
154 while(1)
155 {
156 menu();
157 scanf(" %c",&sel);
158 switch(sel)
159 {
160 case '1':{
161 if(reg_menu() == -1 )
162 {
163 break;
164 }
165 write(sfd,&userdata,sizeof(userdata));
166 memset(&userdata,0,sizeof(userdata));
167
168 memset(&serverdata,0,sizeof(serverdata));
169 read(sfd,&serverdata,sizeof(serverdata));
170 if( ret == -1)
171 {
172 perror("read1");
173 return;
174 }
175 if( ret == 0)
176 {
177 perror("read2");
178 return;
179 }
180 if(serverdata.result == reg_success)
181 {
182 printf("注册成功!\n");
183 sleep(1);
184 }
185 else if(serverdata.result == existing_acc)
186 {
187 printf("该账户已被注册,请重新注册!\n");
188 sleep(1);
189 }
190 }break;
191 case '2':break;
192 case '3':break;
193 case '4':printf("再见~~");
194 break;
195 default :printf("输入有误,请重新输入");break;
196 }
197 }
198 return(0);
199 }
void *server_requst(int cfd)
89 return;
90 }
91
92
93 void *server_requst(int cfd)
为什么要定义两个同名函数?
不看你的代码还以为你使用的是管道机制呢。这不是读写socket吗?描述的时候怎么成管道呢?int main(int argc,char *argv[])
125 {
126 int sfd;
127 pusermsg p =(pusermsg)malloc(sizeof(usermsg)/sizeof(char));
128 if(p == NULL)
129 {
130 printf("malloc failed...");
131 }
132 p->next = p;
133 sfd = tcp_init();
134 // signalhandler();
135 char *errmsg = NULL;
136
137 ret = sqlite3_open("user.db",&db);
138 if(ret != SQLITE_OK)
139 {
140 perror("open user.db error");
141 return -1;
142 }
143 printf("建立用户数据库成功\n");
144
146 if(ret != SQLITE_OK)
147 {
148 printf("create fail :%d(%s)\n\n",ret,errmsg);
149 return -1;
150 }
151
153 if(ret !=SQLITE_OK)
154 {
155 printf("creat fail:%d(%s)\n",ret,errmsg);
156 return -1;
157 }
158
159 pthread_t clientid;
160
161 while(1)
162 {
163 int cfd;
164 cfd = tcp_accept(sfd);
165 if(cfd == -1)
166 {
167 perror("accept");
168 return -1;
169 }
170 ret = pthread_create(&clientid, NULL, (void*)server_requst, (void*)cfd);
171 if(ret == -1)
172 {
173 perror("pthread create");
174 return -1;
175 }
176 pthread_detach(clientid);
177 pthread_join(clientid, NULL);
178 }
179 sqlite3_close(db);
180 return 0;
181 }
182
183