`
yan0063
  • 浏览: 25734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条件编译 消息队列 实现的聊天程序

 
阅读更多
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct _msg
{
	long mtype;
	char mtext[50];
	char sender[30];
}MSG;


#ifdef CC
char sender[]="CC";
#endif

#ifdef MY
char sender[]="MY";
#endif

#ifdef CCMY
char sender[]="CCMY";
#endif

int main(int argc, char *argv[])
{
	key_t key;
	int msgqid;
	MSG msg;

	key = ftok(".",2012);//以文件路径 跟一个整数值(只取低四位) 来生成一个key 两边要相同
	msgqid = msgget(key,IPC_CREAT); //消息队列id  用key跟创建方式生成 
	if(msgqid == -1)
	{
		perror("msgget");
		exit(-1);
	}

#ifdef CC
	printf("hello, I am CC!\n");
#endif
	
#ifdef MY
	printf("hello, I am MY!\n");
#endif
	
#ifdef CCMY
	printf("hello, I am CCMY!\n");
#endif
	
	pid_t pid;
	
	pid = fork();
	if(pid==0)
	{
		while(1)//接受用户输入 往消息队列里写
		{
			char bufw[256] = "";
			
			printf("%s:", sender);
			fflush(stdout);
			bzero(bufw, sizeof(bufw));
			if(fgets(bufw, sizeof(bufw), stdin) == NULL)
				exit(-1);
			bufw[strlen(bufw)-1] = '\0';
			if(bufw[0]=='C')//判断输入的首字母 标示
				msg.mtype = 8;
			else if(bufw[0]=='M')
				msg.mtype = 9;
			else
				msg.mtype = 10;
			
		//	printf("----------1-------------\n");
			
		//	printf("bufw[0] is %c ,msg.mtype is %d bufw+2 is %s \n",bufw[0],msg.mtype,bufw+2);
			strcpy(msg.mtext,bufw+2);//后移两位开始才是真正的发送内容
			strcpy(msg.sender,sender);
	
			msgsnd(msgqid,&msg,(sizeof(msg.mtext)+sizeof(msg.sender)),0);
			
			
		}
	}
	else
	{
		while(1)//从消息队列里读
		{
			char bufr[256] = "";

		//	long recno = 0;//接收号   CC8 MY9 CCMY10
			
		
			#ifdef CC
			long	recno = 8;
			#endif
				
			#ifdef MY
			long	recno = 9;
			#endif
				
			#ifdef CCMY
			long	recno = 10;
			#endif
			

		//	printf("recno is %d \n",recno);
			int retu;
			retu = msgrcv(msgqid,&msg,(sizeof(msg.mtext)+sizeof(msg.sender)),recno,0);//参数含义
			//消息队列id   消息结构体指针  传递数据大小(已去除long mtype长度 如有多个 如有多个sizeof+sizeof。。。) 消息id 
			//最后一个0  对于读来说:如果队列为空 堵塞等待 直到有数据可读  
			//           对于写来说:如果队列已满 堵塞等待 直到有空间可写
		//	if(retu>0)
			printf("\rmessage from %s: msg.mtext = %s \n",msg.sender,msg.mtext);
		//	msgctl(msgqid,IPC_RMID,NULL);//删除队列
			printf("%s:", sender);
			fflush(stdout);
		}
	}
	return 0;
}



all: 
	gcc threechat.c -o cc -DCC
	gcc threechat.c -o my -DMY
	gcc threechat.c -o ccmy -DCCMY
clean:
	rm cc my ccmy -f
 

 

分享到:
评论

相关推荐

    【得推交友系统 v3.0】针对陌生人的交友IM+即时聊天+群聊私聊+支持H5小程序APP.zip

    即时聊天 私聊 群聊 好友系统 礼物系统 直播系统 缘分匹配 金币系统 后端安装说明: 1.删除config/install.lock 输入程序所在网址即可自动安装 2.php需要开启https支持 3.安装完成 删除install.lock 前端安装编译...

    [原创]FavChat爱聊全能隐蔽穿透型聊天平台完整源码源程序包(Hedda)

    ■ 考虑FavChat实际工作中的计算机因素和网络延迟,平台充分地利用线程并发运作和多阶段队列缓冲机制,保证事务处理的顺畅和聊天过程中最重要的全双工能力的完美实现。(参考附件流程图) ■ 语音部分则使用...

    微社区交友系统源码 即时聊天系统源码 陌生人交友系统源码支持H5 小程序 APP.zip

    微社区动态 即时聊天 私聊 群聊 好友系统 礼物系统 直播系统 缘分匹配 金币系统 后端安装说明: 1.删除config/install.lock 输入程序所在网址即可自动安装 2.php需要开启https支持 3.安装完成 删除install.lock ...

    功能完整的键盘全记录密码盗取发送程序

    mazi的例程而完成,StartEXE目录中为安装主程序,主程序编译时会把钩子链接库文件打包进来,运行时会把安还原到系统中,然后在系统中安装一个WH_GETMESSAGE钩子调用,然后在系统中当任何一个进程从消息队列取消息而且调用...

    VC学习大纲 VC学习讲义

    如何利用命名互斥保证只有一份程序实例被运行,结合多线程,网络编程,自定义消息,数据类型转换,如何改变文本框对回车的默认处理方式等技术编写网络聊天程序。 第十八课: 动态连接库程序的编写,库函数的两种输出...

    rm_telnet_chat:Telnet聊天服务器

    Telnet聊天应用程序 前段时间要求我制作一个演示应用程序,该应用程序利用网络select()函数来处理单个线程上的许多网络连接。 我提供了一个单线程的telnet聊天服务器。 此实现应在Windows&gt; 5.0(Windows 2000)的...

    C#.NET网络编程.part1

    gui程序的编写和编译运行 4.4 基于udp协议的网络会话实例 4.4.1 ...实现 4.6.1 qtcpserversession类 4.6.2 qtcpserver类 4.6.3 聊天协议 4.6.4 qchatserver类 4.6.5 qchatclient类 4.6.6 ...

    陌生人交友IM即时聊天系统-得推交友系统v3.4源码

    微社区动态 即时聊天 私聊 群聊 好友系统 礼物系统 直播系统 缘分匹配 金币系统 后端安装说明: 1.删除config/install.lock 输入程序所在网址即可自动安装 2.php需要开启https支持 3.安装完成 删除install.lock ...

    社区交友源码 支持聊天私聊-礼物系统-直播系统-缘分匹配+搭建教程.zip

    功能:社区动态,即时聊天,私聊,好友系统,礼物系统,直播系统,缘分匹配,金币系统,增加缘分匹配功能,增加金币市场功能,增加视频直播功能,增加上传文件统一管理,后台增加计划任务,增加队列任务,增加支持...

    社区交友源码支持聊天私聊-礼物系统–直播系统–缘分匹配+搭建教程

    即时聊天 私聊 群聊 好友系统 礼物系统 直播系统 缘分匹配 金币系统 V3.0更新阐明 增加缘分匹配功用 增加金币市场功用 增加视频直播功用 增加上传文件统一管理 后台增加方案任务 增加队列任务 增加...

    JAVA上百实例源码以及开源项目源代码

    摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序  Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接...

    JAVA上百实例源码以及开源项目

    摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序  Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,  当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接...

    伊甸交友系统 v3.0.rar

    伊甸交友系统一款针对陌生人的交友IM,支持H5\小程序\APP; 功能: 微社区动态 即时聊天 私聊 群聊 好友系统 礼物系统 直播系统 缘分匹配 金币系统 V3.0功能说明 增加缘分匹配功能 增加金币市场功能 ...

    ASP.NET3.5典型模块开发源代码

    16.1.6 实现两个人聊天的功能 189 16.2 一个功能完善的聊天室 191 16.2.1 设计聊天室的数据库 192 16.2.2 更改数据存储方式 192 16.2.3 用户注册模块 194 16.2.4 用户登录模块 194 16.2.5 登录配置信息...

    C++Builder 6.0设计师之路 pdf版

    通过本书的学习,读者可以高效的利用c++ builder开发应用程序,能够理解关键操作的内部实现机制,有助于迅速利用c++ builder来实现大量的编程任务,成为一个成功的设计师。 本书适用于大中专院校学生、程序设计人员...

    Workerman:一个异步事件驱动的 PHP 套接字框架-开源

    支持高并发、超高稳定性,广泛应用于手机APP、移动通信、微信小程序、手游服务器、网络游戏、PHP聊天室、硬件通信、智能家居、车联网、物联网等领域发展。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义...

    Java开发技术大全 电子版

    14.11.1程序界面的实现543 14.11.2时间的刷新代码544 14.11.3JRadioButton的事件响应代码545 14.11.4“确定”按钮的事件响应代码546 14.11.5“取消”按钮的事件响应代码548 14.11.6完整的程序548 14.12GUI程序...

Global site tag (gtag.js) - Google Analytics