1、UDP_chatroom.h
#ifndef _CHATROOM_H_
#define _CHATROOM_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <semaphore.h>
#include <termios.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#define REG 1
#define LOG 2
#define FORGET 3
#define EXIT 4
#define EXISTING_ACC 5
#define LOGGED_ACC 6
#define ERROR 7
#define LOG_SUCCESS 8
#define REG_SUCCESS 9
#define Exit 10
#define private_chat 11
#define group_chat 12
#define group_result 13
#define file_transfer 14
#define online 15
#define expression 16
#define phrases 17
#define motto 18
#define motto_change 19
#define like 20
#define Vip 21
#define Shutup 22
#define lifted 23
#define kick 24
#define VIP_SUCCESS 25
#define SHUTUP_SUCCESS 26
#define SEND_SUCCESS 27
#define SEND_FAILED 28
#define KICK_SUCCESS 30
#define LIKE_SUCCESS 31
#define CHANGE_SUCCESS 32
#define RECVFILE_SUCCESS 33
#define SENDFILE_SUCCESS 34
#endif
2、UDP_server.c
#include "UDP_chatroom.h"
#define PORT 8888
typedef struct info
{
char username[20];
char account[20];
char passwd[20];
char from_name[20];
char to_name[20];
char moto[30];
char online_name[20][20];
int online_num;
int cmd;
int vip;
int likes;
int result;
char msg[1024];
char e_s;
char p_s;
char file_name[50];
char Ftp[2048];
}Info;
typedef struct node
{
struct sockaddr_in client_addr;
char name[20];
char account[20];
struct node *next;
}Node, *LinkList;
struct sockaddr_in client_addr;
Info SendBuf;
Info RecvBuf;
sqlite3 *ppdb = NULL;
LinkList head = NULL;
int sockfd;
int ret;
void deal_reg(struct sockaddr_in temp_addr)
{
char sql[200] = {
0};
char *errmsg = NULL;
sprintf(sql, "insert into chatroom(username, account, passwd, likes, vip, moto) values('%s','%s','%s','%d','%d', '%s')",RecvBuf.username, RecvBuf.account, RecvBuf.passwd, RecvBuf.likes, RecvBuf.vip, RecvBuf.moto);
ret = sqlite3_exec(ppdb, sql, NULL, NULL, &errmsg);
if(ret != SQLITE_OK)
{
perror("sqlite3_exec2");
SendBuf.result = EXISTING_ACC;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if (ret < 0)
{
perror("sendto_server_log");
exit(1);
}
return;
}
SendBuf.result = REG_SUCCESS;
printf("注册信息:用户名:%s \t 账号:%s \t 密码:%s\n", RecvBuf.username, RecvBuf.account, RecvBuf.passwd);
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if (ret < 0)
{
perror("sendto_server_register");
exit(1);
}
bzero(&SendBuf, sizeof(SendBuf));
}
void deal_log(struct sockaddr_in temp_addr)
{
char **Result = NULL;
int nRow;
int nColumn;
int ret;
char sql[200] = {
0};
sprintf(sql, "select username, passwd, likes, vip, moto from chatroom where account = '%s' and passwd = '%s'", RecvBuf.account,RecvBuf.passwd);
ret = sqlite3_get_table(ppdb, sql, &Result, &nRow, &nColumn, NULL);
if(ret != SQLITE_OK)
{
perror("sqlite3_get_table_deal_log");
exit(1);
}
if(1 == nRow)
{
LinkList tmp = head->next;
while(tmp != head)
{
if(!strcmp(tmp->account, RecvBuf.account))
{
SendBuf.result =LOGGED_ACC;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret < 0)
{
perror("sendto_server_log");
exit(1);
}
return;
}
tmp = tmp->next;
}
SendBuf.result = LOG_SUCCESS;
LinkList p = (LinkList)malloc(sizeof(Node));
if(p == NULL)
{
printf("malloc error!\n");
return;
}
strcpy(p->account, RecvBuf.account);
strcpy(p->name, Result[5]);
strcpy(SendBuf.username,Result[5]);
SendBuf.vip = *(Result[8]) - 48;
SendBuf.likes = *(Result[7]) - 48;
strcpy(SendBuf.moto, Result[9]);
p->client_addr.sin_family = temp_addr.sin_family;
p->client_addr.sin_port = temp_addr.sin_port;
p->client_addr.sin_addr.s_addr = temp_addr.sin_addr.s_addr;
printf("%s 上线!\n",Result[5]);
printf("登录信息:用户:%s\t帐号:%s\t密码:%s\t端口号:%d\n",SendBuf.username,p->account, RecvBuf.passwd, p->client_addr.sin_port);
p->next = head->next;
head->next = p;
}
else
{
SendBuf.result = ERROR;
}
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret < 0)
{
perror("sendto_server_log");
exit(1);
}
}
int deal_private(struct sockaddr_in temp_addr)
{
int flag = 0;
LinkList tmp = head->next;
while(tmp != head)
{
if(!strcmp(tmp->name,RecvBuf.to_name))
{
flag = 1;
strcpy(SendBuf.msg, RecvBuf.msg);
strcpy(SendBuf.from_name,RecvBuf.username);
SendBuf.result = private_chat;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));
if(ret == -1)
{
perror("sendto_pchat");
exit(1);
}
break;
}
tmp=tmp->next;
}
if(flag)
{
SendBuf.result = SEND_SUCCESS;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_success");
exit(1);
}
}
else
{
SendBuf.result = SEND_FAILED;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_failure");
exit(1);
}
}
}
int deal_group(struct sockaddr_in temp_addr)
{
int flag = 0;
LinkList tmp = head->next;
while (tmp != head)
{
if (tmp->client_addr.sin_port != temp_addr.sin_port)
{
flag = 1;
SendBuf.result = group_chat;
strcpy(SendBuf.from_name, RecvBuf.username);
strcpy(SendBuf.msg, RecvBuf.msg);
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));
if (ret < 0)
{
perror("sendto_group_chat");
exit(1);
}
}
tmp = tmp->next;
}
if (flag)
{
SendBuf.result = SEND_SUCCESS;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if (ret < 0)
{
perror("sendto_group_chat_success");
exit(1);
}
}
else
{
SendBuf.result = SEND_FAILED;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if (ret < 0)
{
perror("sendto_group_chat_failure");
exit(1);
}
}
}
int deal_online(struct sockaddr_in temp_addr)
{
int i = 0;
SendBuf.online_num = 0;
LinkList tmp = head->next;
while(tmp != head)
{
SendBuf.online_num++;
strcpy(SendBuf.online_name[i],tmp->name);
i++;
tmp = tmp->next;
}
SendBuf.result = online;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_online");
}
}
int deal_like(struct sockaddr_in temp_addr)
{
char *errmsg = NULL;
char **Result = NULL;
int nRow;
int nColumn;
char sql[100];
sprintf(sql, "select likes from chatroom where username = '%s'", RecvBuf.to_name);
ret = sqlite3_get_table(ppdb, sql, &Result, &nRow, &nColumn, &errmsg);
if(ret != SQLITE_OK)
{
printf("select fail:%d(%s)\n", ret, errmsg);
return -1;
}
if(nRow == 1)
{
sprintf(sql, "update chatroom set likes = %d where username = '%s'", *(Result[1]) - 47, RecvBuf.to_name);
ret = sqlite3_exec(ppdb, sql, NULL, NULL, &errmsg);
if(ret != SQLITE_OK)
{
printf("update fail:%d(%s)\n", ret, errmsg);
return ;
}
LinkList tmp = head->next;
while(tmp != head)
{
if(strcmp(tmp->name, RecvBuf.to_name) == 0)
{
SendBuf.likes = *(Result[1]) - 47;
SendBuf.result = like;
strcpy(SendBuf.from_name,RecvBuf.username);
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));
if(ret == -1)
{
perror("sendto_like");
}
break;
}
tmp = tmp->next;
}
SendBuf.result = LIKE_SUCCESS;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_like_suuess");
}
}
else
{
SendBuf.result = SEND_FAILED;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_like_failed");
}
}
}
int deal_moto_change(struct sockaddr_in temp_addr)
{
char *errmsg = NULL;
char **Result = NULL;
int nRow;
int nColumn;
char sql[100];
sprintf(sql, "update chatroom set moto = '%s' where username = '%s'", RecvBuf.moto, RecvBuf.username);
ret = sqlite3_exec(ppdb, sql, NULL, NULL, &errmsg);
if(ret != SQLITE_OK)
{
printf("update fail:%d(%s)\n", ret, errmsg);
return;
}
LinkList tmp = head->next;
while(tmp != head)
{
if(strcmp(tmp->name, RecvBuf.username) == 0)
{
sprintf(sql, "select moto from chatroom where username = '%s'", RecvBuf.username);
ret = sqlite3_get_table(ppdb, sql, &Result, &nRow, &nColumn, &errmsg);
if(ret != SQLITE_OK)
{
printf("select fail:%d(%s)\n", ret, errmsg);
return -1;
}
strcpy(SendBuf.moto, Result[1]);
SendBuf.result = motto_change;
strcpy(SendBuf.from_name, RecvBuf.username);
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr,sizeof(tmp->client_addr));
if(ret == -1)
{
perror("sendto_moto");
}
break;
}
tmp = tmp->next;
}
SendBuf.result = CHANGE_SUCCESS;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&temp_addr, sizeof(temp_addr));
if(ret == -1)
{
perror("sendto_moto_succuess");
}
}
int deal_expression(struct sockaddr_in temp_addr)
{
int flag = 0;
LinkList tmp = head->next;
while (tmp != head)
{
if (tmp->client_addr.sin_port != temp_addr.sin_port)
{
flag = 1;
SendBuf.result = expression;
strcpy(SendBuf.from_name, RecvBuf.username);
SendBuf.e_s = RecvBuf.e_s;
ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));
if (ret < 0)
{
perror("sendto_face");
exit(1)