资源简介
--------------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
- 上一篇:MFC折叠和展开窗口实现方法.txt
- 下一篇:xrc C语言解释器
相关资源
- 基于qt的聊天室软件.rar
- vc网络聊天室源代码mfc聊天器VC网络编
- C语言实现Linux文件系统模拟文档内有
- linux下alsa架构采集声音成wav格式播放
- Linux软件工程师(C语言)实用教程_
- C C++ Linux多线程文件程序
- 模拟战争游戏
- c语言直接读写xls文件,无需安装off
- OSPF基于C语言的算法实现
- C语言版本Linux环境下MD5加密函数
- Linux下串口通讯程序C++源代码
- libudt - UDT 传输库 linux c 接口封装
- C++教程网Linux网络编程视频教程
- 基于C语言的linux远程终端管理系统
- 多线程产生Fibonacci序列
- LINUX C++下多个Makefile编写方法
- 广播通信设计
- linux下C语言实现FTP上传文件源码200行
- linux操作系统下C++封装的基础库
- Linux下Shell命令解释步骤程序实现
- 基于socket和opencv在linux中实现摄像头实
- linux下C语言从N模数、E公钥指数、D私
- linux c++ 获取目录下所有文件
- Linux qtcreator下kafka之librdkafka库的C++语
- Linux下用C语言实现ls命令
-
c语言解析xm
l格式代码。 - 计算机网络课程设计多人聊天室
- C语言伪造TCP、UDP数据包.zip
- linux下可用的静态ImageMagick C库
- libstdc++.so.6.0.17和libstdc++.so.6.0.19以及
评论
共有 条评论