(纯纯的干货!!!)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;
}
运行方式:
错误格式:
文章图片
正确方式:
文章图片
最重要的部分(写部分) 那么问题来了,两个客户端和一个服务器时,客户端要进行通信,服务器转发数据,怎么来服务器转发过来的数据让它在显示屏上打印出来了呢,要怎么实现呢?
解决上述问题:
#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:代表的是:数据;
运行方式:与显示读的方式一样
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量