免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2983 | 回复: 1
打印 上一主题 下一主题

[C] 一个报文通讯关于从缓冲区读数的问题(刚开始学习) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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;
}


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

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



论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-09-24 11:25 |只看该作者
网络收发最好用变长buffer, 定长buffer对网络容忍度太低了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP