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

Posted 纯情小伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(纯纯的干货!!!)socket通信中实现显示屏处理数据相关的知识,希望对你有一定的参考价值。

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

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

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

//!< 显示屏
/***********************************
摘 要:
服务器功能:
	显示信息
完成日期:2021年10月3日
************************************/

#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

#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 fail\\n");
		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:代表的是:数据;

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

以上是关于(纯纯的干货!!!)socket通信中实现显示屏处理数据的主要内容,如果未能解决你的问题,请参考以下文章

Sketch | 线稿!纯纯的线稿,汽车手绘必备素材70张

纯纯的爬虫知识,python scrapy 下载中间件知多少

纯纯的爬虫知识,python scrapy 下载中间件知多少

Happywhale -我的第一次Kaggle Solo经验分享,纯纯的都是经验,初学者友好~

使用 Native Sockets 在 Android 中实现 WebSockets

#yyds干货盘点# nginx实现动静分离的负载均衡集群配置方法