예제 #1
0
void send_chan(puser users, pchan chans, char * buffer, int sender_fd,
		int option) {
	char * message = malloc(MAXLEN);
	int k = 0;
	int fd = -1;

	// Search for the user's channel
	int chan_nb = users[search_fd(users, sender_fd)].chan;

	if (option == 1) { // Option = 1 if user sent message, and 0 if it is the server
		// Get the sender's id to have his nickname when formatting
		int u = search_fd(users, sender_fd);
		// Format the message
		sprintf(message, "{%s} : %s", users[u].nick, buffer);
	}
	else {
		sprintf(message, "%s",buffer);
	}

	// Send to all users of the channel
	while (k < BACKLOG) {
		fd = chans[chan_nb].members[k];
		if (fd != -1 && fd != sender_fd) {
			do_write(fd, message);
		}
		k++;
	}

	free(message);
}
예제 #2
0
파일: ser.c 프로젝트: City-Zero/LinuxTest
void chat_one(MES mes)
{
    //私聊转发消息
    int fd;
    fd = search_fd(mes.to);
    if(fd == 0) {
        fd = search_fd(mes.from);
        mes.resault = -1;
    }
    if(send(fd,&mes,sizeof(MES),0) < 0) {
        my_err("send",__LINE__);
        exit(0);
    }
    if(mes.resault != -1) {
        add_one_message(mes);
    }
    //puts("保存一条记录");
}
예제 #3
0
void send_bc(puser users, char * buffer, int fd) {
	int k = 0;
	int user_id = search_fd(users, fd);
	char * msg = malloc(MAXLEN);
	memset(msg, '0', MAXLEN);

	sscanf(buffer, "/msgall %250[^\n]", msg);
	sprintf(buffer, "%s : %s \n", users[user_id].nick, msg);

	for (k = 0; k < BACKLOG; k++) {
		if (users[k].sock_nb != fd && users[k].sock_nb != -1)
			do_write(users[k].sock_nb, buffer);
	}
	free(msg);
}
예제 #4
0
void send_user(puser users, char * buffer, int sender) {
	char * temp = malloc(MAXLEN);

	// Extracting the expected reciever's nickname from the buffer
	sscanf(buffer, "/msg %s", temp);
	// Search for the reciever's id by its name and search for the sender's id by its socket
	int r = search_name(users, temp);
	int s = search_fd(users, sender);
	if (r == -1) {
		sprintf(buffer, "[Server] : %s is not a logged on user \n", temp);
		do_write(sender, buffer);
		return;
	}
	// Extract the message from the buffer, we use a regex to have the spaces included in the message
	sscanf(buffer, "/msg %*s %250[^\n]", temp);
	// Format the message to be sent
	sprintf(buffer, "[%s] : %s\n", users[s].nick, temp);

	// Finally send the message to the user
	do_write(users[r].sock_nb, buffer);

	//
	free(temp);
}
예제 #5
0
파일: ser.c 프로젝트: City-Zero/LinuxTest
void chat_group(MES mes)
{
    char sql[255];
    int res;//执行sql语句后的返回标志
    MYSQL_RES *res_ptr;//指向查询结果的指针
    MYSQL_FIELD *field;//字段结构指针
    MYSQL_ROW result_row;//按行返回查询信息
    int row,column;//查询返回的行数和列数
    MYSQL *conn;//一个数据库链接
    //初始化连接句柄
    conn = mysql_init(NULL);

    if(conn == NULL) { 
        //如果返回NULL说明初始化失败
        printf("mysql_init failed!\n");
        return;// EXIT_FAILURE;
    }

    conn = mysql_real_connect(conn,HOSTNAME,USER,PASS,DATABASE,0,NULL,0);
    if (!conn) {
        printf("Connection failed!\n");
    }
    mysql_query(conn,"set names gbk");
    //防止乱码。设置和数据库的编码一致就不会乱码
	sprintf(sql,"SELECT * FROM group_%s;",mes.to);
    //puts(sql);

    res = mysql_query(conn,sql);//正确返回0
    if(res) {
        perror("my_query");
        mysql_close(conn);
        exit(0);
    } else{
        //把查询结果给res_ptr
        res_ptr = mysql_store_result(conn);
        if(res_ptr) {
           int ro;
            ro = mysql_num_rows(res_ptr);
            int i;
            for(i=1;i<ro+1;i++) {
				//将群消息发给每个人
                result_row = mysql_fetch_row(res_ptr);
                //printf("打算发消息给%s\n",result_row[0]);
				int dd;
				if((dd=search_fd(result_row[0])) == 0) {
					continue;
				}
				if(search_fd(result_row[0]) == search_fd(mes.from)) {
					continue;
				}
				if(send(dd,&mes,sizeof(MES),0) < 0) {
        			my_err("send",__LINE__);
       				exit(0);
    			}
                //printf("已经发消息给%s\n",result_row[0]);
			}
       		add_group_message(mes);
			//puts("添加一条群聊记录!");
        }
    }
    mysql_close(conn);
}