Beispiel #1
0
/*输入用户名, 然后通过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);

}
Beispiel #2
0
//输入用户名 ,然后通过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);
}
Beispiel #3
0
// 用户登录界面
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();
	}
}
Beispiel #4
0
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__);
	}
}
Beispiel #5
0
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;
}
Beispiel #8
0
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;
}