• 大小: 14KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: C/C++
  • 标签: udp  聊天室  linux  c  

资源简介

--------------udp聊天室V1.0---------------- /////////////////////////使用方法 首先启动./server 再启动./client 不需要加任何的参数 /////////////////////////////功能描述 支持群聊天 支持向指定用户发送悄悄话功能 支持不同消息不同颜色显示 用户名为登录的唯一标示,所以不允许重名,客户端登录具有重名检查功能 支持上线下线通知 支持服务器发送系统消息功能 支持登录时检测服务器是否在线 支持服务器下线通知客户端,客户端强行下线

资源截图

代码片段和文件信息

//   更新日期 27/08/2011 14:18
#include “header.h“

void sig_user1(int signo);
void sig_user2(int signo);
void sig_alrm(int signo);
char* ProcessLogin(SA_IN serv_addr);
//以下为无关紧要的功能函数声明
void dispDot();
int msSleep(long ms);

static pid_t pid;
static int socket_fd;

int main(void) {

char buf[BUFFERSIZE];
char buf_temp[BUFFERSIZE];
char name[10];
SA_IN serv_addr;
signal(SIGUSR1 sig_user1);
signal(SIGUSR2sig_user2);
signal(SIGINTSIG_IGN);//拒绝用户ctrl+c强制退出只能键入quit退出

if ((socket_fd = socket(AF_INET SOCK_DGRAM 0)) == -1) {
perror(“套接字创建失败“);
exit(-1);
}
//XXX:服务器配置信息
memset(&serv_addr 0 sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
serv_addr.sin_port = htons(SERVER_PORT);
//XXX

strcpy(name ProcessLogin(serv_addr));//得到登录名

if ((pid = fork()) == -1) {
perror(“子进程创建失败“);
return -1;
}

if (pid == 0)///////////////////////////////////子进程用来接收服务器的消息
{
memset(buf‘\0‘BUFFERSIZE);//必须清空否则会有虚假数据
memset(buf_temp‘\0‘BUFFERSIZE);
sprintf(buf “C%s上线了“ name);
if (sendto(socket_fd buf sizeof(buf) 0 (SA *) &serv_addr sizeof(serv_addr)) < 0)
 {
perror(“上线失败“);
}
kill(getppid() SIGUSR1);//唤醒主进程让其输入
while (1) {
memset(buf‘\0‘BUFFERSIZE);//必须清空否则会有虚假数据
memset(buf_temp‘\0‘BUFFERSIZE);
if (recvfrom(socket_fd buf sizeof(buf) 0 NULL NULL) < 0) {
perror(“接收消息失败“);
}

 if (strncmp(“Q“buf1) == 0) //接收服务器下线通知
{
printf(“\033[22;30m%s“ buf+1); //输出黑色文字系统消息
kill(getppid() SIGUSR2);
kill(getpid() SIGUSR2);

}
else if (strncmp(“A“buf1) == 0)
{
printf(“\033[22;96m%s“ buf+1); //输出灰色文字系统消息
}
else if (strncmp(“P“buf1) == 0)
{
printf(“\033[22;31m%s“ buf+1); //输出红色文字系统消息
}
else if (strncmp(“R“buf1) == 0)
{
if (strncmp(buf+1 name strlen(name)) == 0)
{
sprintf(buf_temp “我%s“ buf + strlen(name)+1);
printf(“\033[22;32m%s“ buf_temp);//输出黄色文字自己的消息
}
else
printf(“\033[22;33m[收到消息@]%s“ buf+1); //输出绿色文字
}
printf(“\033[22;30m“);//恢复黑色
}
}
//////////////////////////////////////////////////////主进程////////////////////////////////////
pause(); //等待SIGUSR1
int quit_flag = 0;
getchar();//清空输入名字时残存的回车符因为ProcessLogin使用scanf
while (1)//父进程
{
memset(buf‘\0‘BUFFERSIZE);//必须清空否则会有虚假数据
memset(buf_temp‘\0‘BUFFERSIZE);
fgets(buf_tempBUFFERSIZEstdin); //采用fgets比采用scanf好,聊天时可以键入空格
buf_temp[strlen(buf_temp)-1]=‘\0‘;
if (strncmp(“quit“ buf_temp 4) == 0) //退出
{
sprintf(buf “Q%s“ name);
quit_flag = 1;
}
//键入$开头为悄悄话
else if (strncmp(“$“ buf_temp 1) == 0) //注:发送悄悄话的格式:$对方名称$消息内容
{
char *check=buf_temp+1; //必须对其检查一定要有两个$...$否则造成服务器当机
while(*check!=‘\0‘&&*check!=‘$‘) check++;
if(*check!=‘$‘)
{
printf(“[系统提示]\n发送悄悄话格式:$对方名称$消息内容\n<请输入>\n“);
continue;
}


sprintf(buf “P%s%s“ namebuf_temp);
}
else //群发消息
{
sprintf(buf “C%s说:%s“ name buf_temp);
}
//开始发送消息
if (sendto(socket_fd buf sizeo

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7173  2011-08-29 08:39  ChartRoom\server.c

     文件      12424  2011-08-28 11:48  ChartRoom\server

     文件       5427  2011-08-29 08:39  ChartRoom\client.c

     文件      12606  2011-08-28 11:48  ChartRoom\client

     文件        561  2011-08-29 08:37  ChartRoom\program_statement.txt

     文件        448  2011-08-29 08:38  ChartRoom\header.h

     目录          0  2011-08-29 08:31  ChartRoom

----------- ---------  ---------- -----  ----

                38639                    7


评论

共有 条评论