(纯纯的干货!!!)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通信中实现显示屏处理数据的主要内容,如果未能解决你的问题,请参考以下文章
纯纯的爬虫知识,python scrapy 下载中间件知多少
纯纯的爬虫知识,python scrapy 下载中间件知多少
Happywhale -我的第一次Kaggle Solo经验分享,纯纯的都是经验,初学者友好~