现在的位置: 首页 > 综合 > 正文

第四讲 UDP编程zz

2013年05月17日 ⁄ 综合 ⁄ 共 3623字 ⁄ 字号 评论关闭

发信人: gdtyy (gdtyy), 信区: Embedded
标  题: 第四讲 UDP编程
发信站: 水木社区 (Mon Jun 25 23:31:12 2007), 站内

******************
* 第四讲 UDP编程 *
******************
    2006/12/31  asdjf@163.com  www.armecos.com

    很多网友需要跑TCP/IP协议栈,那么用ecos是再惬意不过的事情了。ecos自身提供三种
完整协议栈:FreeBSD、OpenBSD、lwip,当然如果你愿意,也可以移植其他协议栈,爽吧!
    我配置的ecos系统选择了FreeBSD栈,功能非常强大,该有的基本都有,标准接口,与
PC机上网络开发没有任何区别。ecos自带测试范例,改改就能直接应用。
    UDP的优点是开销小,速度快;缺点是面向无连接,无纠错能力。UDP在网络实时应用中
用得很多。
    下面是UDP测试源码,略微不同的是一开始要先执行“init_all_network_interfaces()
;”,同时判断网卡是否安装(条件判断CYGHWR_NET_DRIVER_ETH0)。剩下的部分就全是标准
写法。这里用到的一些socket函数有阻塞功能,不需要额外延时,所以处理速度很快。

UDP测试源码
//此程序配合上位机UDP测试程序

#include <network.h>

#include <pkgconf/system.h>
#include <pkgconf/net.h>

#include <cyg/infra/testcase.h>

#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide
CYGTST_DEVS_ETH_TEST_NET_REALTIME
#endif

#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
# endif
#endif

#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x1000)
static char stack[STACK_SIZE],stack1[STACK_SIZE];
static cyg_thread thread_data,thread_data1;
static cyg_handle_t thread_handle,thread_handle1;

void
pexit(char *s)
{
    CYG_TEST_FAIL_FINISH(s);
}

void
udp_test(struct bootp *bp)
{
    struct sockaddr_in host,client;
    int s,len,c_len;
    unsigned char buf[100];
    unsigned char msga[] = {"YY:www.armecos.com"};
    unsigned char msge[] = {"Error!"};
    unsigned char num = 5;

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0) {
        pexit("socket");
        return;
    }

    // Set up host address
    host.sin_family = AF_INET;
    host.sin_len = sizeof(host);
    host.sin_addr.s_addr = INADDR_ANY;
    host.sin_port = ntohs(1025);

    if(bind(s, (struct sockaddr *) &host, sizeof(host)) < 0) {
        pexit("bind /source/ error");
    }

    while(true){
        c_len = sizeof(client);
        len = recvfrom(s, buf, sizeof(buf),0,(struct sockaddr *)&client,&c_len);
        if(len > 0){
            if(buf[0] == 'A')
                num = 5;
            else
                len = sendto(s,buf,sizeof(buf),0,(struct sockaddr *)&client,
sizeof(client));
        }
        while(num != 0){
            len = sendto(s,msga,sizeof(msga),0,(struct sockaddr *)&client,
sizeof(client));
            if(len != sizeof(msga))
                len = sendto(s,msge,sizeof(msge),0,(struct sockaddr *)&client,
sizeof(client));
            //cyg_thread_delay(10);
            num--;
        }
    }
}

void
net_test(cyg_addrword_t p)
{
    diag_printf("Start Networking Test.../n");

    init_all_network_interfaces();

#ifdef CYGHWR_NET_DRIVER_ETH0
    if (eth0_up) {
        cyg_thread_create(10,                // Priority - just a number
                      udp_test,              // entry
                      (cyg_addrword_t)&eth0_bootp_data,      // entry parameter
                      "Network udp test",    // Name
                      &stack1[0],            // Stack
                      STACK_SIZE,            // Size
                      &thread_handle1,       // Handle
                      &thread_data1          // Thread data structure
            );
        cyg_thread_resume(thread_handle1);  // Start it
    }
#endif

}

void
cyg_start(void)
{
    // Create a main thread, so we can run the scheduler and have time 'pass'
    cyg_thread_create(10,                // Priority - just a number
                      net_test,          // entry
                      0,                 // entry parameter
                      "Network test",    // Name
                      &stack[0],         // Stack
                      STACK_SIZE,        // Size
                      &thread_handle,    // Handle
                      &thread_data       // Thread data structure
            );

    cyg_thread_resume(thread_handle);  // Start it
    cyg_scheduler_start();
}

--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]
 

抱歉!评论已关闭.