基于Linux C的socket聊天室
1 系统功能
1.1 支持聊天。
1. 2 支持向指定用户发送悄悄话功能
。
1. 3 支持不同消息不同颜显示。
1. 4 用户名为登录的唯一标示,所以不允许重名,客户端登录具有重名检查功能。
1. 5 支持上线下线通知。
1. 6 支持服务器发送系统消息功能。
1. 7 支持登录时检测服务器是否在线。
1. 8 支持服务器下线通知客户端,客户端强行下线。
2 硬件平台
2.1 功能
用来作为对Linux C程序所用软件以及操作系统的安装的载体,
2. 2 特点
计算机的整体配置还算不错,4G内存,500G硬盘,1G独立显卡等,使得运行一般的大游戏都不卡。
2. 3 组成
K43T系列华硕计算机一台,外加键盘一个。
3 软件平台
3.1 操作系统平台
主要有Windows7操作系统和ubuntu操作系统,电脑以安装Window7为主,ubuntu操作系统以虚拟系统的方式安装在电脑上。
3. 2 系统软件平台
主要用到的软件有:Linux的ubuntu操作系统,VMware Workstation软件,Window7下的记事本软件,wps软件和CodeBlocks C编程软件以及GCC编译器等等。
3. 3 系统设计
3.3.1模块设计
主要写了两个模块程序,一个是服务端程序,另一个是客户端程序,在服务端程序主要完成对服务的基本配置以及对客户端程序的一些初始化参数进行设计等,实现端用户聊天的功能。在客户端程序里,完成对客户信息的封装,可以供多个客户同时登陆,并能对错误信息给出对应的提示,方便用户使用。服务程序文件盒客户端程序文件分别为server.c和client.c,使用Gcc来调试运行成server和client文件,先启动server程序,配置服务端信息,然后启动客户端client程序,用户登陆,进行聊天。
3.3.2 服务端程序server.c主要代码如下:
typedef struct {
char name[10];
SA_IN address;
} USER;
//XXX :用户链表
typedef struct Hnode_list {
USER data;
struct Hnode_list *next;
} Hlink, *plink;
int memoryError(plink p);
socket编程聊天室基本流程int creatUserList(plink head);
int findUser(plink head, char name[10]);
int delUser(plink head, char name[10]);
int getAllUser(plink const head);
int addUser(plink head, USER data);
//XXX :用户链表
void ProcessLogin(char* command, SA_IN rec_addr);
void ProcessChat(char* command);
void ProcessQuit(char* command);
int ProcessPrivate(char* command,SA_IN rec_addr);
void ProcessAd();
void sig_int(int signum);//ctl+c关掉服务器
static plink head;
static int socket_fd;
int main(void) {
char buf[BUFFERSIZE];
SA_IN address, rec_addr;
socklen_t length;
struct timeval tv;
tv.tv_sec=60;//插播广告时间
tv.tv_usec=0;
head = malloc(sizeof(Hlink));//用户列表头
creatUserList(head); //创建列表
signal(SIGINT,sig_int);
if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Socket creation fails");
exit(-1);
}
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(SERVER_IP);
address.sin_port = htons(SERVER_PORT);
if (bind(socket_fd, (SA *) &address, sizeof(address)) == -1) {
perror("Socket is bound to fail");
exit(-1);
}
//30秒没有收到任何消息就发送广告
printf("The server to start successip:%s\n",inet_ntoa(address.sin_addr));
length = sizeof(rec_addr);
setsockopt(socket_fd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));
while (1) {
memset(buf,0,sizeof(buf));
//服务器只有此处用来接收
if (recvfrom(socket_fd, buf, sizeof(buf), 0, (SA *) &rec_addr, &length) == -1)
{
buf[0]='A';//发送广告标志位
}
switch (buf[0]) {
case 'L'://登录
ProcessLogin(buf, rec_addr);
break;
case 'C'://聊天
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论