CH32V208W的網(wǎng)絡(luò)中斷中如何區(qū)分不同的Socket連接的數(shù)據(jù)?

在以太網(wǎng)中,有如下的處理函數(shù):

? ? 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);

? ? ? ? }

? ? }


這里面有一個(gè)i作為了socket傳遞到了:

WCHNET_HandleSockInt(i, socketint);


而最開(kāi)始創(chuàng)建socket的時(shí)候,也傳遞進(jìn)去了一個(gè)socket:

? ? i = WCHNET_SocketCreat(&SocketIdForListen, &TmpSocketInf);

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

? ? mStopIfError(i);

? ? i = WCHNET_SocketListen(SocketIdForListen);



但是似乎,這兩個(gè)socket沒(méi)有關(guān)系?

如果我創(chuàng)建了多個(gè)socket, 中斷里面根據(jù)i來(lái)獲取的Socket, 該如何與創(chuàng)建的socket對(duì)應(yīng)上呢?

主要是為了不同的socket(例如創(chuàng)建了兩個(gè)TCP socket, s1和s2), 我如何在中斷中區(qū)分是s1還是s2的中斷呢?

您好,在服務(wù)器創(chuàng)建的過(guò)程中WCHNET_CreateTcpSocket()函數(shù)按照創(chuàng)建的順序給每個(gè)socket都會(huì)賦值,每個(gè)socket都會(huì)有一個(gè)序號(hào)SocketId,比如在TCPdebug等測(cè)試軟件中先創(chuàng)建的第一個(gè)服務(wù)器,它就是S1,后創(chuàng)建的即S2,以此類(lèi)推。

在main函數(shù)中,有WCHNET_HandleGlobalInt()函數(shù)來(lái)專(zhuān)門(mén)管理中斷,其中,intstat = WCHNET_GetGlobalInt();可以用來(lái)管理您所創(chuàng)建的socketid;

另外,TCP Server Listening會(huì)占用一個(gè)socket,該值為0;當(dāng)有TCP Client連接進(jìn)來(lái)之后協(xié)議棧會(huì)重新分配一個(gè)socket保存該連接的信息,值為1,類(lèi)似的,多連接分配的socket值會(huì)依次遞增。




@TECH_ZZY? 謝謝回復(fù).但是依然沒(méi)有說(shuō)明如何處理我遇到的問(wèn)題:

如果我多次調(diào)用 ceateTCPSocket創(chuàng)建了幾個(gè)TCP Server, 假設(shè)是兩個(gè)S1和S2

在以太網(wǎng)的中斷中, 我可以獲取到外面來(lái)連接的socket S3和S4, 但是我如何知道S3和S4連接到的是S1還是S2呢??

即我如何在中斷中知道外部的socket連接S3和S4是連接到了S1還是S2???

要區(qū)分S3和S4是因?yàn)槲倚枰槍?duì)不同的TCPServer S1和S2接收的數(shù)據(jù)進(jìn)行不同的處理.


抱歉,理解錯(cuò)了image.png

可以嘗試?yán)媚@邊的S3和S4所設(shè)置的目的端口號(hào)來(lái)判別


@TECH_ZZY? 謝謝. 對(duì)于代碼按照如下獲取得到的source port不正確.

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

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

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


程序中, 我們創(chuàng)建了一個(gè)80端口, 和1000端口的兩個(gè)TCP Server, 上面的log打印的是端口80, 但是實(shí)際上這個(gè)是TCPDebug工具連接和發(fā)送數(shù)據(jù)到的是1000端口.?

這個(gè)是哪里錯(cuò)了呢? 幫忙看看.



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];

如果還是不行,可以把您聯(lián)系方式,發(fā)送至郵箱zzy@wch.cn,詳細(xì)看一下您的程序。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频