This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: SYSBIOS

各位工程师好:

        我想使用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端在连接成功后主动发送数据嘛?

  • 看到e2e上NDK team的工程师一直在跟进您的问题,请耐心等待他们的回复。
    e2e.ti.com/.../886464
  • 我用sysbios提供的Task_Create生成的线程,在里面调用全局的socket发送数据,在线程内没有用fdOpenSession()在应用层分配一个文件描述符表,所以用socket向远端发送数据是不认的,这个在《NDK2.25 API Reference Guide》的第3.1.2节中提到过。我改为用NDK提供的TaskCreate()函数来创建发数线程,就可以利用全局的socket来往上位机主动发送数据了。因为TaskCreate这个线程创建函数内部已经通过fdOpenSession()等创建了一个文件描述符表。