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.

一个task连接两个socket出现停止问题

Other Parts Discussed in Thread: TMS320C6678

一个task中可以连接两个tcp socket,向两个不同的地址发送数据吗?为什么我在一个task中创建了两个socket,会出现停止现象,就是不在接收数据,有时候几十秒停止,有时候几分钟,是什么问题,求指教。

  • 请问您的硬件平台是什么,用的哪款芯片,软件版本是什么,是TI NDK中的例程还是自己开发的程序

    2个socket走的是1个SGMII口还是2个SGMII口,数据包类型是什么样的,流量多少?

    以上信息会有助于我们帮您分析解决。谢谢

  • 您好,

          我的硬件平台是TMS320C6678l,软件版本是CCS6.1,MCSDK版本是2.1.2.5,NDK版本是2.24,程序是在NDK中的例程上面自己修改的。2个socket走的是一个千兆网口。dsp上程序如下,创建了两个socket连接tcp和tcp2,发送缓冲区和接收缓冲区大小都为64000,接收采用的是stcp,发送采用的是stcp2,程序运行2分钟左右卡住(recv函数还在接收数据,每次接收1460,但速度非常慢,隔几秒才接收一次,像卡住一样),如果将send(stcp2, addr, 5000, 0)中的5000改成50000,整个程序运行十几秒就会卡住。

    void ndk_main_receiveTsk(UInt32 a,UInt32 b,UInt32 c)
    {
        uint totalBytes = 0;
        int i;
        char *addr = (char*) 0x9ad00000; //接收缓冲区起始地址
        struct timeval to;
        struct sockaddr_in sin1;
        SOCKET stcp = INVALID_SOCKET;
        int error;

        struct timeval to2;
        struct sockaddr_in sin2;
        SOCKET stcp2 = INVALID_SOCKET;
        /* Allocate the file environment for this task */
        fdOpenSession(TaskSelf());
        bzero(&sin1, sizeof(struct sockaddr_in));
        sin1.sin_family = AF_INET;
        sin1.sin_addr.s_addr = inet_addr(IPADDR_STRING);
        sin1.sin_port = htons(8899);
        stcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (stcp == INVALID_SOCKET) {
            printf("receive task Failed to create socket, %d\n", fdError());
            goto leave;
        }
        printf("receive task socket create success\n ");
        to.tv_sec = 60; //s
        to.tv_usec = 0; //ms
        setsockopt(stcp, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof(to));
        setsockopt(stcp, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof(to));

        for (;;) {
            /* Connect socket */
            if (connect(stcp, (PSA) &sin1, sizeof(struct sockaddr_in)) < 0) {
                printf("receive task connect PC failed\n");
                TaskSleep(500);
            } else
                break;
        }

        bzero(&sin2, sizeof(struct sockaddr_in));
        sin2.sin_family = AF_INET;
        sin2.sin_addr.s_addr = inet_addr(IPADDR_STRING2);
        sin2.sin_port = htons(8877);
        stcp2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (stcp2 == INVALID_SOCKET) {
            printf("receive task Failed to create socket, %d\n", fdError());
            goto leave;
        }
        printf("receive task socket create success\n ");
        to2.tv_sec = 60; //s
        to2.tv_usec = 0; //ms
        setsockopt(stcp2, SOL_SOCKET, SO_SNDTIMEO, &to2, sizeof(to2));
        setsockopt(stcp2, SOL_SOCKET, SO_RCVTIMEO, &to2, sizeof(to2));

        for (;;) {
            /* Connect socket */
            if (connect(stcp2, (PSA) &sin2, sizeof(struct sockaddr_in)) < 0) {
                printf("receive task connect PC failed\n");
                TaskSleep(500);
            } else
                break;
        }    
        while (1) {
            totalBytes = 0;
            while (totalBytes < 100000) {
                i = recv(stcp, addr + 100000 + totalBytes, 100000 - totalBytes,
                        0);
                totalBytes = totalBytes + i;
            }
            send(stcp2, addr, 5000, 0);
        }//end while(1)

        leave:
        // We only get here on an error - close the sockets
        if (stcp != INVALID_SOCKET) {
            fdClose(stcp);
        }

        fdCloseSession(TaskSelf());
        TaskDestroy(TaskSelf());
    }