Chinaunix

标题: 一个报文通讯关于从缓冲区读数的问题(刚开始学习) [打印本页]

作者: lcq6075217    时间: 2013-09-24 08:17
标题: 一个报文通讯关于从缓冲区读数的问题(刚开始学习)
本帖最后由 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;
}


程序所涉及到的几段代码
我想实现从 “缓冲区”中直接读取对方发送过来的的信息(都是以字符串的形式发送地),因为有好多报文在一起,只能按报文定义长度来截取,是不是读取一次缓冲区内信息就会自动减少。
第一段程序是写到变量中,再从变量中读取,如何实现直接从缓冲区中读取,一直不知道怎么写。

如果发送太快存在接收时多个报文合在一起
定义好表头 但我这种写法有的时候度过来以后却没有表头了




作者: linux_c_py_php    时间: 2013-09-24 11:25
网络收发最好用变长buffer, 定长buffer对网络容忍度太低了.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2