/*输入用户名, 然后通过fd发送出去*/ void input_userinfo(int conn_fd, const char *string) { char input_buf[32]; char recv_buf[BUFSIZE]; int flag_userinfo; /*输入用户信息直到正确为止*/ do { printf("%s :",string); if (get_userinfo(input_buf, 32) < 0) { //调用get_userinfo()获取用户输入数据存入input_buf printf("error return from get_userinfo\n"); exit(1); } if (send(conn_fd, input_buf, strlen(input_buf), 0) < 0) { //在TCP套接字上发送数据,fd为套接字描述符,buf为要发送的缓冲区 my_err("send", __LINE__); } /*从连接套接字上读取一次数据*/ if(my_recv(conn_fd,recv_buf, sizeof(recv_buf)) < 0) { //从连接套接字上读取一次数据 printf("data is too long\n"); exit(1); } if(recv_buf[0] == VALID_USERINFO) { flag_userinfo = VALID_USERINFO; } else { printf("%s error,input again", string); //错误,将flag_userinfo置为用户信息无效 flag_userinfo = INVALID_USERINFO; } } while(flag_userinfo = INVALID_USERINFO); }
//输入用户名 ,然后通过fd发送出去 void input_userinfo(int conn_fd ,const char *string) { char input_buf[32]; char recv_buf[BUFSIZE]; int flag_userinfo; //输入用户信息直到正确为止 do { printf("%s:" ,string); if(get_userinfo(input_buf ,32) < 0) { printf("errno return from get_userinfo"); exit(1); } if(send(conn_fd ,input_buf ,strlen(input_buf) ,0) < 0) { my_err("send" ,__LINE__); } //从连接套接字上读取一次数据 if(my_recv(conn_fd ,recv_buf ,sizeof(recv_buf)) < 0) { printf("data is too long\n"); exit(1); } if(recv_buf[0] == VALID_USERINFO) { flag_userinfo = VALID_USERINFO; } else { printf("%s errno ,input again,",string); flag_userinfo = INVALID_USERINFO; } } while(flag_userinfo == INVALID_USERINFO); }
// 用户登录界面 static void login_menu(){ memset(static_message.userinfo_data.pwd, '\0', sizeof(static_message.userinfo_data.pwd)); erase(); mvprintw(3 ,25, "%s", " 欢迎访问模拟铁路订票系统!"); mvprintw(8, 35, "%s", " 用户名:"); getstr(static_message.userinfo_data.u_name); mvprintw(11, 35, "%s", " 密 码:"); refresh(); cbreak(); noecho(); int i=0; while(i<20){ static_message.userinfo_data.pwd[i]=getch(); if(static_message.userinfo_data.pwd[i]=='\n'){ static_message.userinfo_data.pwd[i]='\0'; break; } move(11, 44+i); addch('*'); refresh(); i++; } echo(); nocbreak(); static_message.userinfo_data=get_userinfo(static_message.userinfo_data.u_name, static_message.userinfo_data.pwd); refresh(); userinfo userinfo_cmp; memset(&userinfo_cmp, 0, sizeof(userinfo_cmp)); if(memcmp(&userinfo_cmp, &(static_message.userinfo_data), sizeof(userinfo))){ mvprintw(13, 35, "%s", "登录成功,跳转中"); refresh(); sleep(1); printw("%s", "."); refresh(); sleep(1); printw("%s", "."); refresh(); sleep(1); printw("%s", "."); refresh(); sleep(1); main_menu(); }else{ mvprintw(13, 35, "%s", "登录失败,用户名或密码错误!跳转中..."); refresh(); sleep(3); start_menu(); } }
void input_userinfo(int conn_fd, const char *string) { char input_buf[32]; char recv_buf[SIZE]; int flag_userinfo; printf("%s", string); if (get_userinfo(input_buf, 32) < 0) { printf("error return from get_userinfo\n"); exit (1); } if (send(conn_fd, input_buf, strlen(input_buf), 0) < 0) { my_err("send", __LINE__); } }
void input_userinfo(int conn_fd,char *string) //输入用户名,通过conn_fd 发出 { char input_buf[32]; char recv_buf[BUFMAX]; int flag_userinfo; do { printf(" %s:",string); if(get_userinfo(input_buf,32)<0) { printf("error return from get_userinfo \n"); exit(1); } if(send(conn_fd,input_buf,strlen(input_buf),0)<0) { perror("send"); } if(my_recv(conn_fd,recv_buf,sizeof(recv_buf))<0) { printf("data to long\n"); exit(1); } if(recv_buf[0]==VALID_USERINFO) { flag_userinfo=VALID_USERINFO; } else { printf(" %s error ,input again ",string); flag_userinfo=INVALID_USERINFO; } }while(flag_userinfo==INVALID_USERINFO); }
LibMuttng::LibMuttng () { if (!debugObj) { core_init(); /* before we have all library-internal options, get other stuff */ get_userinfo(); get_hostinfo(); debugObj = new Debug (Homedir, NULL, Umask); /* register all options for library globally */ Option* d = new IntOption("debug_level","0",&DebugLevel,0,5); connectSignal<LibMuttng,Option*>(d->sigOptionChange,this, &LibMuttng::setDebugLevel); ConfigManager::regOption(d); ConfigManager::regOption(new StringOption("send_charset", "us-ascii:iso-8859-1:iso-8859-15:utf-8", &SendCharset)); ConfigManager::regOption(new StringOption("charset", get_charset(), &Charset)); ConfigManager::regOption(new SysOption("muttng_core_version","\""CORE_VERSION"\"")); ConfigManager::regOption(new SysOption("muttng_libmuttng_version", "\""LIBMUTTNG_VERSION"\"")); ConfigManager::regOption(new SysOption("muttng_hostname",Hostname)); ConfigManager::regOption(new SysOption("muttng_system",OSName)); ConfigManager::regOption(new SysOption("muttng_dnsname",Fqdn.str)); /* register all options within library modules */ LocalMailbox::reg(); #ifdef LIBMUTTNG_POP3 POP3Mailbox::reg(); #endif #ifdef LIBMUTTNG_NNTP NNTPMailbox::reg(); #endif #ifdef LIBMUTTNG_IMAP ImapMailbox::reg(); #endif MboxMailbox::reg(); MmdfMailbox::reg(); MHMailbox::reg(); MaildirMailbox::reg(); SubjectHeader::reg(); Connection::reg(); #ifdef LIBMUTTNG_SSL_OPENSSL SSLConnection::reg(); #endif #ifdef LIBMUTTNG_SSL_GNUTLS TLSConnection::reg(); #endif #ifdef LIBMUTTNG_CACHE_QDBM Cache::reg(); #endif #ifdef CORE_LIBICONV ConfigManager::regFeature("iconv"); #endif #ifdef CORE_INTL ConfigManager::regFeature("intl"); #endif #ifdef CORE_PCRE ConfigManager::regFeature("pcre"); #endif #ifdef CORE_LIBIDN ConfigManager::regFeature("idna"); #endif buffer_init(&AttachMarker); buffer_add_str(&AttachMarker,"\033]9;",3); buffer_add_snum(&AttachMarker,time(NULL),-1); buffer_add_ch(&AttachMarker,'\a'); connectSignal(displayMessage,this,&LibMuttng::debugMessage); connectSignal(displayProgress,this,&LibMuttng::debugProgress); connectSignal(displayWarning,this,&LibMuttng::debugWarning); connectSignal(displayError,this,&LibMuttng::debugError); } this->debug = debugObj; }
//定义所有客户端请求命令的处理函数 void exec_request(const message_data message_request){ message_data message_response; int end_index=0; char log[250]; message_response=message_request; message_response.response=s_success; switch(message_request.request){ case c_add_userinfo: if(!add_userinfo(message_request.userinfo_data)){ message_response.response=s_failure; sprintf(log, " 用户 %s 注册失败.", message_request.userinfo_data.u_name); sys_log(log); }else{ sprintf(log, " 用户 %s 注册成功.", message_request.userinfo_data.u_name); sys_log(log); } break; case c_get_userinfo: message_response.userinfo_data=get_userinfo(message_request.userinfo_data.u_name, message_request.userinfo_data.pwd); userinfo userinfo_cmp; memset(&userinfo_cmp, 0, sizeof(userinfo_cmp)); if(!memcmp(&userinfo_cmp, &(message_response.userinfo_data), sizeof(userinfo))) { message_response.response=s_failure; sprintf(log, "获取用户 %s 资料失败.", message_request.userinfo_data.u_name); sys_log(log); }else{ sprintf(log, " 获取用户 %s 资料成功.", message_request.userinfo_data.u_name); sys_log(log); } break; case c_modify_userinfo: if(!modify_userinfo(message_request.userinfo_data)) { message_response.response=s_failure; sprintf(log, "修改用户 %s 资料失败.", message_request.userinfo_data.u_name); sys_log(log); }else{ sprintf(log, " 修改用户 %s 资料成功.", message_request.userinfo_data.u_name); sys_log(log); } break; case c_get_traininfo_by_t_num: message_response.traininfo_data=get_traininfo_by_t_num(message_request.traininfo_data.t_num); traininfo traininfo_cmp; memset(&traininfo_cmp, 0, sizeof(traininfo_cmp)); if(!memcmp(&traininfo_cmp, &(message_response.traininfo_data), sizeof(traininfo))){ message_response.response=s_failure; sprintf(log, "用户 %s 获取车次 %s 信息失败.", message_request.userinfo_data.u_name, message_request.traininfo_data.t_num); sys_log(log); }else{ sprintf(log, "用户 %s 获取车次 %s 信息成功.", message_request.userinfo_data.u_name, message_request.traininfo_data.t_num); sys_log(log); } break; case c_get_traininfo_by_o_and_t: while(!end_index){ message_response.traininfo_data=get_traininfo_by_o_and_t(message_request.traininfo_data.originator, message_request.traininfo_data.terminal); traininfo traininfo_cmp; memset(&traininfo_cmp, 0, sizeof(traininfo_cmp)); if(!memcmp(&traininfo_cmp, &(message_response.traininfo_data), sizeof(traininfo))){ message_response.response=s_failure; end_index=1; }else{ if(!send_response_to_client(message_response)){ fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid); sprintf(log, "用户 %s 获取车次 %s 信息失败.", message_request.userinfo_data.u_name, message_response.traininfo_data.t_num); sys_log(log); }else{ sprintf(log, "用户 %s 获取车次 %s 信息成功.", message_request.userinfo_data.u_name, message_response.traininfo_data.t_num); sys_log(log); } } } break; case c_get_ticket: message_response.ticket_data=get_ticket(message_request.ticket_data.tid, &(message_request.ticket_data.departure_date)); ticket ticket_cmp; memset(&ticket_cmp, 0, sizeof(ticket_cmp)); if(!memcmp(&ticket_cmp, &(message_response.ticket_data), sizeof(ticket))) message_response.response=s_failure; break; case c_modify_ticket: if(!modify_ticket(message_request.ticket_data)) message_response.response=s_failure; break; case c_add_order: if(!add_order(message_request.order_data)){ message_response.response=s_failure; sprintf(log, "用户 %s 购买 Tid 为 %d 的车次火车票 %d 张失败.", message_request.userinfo_data.u_name, message_request.order_data.tid, message_request.order_data.num); sys_log(log); }else{ sprintf(log, "用户 %s 购买 Tid 为 %d 的车次火车票 %d 张成功.", message_request.userinfo_data.u_name, message_request.order_data.tid, message_request.order_data.num); sys_log(log); } break; case c_get_orders: while(!end_index){ message_response.order_data=get_orders(message_request.order_data.uid); orders order_cmp; memset(&order_cmp, 0, sizeof(order_cmp)); if(!memcmp(&order_cmp, &(message_response.order_data), sizeof(orders))){ message_response.response=s_failure; end_index=1; }else{ if(!send_response_to_client(message_response)){ fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid); sprintf(log, "获取用户 %s 订单 %d 信息失败.", message_request.userinfo_data.u_name, message_response.order_data.oid); sys_log(log); }else{ sprintf(log, "获取用户 %s 订单 %d 信息成功.", message_request.userinfo_data.u_name, message_response.order_data.oid); sys_log(log); } } } break; case c_modify_order: if(!modify_order(message_request.order_data)){ message_response.response=s_failure; sprintf(log, "修改用户 %s 订单 %d 信息失败.", message_request.userinfo_data.u_name, message_request.order_data.oid); sys_log(log); }else{ sprintf(log, "修改用户 %s 订单 %d 信息成功.", message_request.userinfo_data.u_name, message_request.order_data.oid); sys_log(log); } break; default: message_response.response=s_failure; break; } if(!send_response_to_client(message_response)){ fprintf(stderr, "Server Warning: fail to response to %d. \n", message_response.client_pid); return; } return; }
int main() { int sock_fd, conn_fd; int optval; int flag_recv = USERNAME; //标识接收到的是用户名还是密码 int ret; int name_num; pid_t pid; socklen_t cli_len; struct sockaddr_in cli_addr, serv_addr; char recv_buf[128]; char input_buf[32]; //创建一个tcp套接字 sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(sock_fd < 0) my_err("socket", __LINE__); //设置该套接字使之可以重新绑定端口 optval = 1; if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(int)) < 0) my_err("setsockopt", __LINE__); //初始化服务器端地址结构 memset(&serv_addr, 0, sizeof(struct sockaddr_in)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //将套接字绑定到本地端口 if(bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) < 0) my_err("bind", __LINE__); //将套接字转化为监听套接字 if(listen(sock_fd, LISTENQ) < 0) my_err("listen", __LINE__); cli_len = sizeof(struct sockaddr_in); while (1) { //通过accept接收客户端的连接请求,并返回连接套接字用于收发数据 conn_fd = accept(sock_fd, (struct sockaddr *)&cli_addr, &cli_len); if(conn_fd < 0) my_err("accept", __LINE__); printf("accept a new client, ip: %s\n", inet_ntoa(cli_addr.sin_addr)); //创建一个子进程处理刚刚接收的连接请求 if((pid = fork()) == 0) { //子进程 while(1) { if((ret = (recv(conn_fd, recv_buf, sizeof(recv_buf), 0))) < 0) { perror("recv"); exit(1); } recv_buf[ret-1] = '\0'; //将数据结束标志‘\n’替换成字符串结束标志 if(flag_recv == USERNAME) { //接收到的是用户名 name_num = find_name(recv_buf); switch(name_num) { case -1: send_data(conn_fd, "n\n"); break; case -2: exit(1); break; default: send_data(conn_fd, "y\n"); flag_recv = PASSWORD; break; } } else if(flag_recv == PASSWORD) { //接收到的是密码 if(strcmp(users[name_num].password, recv_buf) == 0) { send_data(conn_fd, "y\n"); send_data(conn_fd, "welcome login my tcp server\n"); printf("%s login\n", users[name_num].username); break; } else send_data(conn_fd, "n\n"); } } while(1) { memset(recv_buf, 0, sizeof(recv_buf)); if((ret = (recv(conn_fd, recv_buf, sizeof(recv_buf), 0))) < 0) { perror("recv"); exit(1); } recv_buf[ret-1] = '\0'; printf("%s: %s\n", users[name_num].username, recv_buf); if(strcmp(recv_buf,"byebye") == 0 || strcmp(recv_buf, "BYEBYE") == 0) break; // memset(recv_buf, 0, sizeof(recv_buf)); memset(input_buf, 0, sizeof(input_buf)); if(get_userinfo(input_buf, 32) < 0) { printf("error return from get_userinfo\n"); exit(1); } if(send(conn_fd, input_buf, strlen(input_buf), 0) < 0) my_err("send", __LINE__); } close(sock_fd); close(conn_fd); exit(0); //结束子进程 } else { //父进程关闭刚刚接收到的连接请求,执行accept等待其他连接请求 close(conn_fd); } } return 0; }