- 论坛徽章:
- 0
|
本帖最后由 lcq6075217 于 2013-09-24 09:16 编辑
就是如何从系统内存中按每个报文定义的长度截取一次一次读取,然后放到unsigned char recvBuffer[RECV_DATA_BUF_LEN];//接收缓存
unsigned char recvBuffer[RECV_DATA_BUF_LEN];
这种定义缓存最大能定义多少???
int L2ServiceRecvData(socket_t tsocket)//L2服务器接收数据
{
int ret = 0;
int recvDataLen = 0;
int sendDataLen = 0;
long mesLen = 0;
int flag = 0;
int totalLen = 0;
unsigned char recvBuffer[RECV_DATA_BUF_LEN];//接收缓存
unsigned char sendBuffer[SEND_DATA_BUF_LEN];//发送缓存
char messageLEN[MESSAGE_LEN + 1];//message Length
char messageID[MESSAGE_ID + 1];//message id
char messageID1[MESSAGE_ID1 + 1];//message id1
char messageData1[MESSAGE_DATA_BUF + 1];//message id
memset(messageID, 0, MESSAGE_ID + 1);
memset(messageLEN, 0, MESSAGE_LEN + 1);
memset(messageData1, 0, MESSAGE_DATA_BUF + 1);
memset(messageID1, 0, MESSAGE_ID1 + 1);
memset(recvBuffer, 0, RECV_DATA_BUF_LEN);
memset(sendBuffer, 0, SEND_DATA_BUF_LEN);
ret = recvDataFromL2Term(tsocket, recvBuffer, &recvDataLen);
if ( 0 == ret) //接收数据成功
{
while(totalLen < strlen(recvBuffer))
{
flag = flag + 1;
if (flag > 10)
{
etsDebug(0,"aaaaaaaa111111111111111111%d",flag);
break;
}
char messageData[MESSAGE_DATA_BUF + 1];
memset(messageData, 0, MESSAGE_DATA_BUF + 1);
etsDebug(0, "wwwwww3333333333333 messageData=[%s]", recvBuffer);
strncpy(messageID, recvBuffer+totalLen+FLAG_LAN, MESSAGE_ID);
strncpy(messageLEN, recvBuffer+totalLen, MESSAGE_LEN);
mesLen = atoi(messageLEN);
if (mesLen > 2000)
{
etsDebug(0,"aaaaaaaa99999999999999999%d",1);
break;
}
memcpy(messageData, recvBuffer+totalLen, mesLen);
totalLen = totalLen + mesLen;
etsDebug(0, "aaaaaa3333333333333 totalLen=[%d] mesLen=[%d] messageData=[%s]", totalLen, mesLen, messageData);
//报文处理, 调用数据库等操作 (用户完成)
etsDebug(0, "接收到端口内容2 messageID=[%s]", messageID);
if ( dealL2toMESMessage(messageID,messageData) == -1) //添加从新连接数据库操作
{
etsDebug(0, "查询数据库错误%d", 1);
closeDB();//断开数据库连接
return;
}
}
}
else if ( -2 == ret) //对方关闭了连接, 清楚socket列表
{
delL2INFO(g_pL2ClientInfo, tsocket); //清楚socket列表
closeSocket(tsocket);
return tsocket;
}
return 0;
}
int recvDataFromL2Term(socket_t tsocket, char *dataBuf, int *datalen)//接收回执信息
{
fd_set rdset;
struct timeval tv;
int dLen = 0;
int ret = 0;
int bufferSize = 0;//接收数据的大小
tv.tv_sec = 2;
tv.tv_usec = 0;
FD_ZERO(&rdset);
FD_SET(tsocket, &rdset);
ret = selectSocket(tsocket + 1, &rdset, NULL, NULL, &tv);
if ( -1 == ret)
{
if ( errno == EINTR)//系统中断
{
return -1;
}
else //其它错误
{
return -1;
}
}
else if ( 0 == ret) //超时
{
return -1;
}
//接收数据
if ( FD_ISSET(tsocket, &rdset) )
{
dLen = recvData(tsocket, dataBuf + bufferSize, RECV_DATA_BUF_LEN - bufferSize, 0);
if ( dLen > 0)
{
bufferSize += dLen;
}
else if (dLen == 0) //对方关闭了连接, 接收的连接如果长度为0, 则对方关闭的连接
{
return -2;
}
else if (dLen < 0) //对方关闭了连接
{
return -2;
}
}
else
{
etsDebug(0, "接收数据 FD_ISSET=[%d] ", -1);
return -1;
}
*datalen = bufferSize;
return 0;
}
int recvData(socket_t tsocket, char * pRecvBuf, int nBufLen, int flags)//接受数据
{
int nRecvLen = 0;
if(tsocket > 0)
{
nRecvLen = recv(tsocket, pRecvBuf, nBufLen, flags);
}
return nRecvLen;
}
程序所涉及到的几段代码
我想实现从 “缓冲区”中直接读取对方发送过来的的信息(都是以字符串的形式发送地),因为有好多报文在一起,只能按报文定义长度来截取,是不是读取一次缓冲区内信息就会自动减少。
第一段程序是写到变量中,再从变量中读取,如何实现直接从缓冲区中读取,一直不知道怎么写。
如果发送太快存在接收时多个报文合在一起
定义好表头 但我这种写法有的时候度过来以后却没有表头了
|
|