搜索
bottom↓
回复: 4

最简单的UDP应用就没玩转,请教高手

[复制链接]

出0入0汤圆

发表于 2011-5-16 23:05:18 | 显示全部楼层 |阅读模式
我就是想往10000端口发一个udp字符串。

出现的问题

1 udp任务可以进去( rt_kprintf("rt_udp_thread_entry entered\n");可以执行),但是udpclient()里面的打印一个也出不来
2 无论我怎么修改udp任务的优先级(比"init"的大或小),总是先调度udp任务(先打印rt_udp_thread_entry entered,后打印TCP/IP initialized!)

请各位高手指教

基本代码
udpclient.c 加了一些打印看执行情况

void udpclient(const char* url, int port, int count)
{
        int x;
        int sock;
        struct hostent *host;
        struct sockaddr_in server_addr;

        host= (struct hostent *) gethostbyname(url);

        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
        {
                rt_kprintf("Socket error\n");
                return;
        }
        rt_kprintf("step 1\n");
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(port);
        server_addr.sin_addr = *((struct in_addr *)host->h_addr);
        rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
    rt_kprintf("step 2\n");
        while (count)
        {
            rt_kprintf("step 3\n");
                sendto(sock, send_data, strlen(send_data), 0,
                   (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
               
                rt_kprintf("UDP transfer %d times\n",x++);

        rt_thread_delay(100);

        count --;
        }

    /* close socket */
        lwip_close(sock);
}

---------------------------------------------------------------------------------------------
application.c  新建了一个udp任务,就是调用udpclient()函数


extern void udpclient(const char* url, int port, int count);

/* thread phase init */
void rt_init_thread_entry(void *parameter)
{
    /* LwIP Initialization */
#ifdef RT_USING_LWIP
    {
        extern void lwip_sys_init(void);
        extern void rt_hw_dm9000_init(void);

        eth_system_device_init();

        /* register ethernetif device */
        rt_hw_dm9000_init();
        /* init all device */
        rt_device_init_all();

        /* init lwip system */
        lwip_sys_init();
        rt_kprintf("TCP/IP initialized!\n");
    }
#endif
}
const char url[] = "192.168.1.128";

void rt_udp_thread_entry(void *parameter)
{
           rt_kprintf("rt_udp_thread_entry entered\n");
           udpclient(url,10000,1000);
}
int rt_application_init()
{
    rt_thread_t init_thread;
        rt_thread_t udp_thread;

#if (RT_THREAD_PRIORITY_MAX == 32)
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   2048, 8, 20);
#else
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   2048, 8, 20);
#endif
    if (init_thread != RT_NULL) rt_thread_startup(init_thread);
            udp_thread = rt_thread_create("udp",
                                   rt_udp_thread_entry, RT_NULL,
                                   2048, 9, 20);
   if (udp_thread != RT_NULL) rt_thread_startup(udp_thread);
    return 0;
}

出0入0汤圆

发表于 2011-5-17 22:28:08 | 显示全部楼层
你udp线程和LWIP线程(包含dm9000初始化)同时创建的话,一旦dm9000或者lwip没初始化完成,udp肯定没法成功发送的,最好将UDP线程放在rt_init_thread_entry里面的lwip_sys_init();   rt_kprintf("TCP/IP initialized!\n");后面创建。即:

/* init lwip system */
        lwip_sys_init();
        rt_kprintf("TCP/IP initialized!\n");
        udp_thread = rt_thread_create("udp",
                                   rt_udp_thread_entry, RT_NULL,
                                   2048, 9, 20);
   if (udp_thread != RT_NULL) rt_thread_startup(udp_thread);

出0入0汤圆

 楼主| 发表于 2011-5-17 22:45:53 | 显示全部楼层
rt_kprintf 里面有任务切换,是吧?


我一直想通过优先级控制udp 在init 后面进行,但是通过打印好像不是这个样子。


现在的问题是udpclient(const char* url, int port, int count); 根本就不执行,里面的打印一个都没出来,

请问是我给的url 方式不对么?

出0入0汤圆

 楼主| 发表于 2011-5-17 22:53:45 | 显示全部楼层
能行了,感谢undead

好像是在 以太网 以及lwip 没有初始化好的情况下,直接调用udpclient ()

gethostbyname->lwip_gethostbyname->netconn_gethostbyname->tcpip_callback

然后就挂住了。

rtthread 终于开始了,呵呵

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 11:12

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

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