日期:2014-05-16  浏览次数:20718 次

Linux下C实现的聊天室

实现目标

一个在Linux下可以使用的聊天软件,要求至少实现如下功能:
1. 采用Client/Server架构
2. Client A 登陆聊天服务器前,需要注册自己的ID和密码
3. 注册成功后,Client A 就可以通过自己的ID和密码登陆聊天服务器
4. 多个Client X 可以同时登陆聊天服务器之后,与其他用户进行通讯聊天
5. Client A成功登陆后可以查看当前聊天室内其他在线用户Client x
6. Client A可以选择发消息给某个特定的Client X,即”悄悄话”功能
7. Client A 可以选择发消息全部的在线用户,即”群发消息”功能
8. Client A 在退出时需要保存聊天记录
9. Server端维护一个所有登陆用户的聊天会的记录文件,以便备查
可以选择实现的附加功能:
1. Server可以内建一个特殊权限的账号admin,用于管理聊天室
2. Admin可以将某个Client X “提出聊天室”
3. Admin可以将某个Client X ”设为只能旁听,不能发言”
4. Client 端发言增加表情符号,可以设置某些自定义的特殊组合来表达感情.如输入:),则会自动发送”XXX向大家做了个笑脸”
5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室”

附加功能:

文件传输

部分主要代码:

客户端:

client_main.h

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#define PORT 6666
#define MAXLEN 1000
#define OK 1
#define FAULT 0
struct message    /*消息结构体*/
{
    char flag[15];             /*标志位*/
    char name[20];             /*用户名*/
	char msg[MAXLEN];          /*消息内容*/
	char addressee[20];        /*传输文件目的用户*/
	int size;                  /*传输内容字节数*/
};
int qid = -1,fd = -1;
int sockfd = -1;               /*套接字描述符*/
int savefilefd = -1;           /*保存文件描述符*/
char filefromname[20];         /*文件来源名*/
char chat_log[100];            /*聊天记录名*/
pthread_mutex_t lock ;         /*线程锁*/


client_handle.h

#ifndef CLIENT_HANDLE_H
#define CLIENT_HANDLE_H

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#define PORT 8888
#define MAXLEN 1000
#define OK 1
#define FAULT 0
struct message    /*消息结构体*/
{
    char flag[15];             /*标志位*/
    char name[20];             /*用户名*/
	char msg[MAXLEN];          /*消息内容*/
	char addressee[20];        /*传输文件目的用户*/
	int size;                  /*传输内容字节数*/
};
extern int qid,fd;
extern int sockfd;               /*套接字描述符*/
extern int savefilefd;           /*保存文件描述符*/
extern char filefromname[20];    /*文件来源名*/
extern char chat_log[100];       /*聊天记录名*/
extern pthread_mutex_t lock ;    /*线程锁*/
char filefromuser[20];           /*文件发送者用户名*/
char locname[20];                /*本客户端用户名*/

int Interface();
void cutStr(char str[],char left[], int n, char right[],int m, char c);
int help(char str[]);
void expression(char name[],char msg[]);
void common_use_words(char msg[]);
void handlesendfile();
void handlerecvfile(struct message *msg);
void handlerecvmsg(int *sockfd);
int admin_kick(int sockfd,struct message *a);
int admin_screen(int sockfd,struct message *a);
int login_admin(struct message *a);
int login_success(struct message *a);
int Register(struct message *a);
void log_user(struct message *a);

#endif //CLIENT_HANDLE_H


my_system_call.h

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

client_main.c