#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include "client.h"
BSP_INT32 g_fdClient = 0;
BSP_INT32 g_CmdRunResult;
BSP_INT32 BSP_GetClientFd(void)
{
return g_fdClient;
}
void BSP_clientClose(void)
{
#define BUF_LEN_TEMP 128
BSP_INT8 buf[BUF_LEN_TEMP] = {0};
snprintf(buf, BUF_LEN_TEMP, "rm -f %s%d", BSP_ADDR_CLIENT, getpid());
if (g_fdClient > 0) {
close(g_fdClient);
g_fdClient = 0;
// BSP_SYSTEM(buf);
}
}
BSP_INT32 BSP_SetSocketOpt(BSP_INT32 socketFd, BSP_UINT32 timeOutSec)
{
struct timeval timeout;
BSP_INT32 timeOut = 0;
socklen_t optLen = sizeof(timeOut);
if (getsockopt(socketFd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, &optLen) < 0) {
libBspPrintf("Get socket opt Faill, Err:%s\n", strerror(errno));
return BSP_ERROR;
}
if (timeOutSec != timeOut) {
timeout.tv_sec = timeOutSec;
timeout.tv_usec = 0;
if (setsockopt(socketFd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) {
libBspPrintf("setsockopt Fail, Err:%s\n", strerror(errno));
return BSP_ERROR;
}
if (setsockopt(socketFd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0) {
libBspPrintf("setsockopt Fail, Err:%s\n", strerror(errno));
return BSP_ERROR;
}
}
return BSP_SUCCESS;
}
BSP_INT32 BSP_cMsgSend(BSP_SOCKETDATA_S *pstSockData)
{
BSP_UINT32 ulAddrLen = 0;
struct sockaddr_un stServerAddr = {
.sun_family = AF_UNIX, .sun_path = {BSP_ADDR_SERVER}
};
if ((pstSockData == NULL) || (BSP_GetClientFd() == 0)) {
libBspPrintf("pstSockData or Client is not Init \n");
return BSP_ERROR;
}
ulAddrLen = offsetof(struct sockaddr_un, sun_path) + strlen(stServerAddr.sun_path);
if (sendto(BSP_GetClientFd(), pstSockData, sizeof(BSP_SOCKETDATA_S), 0, (struct sockaddr *)&stServerAddr,
ulAddrLen) < 0) {
libBspPrintf("Bsp Snd Msg err: %s\n", strerror(errno));
return BSP_ERROR;
}
return BSP_SUCCESS;
}
BSP_INT32 BSP_cMsgRecv(BSP_SOCKETDATA_S *pstSockData, BSP_UINT32 cmdId)
{
BSP_UINT32 ulAddrLen = 0;
BSP_INT32 recvBytes = 0;
struct sockaddr_un stServerAddr = {
.sun_family = AF_UNIX, .sun_path = {BSP_ADDR_SERVER}
};
if ((pstSockData == NULL) || (BSP_GetClientFd() == 0)) {
libBspPrintf("pstSockData or Client is not Init \n");
return BSP_ERROR;
}
memset(pstSockData, 0, sizeof(BSP_SOCKETDATA_S));
ulAddrLen = sizeof(stServerAddr);
do {
recvBytes = recvfrom(BSP_GetClientFd(), pstSockData, sizeof(BSP_SOCKETDATA_S), 0, (struct sockaddr *)&stServerAddr,
&ulAddrLen);
if ((recvBytes < 0) && (errno == EWOULDBLOCK)) {
libBspPrintf("Recv Bsp Msg time out!\n");
return BSP_ERROR;
}
} while (pstSockData->eBspCmdId != cmdId);
if (pstSockData->dataBuf.rspBuf.cmdRunResult == BSP_SUCCESS) {
g_CmdRunResult = BSP_TRUE;
} else {
g_CmdRunResult = BSP_FALSE;
}
return BSP_SUCCESS;
}
BSP_INT32 BSP_clientTest(void)
{
BSP_SOCKETDATA_S stSockData = {0};
BSP_UINT8 aucClient[SOCK_REQ_BUF_LEN_U8_MAX - 8] = {"Hello, This is client request"};
stSockData.eBspCmdId = 5;
stSockData.ulDataLength = 100;
memcpy(stSockData.dataBuf.reqBuf.buf.u8Buf + 8, aucClient, SOCK_REQ_BUF_LEN_U8_MAX - 8);
stSockData.dataBuf.rspBuf.buf.u32Buf[0] = (BSP_UINT32)getpid();
if (BSP_cMsgSend(&stSockData) != BSP_SUCCESS) {
libBspPrintf("BSP_cMsgSend Fail \n");
return BSP_ERROR;
}
if (BSP_cMsgRecv(&stSockData, stSockData.eBspCmdId) != BSP_SUCCESS) {
libBspPrintf("BSP_cMsgRecv Fail \n");
return BSP_ERROR;
}
libBspPrintf("Client (pid: %d) Recv %s: From Server \n", getpid(), stSockData.dataBuf.reqBuf.buf.u8Buf + 8);
if (stSockData.dataBuf.rspBuf.buf.u32Buf[0] == getpid()) {
libBspPrintf("CMD line msg to server test Succ!!!\n");
return BSP_SUCCESS;
} else {
libBspPrintf("pid(%u) From msg is not Mine (%u)\n", stSockData.dataBuf.rspBuf.buf.u8Buf[0], getpid());
return BSP_ERROR;
}
}
BSP_INT32 BSP_clientInit(BSP_UINT32 timeOutSec)
{
BSP_INT32 lFdClient = 0;
BSP_UINT32 ulAddrLen = 0;
struct sockaddr_un stClientAddr = {
.sun_family = AF_UNIX,
};
lFdClient = BSP_GetClientFd();
if (lFdClient > 0) {
if (BSP_SetSocketOpt(lFdClient, timeOutSec) < 0) {
libBspPrintf("setsockopt Fail, Err:%s\n", strerror(errno));
goto __EXIT;
}
return BSP_SUCCESS;
}
lFdClient = socket(AF_UNIX, SOCK_DGRAM, 0);
if (lFdClient < 0) {
libBspPrintf("socket Fail, Err:%s\n", strerror(errno));
return BSP_ERROR;
}
sprintf(stClientAddr.sun_path, "%s%d", BSP_ADDR_CLIENT, getpid());
ulAddrLen = offsetof(struct sockaddr_un, sun_path) + strlen(stClientAddr.sun_path);
unlink(stClientAddr.sun_path);
if (bind(lFdClient, (struct sockaddr *)&stClientAddr, ulAddrLen) < 0) {
libBspPrintf("bind Fail, Err:%s\n", strerror(errno));
goto __EXIT;
}
if (BSP_SetSocketOpt(lFdClient, timeOutSec) < 0) {
libBspPrintf("setsockopt Fail, Err:%s\n", strerror(errno));
goto __EXIT;
}
g_fdClient = lFdClient;
return BSP_SUCCESS;
__EXIT:
close(lFdClient);
libBspPrintf("Init Fail, exit\n");
g_fdClient = 0;
return BSP_ERROR;
}
BSP_INT32 BSP_ClientSndAndRcvMsg(BSP_UINT32 timeOutSec, BSP_SOCKETDATA_S *pstSockData)
{
BSP_UINT32 timeOut = timeOutSec == 0 ? SOCKET_CLIENT_TIME_OUT_SEC : timeOutSec;
if (BSP_clientInit(timeOut) != BSP_SUCCESS) {
libBspPrintf("BSP Client Init Fail\n");
return BSP_ERROR;
}
if (pstSockData == NULL) {
printf("Input para is NULL, please Check\n");
return BSP_ERROR;
}
if (BSP_cMsgSend(pstSockData) != BSP_SUCCESS) {
libBspPrintf("BSP_cMsgSend FAIL\n");
return BSP_ERROR;
}
if (BSP_cMsgRecv(pstSockData, pstSockData->eBspCmdId) != BSP_SUCCESS) {
libBspPrintf("BSP_cMsgRecv Fail \n");
return BSP_ERROR;
}
if (g_CmdRunResult == BSP_TRUE) {
return BSP_SUCCESS;
} else {
return BSP_ERROR;
}
}
int main()
{
BSP_clientInit(0);
return BSP_clientTest();
}
平台提供接口框架 socet-server-client
需积分: 5 137 浏览量
2021-11-20
17:25:09
上传
评论
收藏 6KB RAR 举报
kidd_cj
- 粉丝: 18
- 资源: 9
最新资源
- 堆排序(Heap Sort)是一种基于比较的排序算法
- ebatis 是一个简单方便上手的声明式 Elasticsearch ORM 框架
- 威纶通触摸屏编程软件Easy builder pro V6.09.02安装包(2024.06).txt
- ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端
- html css js网页制作实例 dldtdd实现列表功能
- 用python制作的tts语音小工具
- 三菱PLC编程参考手册
- 吃豆人代码源码全套.cpp
- 快速了解学习「编译原理」都需要掌握哪些基础知识.pdf
- Verilog示例代码,以SMIC 12nm工艺库为例给出Tessent TCL脚本示例
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0