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

(纯纯的干货!!!)socket通信中如何实现显示屏操作 【(纯纯的干货!!!)socket通信中实现显示屏处理数据】一. 实现: 利用消息队列的读操作作为socket通信的显示屏
技术:消息队列以及socket进程通信(socket此处不讲解)
下列代码属于一份独立文件(可生成可执行文件)
消息队列的读(就是显示屏)

//!< 显示屏 /*********************************** 摘 要: 服务器功能: 显示信息 完成日期:2021年10月3日 ************************************/#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; }

运行方式:
错误格式:
(纯纯的干货!!!)socket通信中实现显示屏处理数据
文章图片

正确方式:
(纯纯的干货!!!)socket通信中实现显示屏处理数据
文章图片

最重要的部分(写部分) 那么问题来了,两个客户端和一个服务器时,客户端要进行通信,服务器转发数据,怎么来服务器转发过来的数据让它在显示屏上打印出来了呢,要怎么实现呢?
解决上述问题:
#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:代表的是:数据;
运行方式:与显示读的方式一样

    推荐阅读