搜索
bottom↓
回复: 3

请教一下RTT的网络功能

[复制链接]

出0入0汤圆

发表于 2011-2-23 12:43:19 | 显示全部楼层 |阅读模式
udp (169.254.100.188, 8308) <-- (169.254.100.18, 1399)
pcb (0.0.0.0, 8308) --- (0.0.0.0, 0)
udp_input: calculating checksum
tcp_slowtmr: processing active pcb
udp_input: received datagram of length 16
UDP header:
+-------------------------------+
|      1399     |      8308     | (src port, dest port)
+-------------------------------+
|        16     |     0x21eb    | (len, chksum)
+-------------------------------+
udp (169.254.100.188, 8308) <-- (169.254.100.18, 1399)
pcb (0.0.0.0, 8308) --- (0.0.0.0, 0)
udp_input: calculating checksum
tcp_slowtmr: processing active pcb
udp_input: received datagram of length 16
UDP header:
+-------------------------------+
|      1399     |      8308     | (src port, dest port)
+-------------------------------+
|        16     |     0x21eb    | (len, chksum)
+-------------------------------+
udp (169.254.100.188, 8308) <-- (169.254.100.18, 1399)   
pcb (0.0.0.0, 8308) --- (0.0.0.0, 0)
udp_input: calculating checksum
tcp_slowtmr: processing active pcb           《----------这里收不到网络数据了。。有谁出现过这问题的吗
tcp_slowtmr: polling application
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: polling application
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: processing active pcb
tcp_slowtmr: polling application

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-2-23 19:48:12 | 显示全部楼层
不太看得懂你的过程,你有用wiresharp在以太网上抓个包看看吗?

出0入0汤圆

 楼主| 发表于 2011-2-23 21:22:18 | 显示全部楼层
是这样的。系统启动后就开了一个线程做UDP服务器开始是正常的数据收发速度快时就会出现发不到数据之后都会不行,网络抓包都没抓到它发出来的数据。

出0入0汤圆

 楼主| 发表于 2011-2-24 13:38:53 | 显示全部楼层
void start_udpserv(void* paramemter)
{
   int ret;
   int udpsock;               
   int bytes_read;       
   unsigned int timeout;
   char *recv_data;
   unsigned char send_bytes;
   struct sockaddr_in server_addr, client_addr;
   rt_uint32_t addr_len;
   fd_set readset;
   timeout=1;
   /* 分配接收用的数据缓冲 */
   recv_data = rt_malloc(1024);
   if (recv_data == RT_NULL)
   {
       /* 分配内存失败,返回 */
       rt_kprintf("No memory\n");
       return;
   }

   /* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */
   if ((udpsock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
   {
       rt_kprintf("Socket error\n");

       /* 释放接收用的数据缓冲 */
       rt_free(recv_data);
       return;
   }
   lwip_setsockopt(udpsock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
   /* 初始化服务端地址 */
   server_addr.sin_family = AF_INET;
   server_addr.sin_port = htons(PARA.PORT);
   server_addr.sin_addr.s_addr = INADDR_ANY;
   rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));

   /* 绑定socket到服务端地址 */
   if (bind(udpsock,(struct sockaddr *)&server_addr,
            sizeof(struct sockaddr)) == -1)
   {
       /* 绑定地址失败 */
       rt_kprintf("Bind error\n");

       /* 释放接收用的数据缓冲 */
       rt_free(recv_data);
       return;
   }

   rt_kprintf("UDPServer Waiting for client on port %d...\n",PARA.PORT);

   while (true)
   {
       addr_len = sizeof(struct sockaddr);      
           FD_ZERO(&readset);
       FD_SET(udpsock, &readset);

           if( lwip_select(udpsock+1, &readset, 0, 0, 0) == 0 )
                continue;
        rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);

       /* 从sock中收取最大1024字节数据 */
       bytes_read = recvfrom(udpsock, recv_data, 1024, 0,
                             (struct sockaddr *)&client_addr, &addr_len);
       /* UDP不同于TCP,它基本不会出现收取的数据失败的情况,除非设置了超时等待 */
           rt_mutex_release(&setup_data_buf_mutex);
//           rt_kprintf("udp server timeout!\n");
          
//          
           if(bytes_read>0)
           {
                      IWDG_ReloadCounter();
               recv_data[bytes_read] = '\0'; /* 把末端清零 */
                   if(PARA.LED_Mode ==2)
                   {
                                LED_Ctr(1);
                   }
                   rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);
                   send_bytes = eth_data_handle(recv_data,bytes_read,SendBuffer);        //数据处理
                   rt_mutex_release(&setup_data_buf_mutex);
                   if(send_bytes>=5)
                   {
//                       client_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
               rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);
                   sendto(udpsock, SendBuffer, send_bytes, 0,(struct sockaddr *)&client_addr, sizeof(struct sockaddr));
                   rt_mutex_release(&setup_data_buf_mutex);
        //                   rt_kprintf("send data %s: ",SendBuffer);
//                   rt_thread_delay(1);
                   }
               /* 输出接收的数据 */
                   if(PARA.LED_Mode ==2)
                   {
                                LED_Ctr(0);
                   }
           }
//           rt_thread_delay(1);
   }
   lwip_close(udpsock);

   /* 释放接收用的数据缓冲 */
   rt_free(recv_data);
   rt_kprintf("udp server error!\n");

   return;
}

把例程改为这样子。eth_data_handle(recv_data,bytes_read,SendBuffer);        //数据处理
这函数是数据处理的
这样有什么问题吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 14:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表