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.

[参考译文] CCS/MSP432E411Y:CAN#39;t 获取我设置的最大 TCP 连接数。 最多只能连接10个 TCP

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP432E411Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949866/ccs-msp432e411y-can-t-get-the-maximum-number-of-tcp-connections-i-set-can-only-connect-up-to-10-tcp

器件型号:MSP432E411Y

工具/软件:Code Composer Studio

您好!

我尝试同时获得15个 TCP 连接、但 NDK 库在10之后停止接受连接。

我使用的是 Simplelink MSP432E4 SDK 3.40.1.02。

我的堆缓冲区大小为 151,552字节(0x25000)。

我的 NDK 配置  

/*套接字文件描述符表*/
#define MAXSOCKETS15
uint32_t ti_NDK_socket_max_fd = MAXSOCKloc;
void * ti_NDK_socket_fdtable[MAXSOCKETS];

extern Display_Handle g_SMCDisplay;

// NDconK 内存管理器页大小和页数[ti_ndk_raw_out_out_out_config_pr_out_out_out_out_pr_out_out_out_out_out_count]






/* P.I.T.(页面信息表)*/
#ifdef __ti__
#pragma DATA_SECTION (ti_NDK_CONFIG_Global_PIT、".bss:NDK_MMBUFFER");
#pragma DATA_SECTION (ti_NDK_CONFIG_Global_Pitt缓冲 器、".bss:NDK_MMBUFFER");#pragma DATA_SECTION (ti_UNDCK_CONFIG_COUNT_RAW_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_SECTION)
;"*
unsigned char ti_ndk_config_Global_pitBuffer[raW_page_size * raW_page_count];
#elif defined (__IAR_systems_icc_)
PITENTRY ti_ndk_config_Global_pit[raW_page_count];
unsigned

raw ti_ndk_config_Global_pitBuffer[ra_pet_page_out_count];unsigned raw TI_pit_pit_pet_pet_page_out_count]
__attribute__(((section(".bss:NDK_MMBUFFER")));
无符号字符 ti_NDK_config_Global_pitBuffer[raW_PAGE_SIZE * raW_PAGE_COUNT]
__attribute__(((section(".bss:NDK_MMBUFFER")));
#endif

/*内存桶大小*/
#define must 48
#define bargest (raW_PAGE_SIZE)

const int ti_NDK_CONFIG_Global_lest = pest;
const int_NDK_CONFIG_GE_BIST_BIST_BIST_BIST_SECURT =


* 2槽跟踪*/ INDI_INT_UDIST_INDIRECTI_SIZE =*
{最小、96、128、256、512、 1536、最大};

/*
本地数据包缓冲池定义
*
*以下变量/定义用于覆盖
在数据包缓冲管理器(PBM)文件 src/stack/PBM/PBM_DATA.c
中设置的默认值*//

/*
PBM 数据包缓冲区空闲池中的缓冲区数量
*
中的缓冲区数量 可用池对
性能有显著影响*、尤其是在 UDP 封包丢失的情况下。 增加此数量
*将增大用于发送
*和接收数据包的静态数据包池的大小。
//
#define PKT_NUM_FRAMEBUF 16

//以太网帧缓冲区的大小*/
#define PKT_SIZE_FRAMEBUF 1536

const int ti_NDK_CONFIG_Global_numFrameBuf = PKT_CHAR_FRAMEBUF;
const int int_ETK_CONFIG_TI_FrameBuf =#PKT_SECTION

+#NDMP_SECTOR_ENT_SECTOR_ENT_SECTIONS +#NDMP_RAMEREF_ENTREM_SECTIONS +#NE_ENTREM_ENTREM_SECTIONS


+#NE_SECTOR_ENTREM_SECTIONS +#NDMP_ENTREM_ENTREM_SECTIONS +#NSDK_CONFIG_SECTOR_ENTREM_SECTIONS +#NE_ENTREM_ENTREM_SECTIONS +#NDMP_SECTOR_SECTIONS + ENTREM_SEC

TI_NDK_CONFIG_Global_pBufMem[PKT_NUM_FRAMEBUF * PKT_SIZE_FRAMEBUF];
#Elif defined (_IAR_systems_ICC__)
#pragma DATA_alignment = 128
unsigned char
TI_NDK_CONFIG_Global_pBufMem[PKT_NUM_FRAMEBUF * PKT_SIZE_FRAMEBUF];
#else
unsigned char ti_NDK_CONFIG_Global_pBufMem[PKT_NUM_FRAMEBUF * PKT_SIZE_FRAMEBUF]
_attribute__((aligned (128)、section (".bss:NDK_PACKETMEM"));
#endif

#ifdef _ti_#sizema
data_align (ti_ndk_config_Global_pHdrMem、128);#endma
data_section (ti_ndti_ndt_ram_unsigned ppragma _pragma _pragma _pragma)


*、npnpbmem
(ti_pragma _pragma _pragma _pragma _pragma _pragma _pragma _pragma _pragma _pragma +(ti_pragma

+、_pragma +、_pragma + pbnpnppragma _pragma +)、_pragma _pragma _pragma _pragma _pragma _pragma +(_pragma _pragma _pragma _pragma _pragma _pragma +、_pragma _pragma +、_pragma _pragma +、_pragma _pragma +、"+、+、+、+、+、+、+、+、+ pbnp
__attribute__((aligned(128), section(".bss:NDK_PACKETMEM"));
#endif

//我们的 NETCTRL 回调函数*/
static void networkOpen();
static void networkClose();
static void networkIpAddr (UINT32_t ipaddr,Utic hostname/uint32

;“static void networkClose”/t”

打开第11个连接后,我的 TCP 服务器将返回接受功能上的错误。

void vTCPRCBinServerFxn (UArg0、UArgarg1)
{
// TCP 变量
uint32_t 错误计数器;
内部 状态;
内部 客户;
内部 服务器;
struct sockaddr_in localAddr;
struct sockaddr_in clientAddr;
内部 光度;
内部 optlen = sizeof (optval);
socklen_t addrlen = sizeof (clientAddr);
Task_handle 任务处理;
Task_Params 任务参数;
Semaphore_Params semParams;
Semaphore_handle semHandle;
结构时间 val 至;

Clock_Params 时钟参数;
时钟句柄 时钟处理;
ERROR_Block EB;


assert (arg0!= NULL);

ERROR_INIT (&EB);
//打开文件会话
fdOpenSession (((void *) Task_self ()));


if (arg0 == NULL){
返回;
}

Display_printf (g_SMCDisplay、0、0、"TCP 服务器在端口(%d)上启动\n"、(uint32_t) arg0);

服务器=套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP);
if (server ==1){
System_printf ("错误:未创建套接字。\n");
system_flush();
Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:套接字失败\n");
转到关断;
}


memset (localAddr、0、sizeof (localAddr));
localAddr.Sin_Family = AF_iNet;
localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
localAddr.sin 端口= htons (arg0);

status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
如果(status =-1){
System_printf ("错误:绑定失败。\n");
system_flush();
Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:绑定失败\n");
转到关断;
}

状态=监听(服务器、TCPBINDEVICE_NUMTCPWORKERS);
如果(status =-1){
System_printf ("错误:侦听失败。\n");
system_flush();
Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:侦听失败\n");
转到关断;
}

// optval = 1;
// status = setsockopt (server、SOL_socket、SO_keepalive、&optval、optlen);
// if (status ==1){
/// if (setsockopt (server、SOL_socket、SO_keepalive、&optval、optlen)< 0){
// System_printf ("错误:setsockopt 失败\n");
// System_flush ();
// Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:setsockopt 失败\n");
// 转至关断;
//}
TO.tv_sec = 3;
TO.tV_usec = 0;
(void) setsockopt (server、SOL_socket、SO_RCVTIMEO、&to、sizeof (to));

Semaphore_Params_init (semParams);
semParams.mode = Semaphore_Mode_Counting;
SemHandle = Semaphore_create (MAXSOCKETS - 1、SemParams、&EB);
if (semHandle == NULL){
system_abort ("无法创建套接字限制信标");
}

Clock_Params_init (&clockParams);
clockParams.period = TCPRCBINDEVICE_SOCKET_PERIOD;
clockParams.startFlag = true;

System_printf ("vTCPRCBinServerFxn:信标计数=%d\n"、Semaphore_getCount (semHandle));
system_flush();

错误计数器= 0;

执行{
clientfd =接受(server、(struct socaddr *)&clientAddr、&addrlen);

if (clientfd!=-1){
错误计数器= 0;
system_printf ("vTCPRCBinServerFxn:创建线程 clientfd =%d\n"、clientfd);
System_printf ("vTCPRCBinServerFxn:信标计数=%d\n"、Semaphore_getCount (semHandle));
system_flush();
Display_printf (g_SMCDisplay、0、0、
"vTCPRCBinServerFxn:创建线程 clientfd =%d\n"、clientfd);
/* Init the Error_Block */
ERROR_INIT (&EB);

TO.tv_sec = 5;
TO.tV_usec = 0;
(void) setsockopt (clientfd、SOL_Socket、SO_RCVTIMEO、&to、sizeof (to));

/*初始化默认值并设置参数。 *
Task_Params_init (&taskParams);
taskParams.arg0 =(UArg) clientfd;
taskParams.arg1 =(UArg)semHandle;
taskParams.STACKSIZE = TCPBIN_worker_handler_stack;
taskParams.priority = TCPBIN_worker_task_priority;
任务处理= Task_create ((Task_FuncPtr) vTCPRCBinWorker、&taskParams、&EB);
if (taskHandle == NULL){
System_printf ("错误:创建新任务失败\n");
system_flush();
close (clientfd);
}

/* addrlen 是一个值结果参数,必须重置为下一个接受呼叫*/
addrlen = sizeof (clientAddr);

Semaphore_pend (semHandle、BIOS_wait_forever);

System_printf ("vTCPRCBinServerFxn:获取信标。 左侧=%d\n"、Semaphore_getCount (semHandle));
system_flush();
}否则{
错误计数器++;
System_printf ("错误:接受失败。\n");
system_flush();
Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:接受失败。\n");
Task_sleep((unsigned int)100);
}
//}
}while (错误计数器< 5);

System_printf ("错误:接受失败。 关闭 TCP 服务器\n");
system_flush();
Display_printf (g_SMCDisplay、0、0、"vTCPRCBinServerFxn:由于错误关闭 TCP 服务器。\n");
关断:
if (server!=-1){
关闭(服务器);
}
//关闭文件会话
fdCloseSession ((void *) Task_self ());

SFFS_Handle hSFFS;
hSFFS = hSFFS_OPEN (SFFS_Internal);
xSFFS_lockMemoryForReboot (hSFFS、BIOS_Wait_Forever);
// vSFFS_Close (hSFFS);
//
hSFFS = hSFFS_open (SFFS_External);
// xSFFS_lockMemoryForReboot (hSFFS、BIOS_Wait_Forever);
// vSFFS_Close (hSFFS);

Task_sleep (50);

// 等待闪存互斥量

// 看门狗解锁(WATCHDOG0_BASE);
// WatchdogResetDisable (WATCHDOG0_BASE);
// USBDCDTerm (0);
USBDevDisconnect (USB0_BASE);

Task_sleep (50);

SysCtlReset();
} 

我是否需要更改任何参数以允许更多 TCP 连接? 我希望允许15个同时连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Eugenio、

    这可能是因为它没有足够的内存分配。  socket.c 中的 Accept()-> SlNetSock_Accept()-> slnetsocket.c 中的 SlNetSock_AllocVirtualSocket ()检查可用存储器、 如果无法分配则返回 SLNETERR_RET_CODE_malloc_ERROR。

    根据  slnetsock.h 中的 SLNETSOCK_MAX_ANONGAL_SLOCKETS 的定义、套接字本身的数量可能高达32个

    #define SLNETSOCK_MAX_ANONGAL_SLOCKETS (32)/**<声明可打开的最大套接字*/

    它返回的错误应该告诉您这是不是原因。

    Srinivas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Srinivas、

    感谢你的帮助。

    内存分配没有问题。 当这种情况发生时、uC 仍然具有+17k 的堆。  

    我将 slnetsocket.c 文件复制到了我的项目中、并对其进行了修改、以添加一些用于调试的输出。 我在 sockAccept 上发现失败。 它返回错误代码-10。 我在 getBSDSlNetErr()中找到 它是 SLNETERR_BSD_ENSOCK。

    //
    //
    // SlNetSock_accept -接受插槽上的连接
    //
    //*********
    int16_t SlNetSock_accept (int16_t SD、SlNetSock_Addr_t *地址、SlNetSocklen_t *地址长度)
    {
    SlNetSock_VirtualSocket *分配节点;
    无效 *sdContext;
    内部16_t 领域 Sd;
    内部16_t socketIndex;
    内部32_t RetVal = SLNETERR_RET_CODE_OK;
    
    /*搜索数组中的空闲位置*/
    RetVal = SlNetSock_AllocVirtualSocket (&socketIndex、&allocSdNode);
    
    /*在创建套接字之前,请检查数组中是否有空闲位置*/
    if (RetVal < SLNETERR_RET_CODE_OK)
    {
    display_printf (g_SMCDisplay、0、0、"数组中没有可用空间、返回错误代码");
    /*数组中没有可用空间,返回错误代码 *
    返回 RetVal;
    }
    
    /*检查 SD 输入是否存在并将其返回 *
    RetVal = SlNetSock_getVirtualSdConf (SD、&realSd、&(allocSdNode->sdFlags)、&sdContext 和(allocSdNode->netIf));
    
    /*检查是否找到 SD 或是否存在非强制功能 *
    if (SLNETERR_RET_CODE_OK!=返回值)
    {
    Display_printf (g_SMCDisplay、0、0、"检查是否找到 SD 或是否存在非强制性函数");
    返回 RetVal;
    }
    if (NULL =((allocSdNode->netIf)->ifConf)->sockAccept)
    {
    /*释放捕获的 VirtualSockets 位置 *
    SlNetSock_freeVirtualSocket (socketIndex);
    Display_printf (g_SMCDisplay、0、0、"验证失败、返回错误代码");
    /*验证失败,返回错误代码 *
    返回 SLNETERR_RET_CODE_INVALID_INPUT;
    }
    
    /*函数存在于套接字描述符、调度的界面中
    接受命令 *
    RetVal =((allocSdNode->netIf)->ifConf)->sockAccept (realSd、sdContext、addr、addrlen、allocSdNode->sdFlags、 &(allocSdNod->sdContext);
    
    /*检查 RetVal 是否有错误代码 *
    if (RetVal < SLNETERR_RET_CODE_OK)
    {
    /*释放捕获的 VirtualSockets 位置 *
    SlNetSock_freeVirtualSocket (socketIndex);
    Display_printf (g_SMCDisplay、0、0、"sockAccept failed、return error code =%d"、RetVal);
    /* sockAccept 失败,返回错误代码 *
    返回 RetVal;
    }
    其他
    {
    /*创建的实套接字,填充分配的套接字节点 *
    allocSdNode->realSd = RetVal;
    
    /*套接字已创建、分配并连接到
    VirtualSockets 数组、返回 VirtualSockets 索引 *
    返回 socketIndex
    ;}
    
    }
    

    谢谢、

    Eugenio Penate