CH32V208W的网络中断中如何区分不同的Socket连接的数据?

在以太网中,有如下的处理函数:

    if (intstat & GINT_STAT_SOCKET) {                             //socket related interrupt

        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {

            socketint = WCHNET_GetSocketInt(i);

            if (socketint)

                WCHNET_HandleSockInt(i, socketint);

        }

    }


这里面有一个i作为了socket传递到了:

WCHNET_HandleSockInt(i, socketint);


而最开始创建socket的时候,也传递进去了一个socket:

    i = WCHNET_SocketCreat(&SocketIdForListen, &TmpSocketInf);

    printf("SocketIdForListen %d\r\n", SocketIdForListen);

    mStopIfError(i);

    i = WCHNET_SocketListen(SocketIdForListen);



但是似乎,这两个socket没有关系?

如果我创建了多个socket, 中断里面根据i来获取的Socket, 该如何与创建的socket对应上呢?

主要是为了不同的socket(例如创建了两个TCP socket, s1和s2), 我如何在中断中区分是s1还是s2的中断呢?

您好,在服务器创建的过程中WCHNET_CreateTcpSocket()函数按照创建的顺序给每个socket都会赋值,每个socket都会有一个序号SocketId,比如在TCPdebug等测试软件中先创建的第一个服务器,它就是S1,后创建的即S2,以此类推。

在main函数中,有WCHNET_HandleGlobalInt()函数来专门管理中断,其中,intstat = WCHNET_GetGlobalInt();可以用来管理您所创建的socketid;

另外,TCP Server Listening会占用一个socket,该值为0;当有TCP Client连接进来之后协议栈会重新分配一个socket保存该连接的信息,值为1,类似的,多连接分配的socket值会依次递增。




@TECH_ZZY  谢谢回复.但是依然没有说明如何处理我遇到的问题:

如果我多次调用 ceateTCPSocket创建了几个TCP Server, 假设是两个S1和S2

在以太网的中断中, 我可以获取到外面来连接的socket S3和S4, 但是我如何知道S3和S4连接到的是S1还是S2呢? 

即我如何在中断中知道外部的socket连接S3和S4是连接到了S1还是S2?  

要区分S3和S4是因为我需要针对不同的TCPServer S1和S2接收的数据进行不同的处理.


抱歉,理解错了image.png

可以尝试利用您这边的S3和S4所设置的目的端口号来判别


@TECH_ZZY  谢谢. 对于代码按照如下获取得到的source port不正确.

下面的代码中最后2行printf打印的到的:

socketID:2, recieve len:12, HTTP Socket:0, TCP SID:1

SRC Index: 0, Dest:0, SourcePort:80


程序中, 我们创建了一个80端口, 和1000端口的两个TCP Server, 上面的log打印的是端口80, 但是实际上这个是TCPDebug工具连接和发送数据到的是1000端口. 

这个是哪里错了呢? 帮忙看看.



void WCHNET_HandleGlobalInt(void)

{

    u8 intstat;

    u16 i;

    u8 socketint;


    intstat = WCHNET_GetGlobalInt();                              //get global interrupt flag

    if (intstat & GINT_STAT_UNREACH)                              //Unreachable interrupt

    {

        printf("GINT_STAT_UNREACH\r\n");

    }

    if (intstat & GINT_STAT_IP_CONFLI)                            //IP conflict

    {

        printf("GINT_STAT_IP_CONFLI\r\n");

    }

    if (intstat & GINT_STAT_PHY_CHANGE)                           //PHY status change

    {

        i = WCHNET_GetPHYStatus();

        if (i & PHY_Linked_Status)

            printf("PHY Link Success\r\n");

    }

    if (intstat & GINT_STAT_SOCKET) {                             //socket related interrupt

        for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {

            socketint = WCHNET_GetSocketInt(i);

            if (socketint) {

                WCHNET_HandleSockInt(i, socketint);

                printf("socketID:%d, recieve len:%d, HTTP Socket:%d, TCP SID:%d\r\n", socketid, len, SocketIdForListen, SocketId);

                printf("SRC Index: %d, Dest:%d, SourcePort:%d\r\n", SocketInf[socket].SockIndex, SocketInf[socket].DesPort, SocketInf[socket].SourPort);

            }


        }

    }

}


您好,试试把打印的第二行的SocketInf[socket],改为Socket[i];

如果还是不行,可以把您联系方式,发送至邮箱zzy@wch.cn,详细看一下您的程序。


只有登录才能回复,可以选择微信账号登录