器件型号: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个同时连接。