请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432E401Y 示例"tcpecho_MSP_EXP432E401Y_FreeRTOS_CCS"中的"tcpEcho.c"源文件内的"tcpHandler"函数 实现 TCP 服务器 此功能允许其他网络设备请求的套接字连接。
我需要修改 tcpHandler 函数、以实现 TCP 客户端 传递运行 TCP 服务器的网络主机的 IP 地址和端口号的功能。
有没有人可以举个例子、说明在 FreeRTOS 下运行的 MSP432适用的 TCP 客户端函数?
exisitng tcpHandler 函数代码如下所示:
/*
* ======== tcpHandler ========
* Creates new Task to handle new TCP connections.
*/
void *tcpHandler(void *arg0)
{
pthread_t thread;
pthread_attr_t attrs;
struct sched_param priParam;
int retc;
int detachState;
int status;
int server = -1;
struct addrinfo hints;
struct addrinfo *res, *p;
struct sockaddr_in clientAddr;
int optval;
static int clientfd;
int optlen = sizeof(optval);
socklen_t addrlen = sizeof(clientAddr);
char portNumber[MAXPORTLEN];
fdOpenSession(TaskSelf());
Display_printf(display, 0, 0, "TCP Echo example started\n");
sprintf(portNumber, "%d", *(uint16_t *)arg0);
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
/* Obtain addresses suitable for binding to */
status = getaddrinfo(NULL, portNumber, &hints, &res);
if (status != 0) {
Display_printf(display, 0, 0, "tcpHandler: getaddrinfo() failed: %s\n",
gai_strerror(status));
goto shutdown;
}
/* Open a socket */
for (p = res; p != NULL; p = p->ai_next) {
server = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (server == -1) {
continue;
}
status = bind(server, p->ai_addr, p->ai_addrlen);
if (status != -1) {
break;
}
close(server);
}
if (server == -1) {
Display_printf(display, 0, 0, "tcpHandler: failed to open socket\n");
goto shutdown;
} else if (p == NULL) {
Display_printf(display, 0, 0, "tcpHandler: could not bind to socket: %d\n", status);
goto shutdown;
} else {
freeaddrinfo(res);
res = NULL;
}
status = listen(server, NUMTCPWORKERS);
if (status == -1) {
Display_printf(display, 0, 0, "tcpHandler: listen failed\n");
goto shutdown;
}
optval = 1;
status = setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen);
if (status == -1) {
Display_printf(display, 0, 0, "tcpHandler: setsockopt failed\n");
goto shutdown;
}
while ((clientfd =
accept(server, (struct sockaddr *)&clientAddr, &addrlen)) != -1) {
Display_printf(display, 0, 0,
"tcpHandler: Creating thread clientfd = %x\n", clientfd);
/* Set priority and stack size attributes */
pthread_attr_init(&attrs);
priParam.sched_priority = 3;
detachState = PTHREAD_CREATE_DETACHED;
retc = pthread_attr_setdetachstate(&attrs, detachState);
if (retc != 0) {
Display_printf(display, 0, 0,
"tcpHandler: pthread_attr_setdetachstate() failed");
while (1);
}
pthread_attr_setschedparam(&attrs, &priParam);
retc |= pthread_attr_setstacksize(&attrs, 2048);
if (retc != 0) {
Display_printf(display, 0, 0,
"tcpHandler: pthread_attr_setstacksize() failed");
while (1);
}
retc = pthread_create(&thread, &attrs, tcpWorker, (void *)&clientfd);
if (retc != 0) {
Display_printf(display, 0, 0,
"tcpHandler: pthread_create() failed");
while (1);
}
/* addrlen is a value-result param, must reset for next accept call */
addrlen = sizeof(clientAddr);
}
Display_printf(display, 0, 0, "tcpHandler: accept failed.\n");
shutdown:
if (res) {
freeaddrinfo(res);
res = NULL;
}
if (server != -1) {
close(server);
}
fdCloseSession(TaskSelf());
return (NULL);
}