资源简介
--------------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语言解释器
相关资源
- LINUX下命令行界面的C语言细胞游戏
- 尚观培训linux许巍老师关于c语言的课
- 《Linux程序设计》第四版pdf高清电子版
- linux 0.11内核代码
- linux ac108多麦方案驱动(ac108.c)
- 共享内存 读写
- 简易web服务器的设计与实现
- 《LINUX C编程从初学到精通》光盘源码
- Linux那些事儿之我是USB core
- libnet发送udp和tcp包
- Qt TCP聊天室demo
- Linux c语言 学生成绩管理系统
- Linux开发工具手册
- MFC UDP编程
- Linux操作系统下C语言编程从零开始
- 基于Linux下C语言开发的员工管理系统
- 超级玛丽c++源码win32Linux平台
- UNIX/LINUX下C语言中文短信UCS2编码和解
- 嵌入式工程师必知必会 (完整高清中
- linux-2.6.24.rar
- MFC多人聊天室
- 使用socket套接字发送udp数据包
- Linux下C语言操作静态ARP表,包括增加
- Windows+C语言构建网络聊天室内含源程
- c语言 linux 贪吃蛇.doc
- Linux多线程服务端编程:使用muduo C+
- C语言实现TCP/IP协议通信和UDP协议通信
- libstdc++.so.6.0.23_linux7
- MFC聊天室含源代码.rar
- libstdc++-devel-4.1.2-48.el5.x86_64
评论
共有 条评论