Socket通信有个问题困扰了我快一天了 大佬快来救我~

ArrowYL 2018-03-11 03:31:27
就是我编写客户端与服务器实现聊天室时
先注册 客户端写注册信息->write写入管道->服务器read读管道->读到注册选项然后把用户数据插入数据库->服务器打印注册成功
这都没问题,现在问题来了
我把注册后的返回结果write进管道,然后客户端read读服务器处理结果,却总是返回0,打印不了注册成功
下面第一个是服务器代码,第二个是客户端代码,目前只写了一个注册,问题没解决写不下去其他的
 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 }
...全文
390 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-03-12
  • 打赏
  • 举报
回复
 void *server_requst(int cfd)
 89     return;
 90 }
 91 
 92 
 93 void *server_requst(int cfd)
为什么要定义两个同名函数? 不看你的代码还以为你使用的是管道机制呢。这不是读写socket吗?描述的时候怎么成管道呢?
赵4老师 2018-03-12
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
ArrowYL 2018-03-11
  • 打赏
  • 举报
回复
服务器还有一段代码
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 

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧