expectasion 发表于 2009-2-18 08:52:21

UDP数据接收的问题

大家好!
我用CreateUDPChannelConfig函数,并设置了回调函数UDPReadCallback,然后客户端给我发送数据,每100ms发送4K的数据。在回调函数中有事件UDP_DATAREADY,但是该事件触发的时候我用udpRead函数只能收到几十个字节,虽然后来会不停的触发直到4K都到达,但这样处理起来很困难。想问问大家是什么原因,或者有什么好的解决办法 谢谢啦
。

netcreature 发表于 2009-2-18 09:02:26

因为网络通讯有许多不确定因素,实时性要求很难达到!
最好将程序上传,以便于分析!

expectasion 发表于 2009-2-18 09:12:31

其实很简单只是刚开始写udpread()函数是这样的:
int CVICALLBACKUDPReadCallback (unsigned channel, int eventType, int errCode, void *callbackData)
{
    int             error = 0,
                     size;
    unsigned char   *msg = NULL;
    if (eventType == UDP_DATAREADY)
    {
      // Pass NULL as the input buffer to determine the size of the arrived data.
      size = UDPRead(channel, NULL, 0,UDP_DO_NOT_WAIT , NULL, NULL);
      
      msg = calloc(size ,1);
      
      // Read the waiting message into the allocated buffer.

      size = UDPRead(channel, msg, size ,UDP_DO_NOT_WAIT , NULL, NULL);
if(size<0)
                {
                        return 0;
                }
                else
                {
                        ProcessMsg(msg,size);
                }

    }
    return 0;
}

netcreature 发表于 2009-2-18 09:39:36

因为你调用UDPRead()的参数为:
UDPRead(channel, NULL, 0,UDP_DO_NOT_WAIT , NULL, NULL);
即指定接收缓冲区大小为0,而且,一有数据就读取!这样程序就会反复读取,而且每次读取的数据都不确定!
你必须指定,*msg、size和timeout(不能设为UDP_DO_NOT_WAIT )才行!

expectasion 发表于 2009-2-18 10:15:13

4# netcreature
改了接收字节的大小 并且将延时设置为最大的5秒 得到的size为70多字节
是不是createUDPchannelconfig中回调函数的 触发事件UDP_DATAREADY就有问题?它是不是只要有数据就触发,而不是收完一包才触发?

netcreature 发表于 2009-2-18 11:53:12

UDP_DATAREADY表示每收到一个数据包就触发一次!

expectasion 发表于 2009-2-18 16:33:07

好了具体原因也不是很清楚
我测试环境为 本机 ,用的 网络调试助手 给自己发送的数据。
奇怪的是发送的数据包不同,第一次触发收到的字节数也不同。可能是调试助手的问题。
用别人的机子发送没有影响了、
但确实有最大缓冲的问题,发送的数据包更大的时候还是要考虑 分包 的问题。
netcreature,谢谢allqq-mogudiandian-35all

netcreature 发表于 2009-2-19 08:49:51

呵呵...
应该也不能都说是调试助手的问题吧,它和本机调试环境也有关!
我以前做串口通讯是有本机调试(自发自收)也出现过一些莫名其妙的问题,但在联机调试时却从未再次出现!
页: [1]
查看完整版本: UDP数据接收的问题