TI中文支持网
TI专业的中文技术问题咨询交流网站

C6655作为TCP服务器端发送数据的问题

各位工程师好:

        我想使用C6655作为服务器与上位机进行数据传输。

        按照官方给的例程,用DaemonNew函数创建了一个进程,得到了一个socket,如下:

        hEcho = DaemonNew( SOCK_STREAMNC, 0, 7,dtask_tcp_echo,OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );

        这个创建的线程,回调函数dtask_tcp_echo是在上位机作为tcp的client端来与6655进行连接时进入的,进入以后,开始接收上位机数据,接收超时或者接收到数据后就关闭socket然后退出,等待下一次链接再进入这个函数。

        现在,我用6655与上位机通信,不想要每次上位机发送数据过来都需要进行tcp的重新连接,所以我改动了回调函数的代码,如下:

    /* Configure our socket timeout to be 5 seconds */
    to.tv_sec  = 5;
    to.tv_usec = 0;
    setsockopt( s, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof( to ) );
    setsockopt( s, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof( to ) );
    i = 1;
    setsockopt( s, IPPROTO_TCP, NDK_TCP_NOPUSH, &i, 4 );
    Semaphore_post(sem1);
    s_send = s;
    for(;;)
    {
        i = (int)recvnc( s, (void **)&pBuf, 0, &hBuffer );
        /* If we read data, echo it back */
        if( i == 0 )   //connection broken
        {
           break;
        }
        else if( i == -1 )  //receive timeout
        {
        }
        /* If the connection got an error or disconnect, close */
        else  if( i > 0  ) //receive data and echo
        {
            if( send( s, pBuf, i, 0 ) < 0 )    
        }
    }
    recvncfree( hBuffer );
    fdClose( s );
       接收到数据以后我把数据返回,只有在链接断开时,才会退出这个函数,不然就是一直在试图接收上位机发送的数据,我就认为这个是监听了。
       在这个回调函数里面,接收和发送都可以正确实现。但是,因为我也还有数据想要主动发送给上位机,我声明了一个全局的指针,来指向这个跟上位机连接上的socket,然后在另外一个线程里,使用这个socket进行数据发送,如下:(我是在tcp已经连接成功后才进行的数据发送)

test_send()
{
    char  pBuf[] = "hello,world\n";
    Uint32 i;

    while(1)

   {
       Semaphore_pend(sem1, BIOS_WAIT_FOREVER);

       if( (i =send( s_send, pBuf, strlen(pBuf), 0 )) < 0 )
      {
           System_printf("send failed\n");
      }

   }

}

       但是在这个线程里数据发送永远是失败的,返回值永远为-1.从这个线程退出后返回到上一个tcp的回调函数里,数据都是可以正常发送的,我仔细确认了,两个socket的首地址都是一样的。

我的问题是:

1、上面的情况要怎么修改才能正确发送数据啊?

2、6655没法作为tcp的server端在连接成功后主动发送数据嘛?

Shine:

看到e2e上NDK team的工程师一直在跟进您的问题,请耐心等待他们的回复。
e2e.ti.com/…/886464

赞(0)
未经允许不得转载:TI中文支持网 » C6655作为TCP服务器端发送数据的问题
分享到: 更多 (0)