栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

(纯纯的干货!!!)socket通信中实现显示屏处理数据

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(纯纯的干货!!!)socket通信中实现显示屏处理数据

(纯纯的干货!!!)socket通信中如何实现显示屏操作

一. 实现: 利用消息队列的读操作作为socket通信的显示屏
技术:消息队列以及socket进程通信(socket此处不讲解)

下列代码属于一份独立文件(可生成可执行文件)
消息队列的读(就是显示屏)

//!< 显示屏


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFFER_SIZE 1024
//!< 定义一个消息队列数据的结构体
struct StrMessage{
    long type;	//!< 这个就是类型的问题(想了解的话自行百度)
    char SZMsgBuf[BUFFER_SIZE]; //!< 进行写操作的时候会把数据写到SZMsgBuf中去
};
struct StrMessage strMsg;
int main(int argc, char * argv [ ])
{
	int msgid, run = 1;
	int iKey = atoi(argv[1]); //!< argv[1] 代表:例如:./xxx xxx(键值)
	signal(SIGQUIT,signalSIGQUIT);
	if((msgid = msgget((key_t)iKey, 0666 | IPC_CREAT)) < 0)
	{
		perror("msgget");
		exit(-1);
	}
	while(msgrcv(msgid, (void *)&strMsg, BUFFER_SIZE, 0, 0))
	{	
		//!< 这循环里面做服务器传过来的数据处理
	}

	if(msgctl(msgid, IPC_RMID, 0) < 0)
	{
		perror("msgctl");
		exit(-1);
	}
	return 0;
}

运行方式:
错误格式:

正确方式:

最重要的部分(写部分)

那么问题来了,两个客户端和一个服务器时,客户端要进行通信,服务器转发数据,怎么来服务器转发过来的数据让它在显示屏上打印出来了呢,要怎么实现呢?

解决上述问题:

#define BUFF_SIZE 1024
//!< 消息队列 写操作
void shm_And_MsgInit(char* v_iKey);
void displayContent(char* v_pContent);
//!< 将消息队列的标识号定义程全局变量
//!< 消息队列Id
int iMsgId = 0;
//!< 消息队列结构体
struct StrMessage{
    long type;
    char SZMsgBuf[BUFF_SIZE];
};
struct StrMessage strMsg;

//!< 消息队列的创建
void shm_And_MsgInit(char* v_iKey)
{
	int ikey = atoi(v_iKey);
	if((iMsgId = msgget((key_t)ikey, 0666 | IPC_CREAT)) < 0)
	{
		perror("msgget");
		exit(-1);
	}
}
//!< 消息队列显示处理
//!< 为了减少代码的重复性,我将消息队列封装成一个函数,有用到的时候即可调用,可以大大减少重复性,代码更加简洁

void displayContent(char* v_pContent)
{
	strcpy(strMsg.SZMsgBuf,v_pContent);
	strMsg.type = 1;
	if(msgsnd(iMsgId, (void*)&strMsg, strlen(strMsg.SZMsgBuf)+1, 0)<0)
	{
		perror("msgsnd failn");
		exit(-1);
	}
	memset(strMsg.SZMsgBuf,0,BUFF_SIZE);
}


int main(int argc,char* argv[])
{
	//!< 消息队列的初始化
	shm_And_MsgInit(argv[1]);
	
	if(msgctl(iMsgId, IPC_RMID, 0) < 0)
	{
		perror("msgctl");
		exit(-1);
	}
	return 0;
}


那么问题又来了,要怎么调用函数呢?
在通信的过程中肯定是有recv();send();或者write(),read()的库函数的,在客户端的代码中,只要接收到服务器转发过来的数据想要打印在显示屏上的话,在recv()或者read()的下一行写上displayContent(char* v_pContent);
char* v_pContent:代表的是:数据;

运行方式:与显示读的方式一样

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/299572.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号