微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3000一个心得分享。

CC3000一个心得分享。

时间:10-02 整理:3721RD 点击:

我在CC3000上建立一个socket,作为tcp server。

并设置accept为非阻塞,在程序中select传入timeout = 1秒。

整个程序就是在accept和select交替运行。后来我遇到一个现象,就是如果客户端连接之后不进行通讯大约50秒,就会出现CC3000主动断开客户端连接的现象。

而在驱动程序中收不到这个消息。

今天突发奇想,会不会和我用select而不是用recv有关呢。

于是做了一个简单的测试。

    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sd < 0)
    {
        printf("error\n");
        return;
    }
    printf("socket :%d\n", sd);
    memset(&tSocketAddr, 0, sizeof(tSocketAddr));
    tSocketAddr.sa_family = AF_INET;
    tSocketAddr.sa_data[0]= (12366)>>8;
    tSocketAddr.sa_data[1]= (unsigned char)12366;
    tSocketAddr.sa_data[2]= 0;
    tSocketAddr.sa_data[3]= 0;
    tSocketAddr.sa_data[4]= 0;
    tSocketAddr.sa_data[5]= 0;
    ret = bind(sd, &tSocketAddr, sizeof(sockaddr));
    if(ret < 0)
    {
        printf("error\n");
        return;
    }
    ret = listen(sd, 0);
    if(ret < 0)
    {
        printf("error\n");
    }
    val = SOCK_ON;
    ret = setsockopt( sd, SOL_SOCKET, SOCKOPT_ACCEPT_NONBLOCK, &val, sizeof(val));
    if(ret == -1)
    {
        return;
    }
    //----------------------------------------------------
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    maxFD = 0;
    while(1)
    {
        client = accept(sd, &tSocketAddr, &from_len);
        if(client < 0)
        {
            asm("NOP");
            //printf("accept error\n");
        }
        else
        {
            FD_ZERO(&readsds);
            FD_SET(client, &readsds);
            maxFD = client+1;
        }
        if(maxFD == 0)
          continue;
        ret = select(maxFD, &readsds, NULL, NULL, &timeout); // Polling instead of blocking here to process "accept" below
        if(ret == 0)
        {
            //timeout
        }
        else if(ret == -1)
        {
            printf("select error\n");
        }
        else
        {
            len = recv(maxFD, buf, 1280, 0);
            if(len < 0)
            {
                asm("NOP");
            }
            else if(len > 0)
            {
                buf[len] = 0;
                printf("recv: %s\n", buf);
                asm("NOP");
            }
        }
    }
启动CC3000后程序如上。在网络调试助手中建立一个tcp client连接到CC3000 tcp server,之后不发任何数据。大约50秒回被CC3000断开连接。
下面改用recv
sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sd < 0)
    {
        printf("error\n");
        return;
    }
    printf("socket :%d\n", sd);
    memset(&tSocketAddr, 0, sizeof(tSocketAddr));
    tSocketAddr.sa_family = AF_INET;
    tSocketAddr.sa_data[0]= (12366)>>8;
    tSocketAddr.sa_data[1]= (unsigned char)12366;
    tSocketAddr.sa_data[2]= 0;
    tSocketAddr.sa_data[3]= 0;
    tSocketAddr.sa_data[4]= 0;
    tSocketAddr.sa_data[5]= 0;
    ret = bind(sd, &tSocketAddr, sizeof(sockaddr));
    if(ret < 0)
    {
        printf("error\n");
        return;
    }
    ret = listen(sd, 0);
    if(ret < 0)
    {
        printf("error\n");
    }
    val = SOCK_ON;
    ret = setsockopt( sd, SOL_SOCKET, SOCKOPT_ACCEPT_NONBLOCK, &val, sizeof(val));
    if(ret == -1)
    {
        return;
    }
    //----------------------------------------------------
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    maxFD = 0;
    while(1)
    {
        client = accept(sd, &tSocketAddr, &from_len);
        if(client < 0)
        {
            asm("NOP");
            //printf("accept error\n");
        }
        else
        {
            maxFD = client;
            time_out = 1000;
            setsockopt(maxFD, SOL_SOCKET, SOCKOPT_RECV_TIMEOUT, &time_out, sizeof(time_out));
        }
        if(maxFD == 0)
          continue;
        len = recv(maxFD, buf, 1280, 0);
        if(len < 0)
        {
            asm("NOP");
        }
        else if(len > 0)
        {
            buf[len] = 0;
            printf("recv: %s\n", buf);
            asm("NOP");
        }
}
此时不通讯是就会不会出现被CC3000断开的现象。
当然上述测试只针对一个客户端。
发给大家参考一下。毕竟同时天涯沦落人啊。
附一笑话:
你会编程,而他们不会,这他妈的酷比了。

多谢楼主分享

谢谢分享:)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top