<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>MQX Software SolutionsのトピックRe: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445845#M14946</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Carlos,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Test case at bottom.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Instructions:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Call ListenTask() with a port number of your choice, example ListenTask(23);&lt;/P&gt;&lt;P&gt;telnet to the port from a PC, "telnet x.x.x.x"&lt;/P&gt;&lt;P&gt;Don't any any activity on the socket... simply wait a couple minutes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The application has a keepalive of 1 minute.&amp;nbsp; It will incorrectly disconnect after this time.&amp;nbsp; Change the keepalive to 0 by changing FTPD_SOCKET_KEEPALIVE_TIMEOUT_M (0)&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Try the same as above.&amp;nbsp; Socket will not disconnect.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This only happens in RTCS4.2, but not 4.1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;mqx.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;bsp.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;rtcs.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define FTPD_SOCKET_WAIT_TIMEOUT_MS (5000)&lt;/P&gt;&lt;P&gt;#define FTPD_SOCKET_KEEPALIVE_TIMEOUT_M (1)&lt;/P&gt;&lt;P&gt;#define FTPD_MAX_MESSAGE_SIZE (128)&lt;/P&gt;&lt;P&gt;#define FTPD_SESSION_LIMIT (6)&lt;/P&gt;&lt;P&gt;#define FTPD_PENDING_LIMIT (3)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static const uint32_t OptValueTimeWaitTimeout&amp;nbsp; = FTPD_SOCKET_WAIT_TIMEOUT_MS;&lt;/P&gt;&lt;P&gt;static const uint32_t OptValueKeepAliveTimeout = FTPD_SOCKET_KEEPALIVE_TIMEOUT_M;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Session information&lt;/P&gt;&lt;P&gt;typedef struct&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; bool&amp;nbsp;&amp;nbsp;&amp;nbsp; Active;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CtrlSocket; // Socket handle for control connection&lt;/P&gt;&lt;P&gt;} &lt;/P&gt;&lt;P&gt;FTPD_SESSION;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//-----------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;//&lt;/P&gt;&lt;P&gt;//-----------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;static _task_id TaskCreate(void (_CODE_PTR_ TaskPtr)(uint32_t),&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t StackSize,&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t Priority,&lt;/P&gt;&lt;P&gt;&amp;nbsp; const char *Name,&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t Parameter)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; TASK_TEMPLATE_STRUCT Task;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset((void *) &amp;amp;Task, 0, sizeof(Task));&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_ADDRESS&amp;nbsp;&amp;nbsp; = TaskPtr;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_STACKSIZE = StackSize;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_PRIORITY&amp;nbsp;&amp;nbsp; = Priority;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_ATTRIBUTES = MQX_FLOATING_POINT_TASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_NAME = (char *) Name;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.CREATION_PARAMETER = Parameter;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return _task_create(0,0,(uint32_t) &amp;amp;Task);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Handle a new session&lt;/P&gt;&lt;P&gt;static void SessionTask(uint32_t Parameters)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTPD_SESSION *SessionPtr = (FTPD_SESSION *) Parameters;&lt;/P&gt;&lt;P&gt;&amp;nbsp; char cmd[FTPD_MAX_MESSAGE_SIZE];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t count = FTPD_SOCKET_KEEPALIVE_TIMEOUT_M;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; RTCS_attachsock(SessionPtr-&amp;gt;CtrlSocket);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; printf("Socket connected with KEEPALIVE = %u\r\n", count);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(1)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // read from socket and throw away data&lt;/P&gt;&lt;P&gt;&amp;nbsp; count = recv(SessionPtr-&amp;gt;CtrlSocket, cmd, 1, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (count == RTCS_ERROR) break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; printf("Socket shutting down\r\n");&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SessionPtr-&amp;gt;CtrlSocket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; SessionPtr-&amp;gt;Active = FALSE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Listen Socket&lt;/P&gt;&lt;P&gt;void ListenTask(uint32_t ListenPort)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct sockaddr_in remoteAddr, localAddr;&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTPD_SESSION FtpdSession[FTPD_SESSION_LIMIT];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint16_t addrLen;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t i, Socket, SocketNew, Priority;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t MaxPending&amp;nbsp; = FTPD_PENDING_LIMIT;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Init FTPd session tracking&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i=0; i&amp;lt;FTPD_SESSION_LIMIT; i++) FtpdSession[i].Active = FALSE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // store the current task priority&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_get_priority(_task_get_id(), &amp;amp;Priority);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // create TCP/IP socket&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ( (Socket = socket(AF_INET, SOCK_STREAM, 0)) == RTCS_HANDLE_ERROR)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setsockopt(Socket, SOL_TCP, OPT_KEEPALIVE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void *) &amp;amp;OptValueKeepAliveTimeout, sizeof(OptValueKeepAliveTimeout));&lt;/P&gt;&lt;P&gt;&amp;nbsp; setsockopt(Socket, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, (void *) &amp;amp;OptValueTimeWaitTimeout,&amp;nbsp; sizeof(OptValueTimeWaitTimeout));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Bind socket to the listen port&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_family&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = AF_INET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_port&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ListenPort;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_addr.s_addr = INADDR_ANY;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (bind(Socket, (struct sockaddr_in *) &amp;amp;localAddr, sizeof(localAddr)) != RTCS_OK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(Socket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Listen on listen port&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (listen(Socket, MaxPending) != RTCS_OK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(Socket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Accept new sessions&lt;/P&gt;&lt;P&gt;&amp;nbsp; addrLen = sizeof(remoteAddr);&lt;/P&gt;&lt;P&gt;&amp;nbsp; SocketNew = accept(Socket, (struct sockaddr_in *) &amp;amp;remoteAddr, &amp;amp;addrLen);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (SocketNew == RTCS_HANDLE_ERROR)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; _time_delay(1000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; setsockopt(SocketNew, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, (void *) &amp;amp;OptValueTimeWaitTimeout, sizeof(OptValueTimeWaitTimeout));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // find a session and start the session task&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i=0; i&amp;lt;FTPD_SESSION_LIMIT; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (FtpdSession[i].Active == FALSE)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // start a new session&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset(&amp;amp;(FtpdSession[i]), 0, sizeof(FtpdSession[0]));&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].Active = TRUE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].CtrlSocket = SocketNew;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; RTCS_detachsock(SocketNew);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Spawn session handler&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (TaskCreate(SessionTask, 1024, Priority, "Session", (uint32_t) &amp;amp;FtpdSession[i]) == MQX_NULL_TASK_ID)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].Active = FALSE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SocketNew, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If no free session so close the connection&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (i == FTPD_SESSION_LIMIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SocketNew, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Limit the number of accept loops we process every second.&lt;/P&gt;&lt;P&gt;&amp;nbsp; _time_delay(250);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 14 Jan 2016 19:20:38 GMT</pubDate>
    <dc:creator>pmt</dc:creator>
    <dc:date>2016-01-14T19:20:38Z</dc:date>
    <item>
      <title>OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445841#M14942</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Greetings!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I recently updated to RTCS 4.2.0.0 (and RTCS 4.2.0.1).&amp;nbsp; I have the OPT_KEEPALIVE property enabled on one of my "control" sockets that I am using for a home brew FTP server.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In RTCS 4.1, no issues, seems to work as intended.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In RTCS 4.2, when the control socket connection sits idle for a few minutes the server side (MQX/RTCS) the first KEEPALIVE sent ends up resetting the socket connection.&amp;nbsp; KEEPALIVE should not do this unless the remote side is gone.&amp;nbsp;&amp;nbsp; Two keep alive probes from RTCS (ID=80 and 81), one keepalive response from the host , then RTCS resets the connection.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; &lt;span class="lia-inline-image-display-wrapper" image-alt="pastedImage_0.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/28352iDC83DC0533FCCC3F/image-size/large?v=v2&amp;amp;px=999" role="button" title="pastedImage_0.png" alt="pastedImage_0.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any clues?!?!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PMT&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Oct 2015 16:01:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445841#M14942</guid>
      <dc:creator>pmt</dc:creator>
      <dc:date>2015-10-30T16:01:44Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445842#M14943</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi PMT,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am nt having issueas with OPT_KEEPALIVE.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can you please describe how can I reproduce this behavior?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 16 Dec 2015 19:33:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445842#M14943</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2015-12-16T19:33:29Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445843#M14944</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This is basically what I am doing:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Create a listening socket on the RTCS side with the following socket options:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPT_KEEPALIVE = 2&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPT_TIMEWAIT_TIMEOUT = 5000&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Connect to the socket (i.e. TELNET from PC).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Let the connection sit idle for the KEEPALIVE period, 2 minutes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Connection will then reset as a result of the KEEPALIVE message.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Let me know if you can't reproduce, then I can work on creating a code snippet test case.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;PMT&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 17 Dec 2015 14:18:25 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445843#M14944</guid>
      <dc:creator>pmt</dc:creator>
      <dc:date>2015-12-17T14:18:25Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445844#M14945</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi PMT,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;it would be useful if you could share the code snippet.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 17 Dec 2015 17:40:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445844#M14945</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2015-12-17T17:40:27Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445845#M14946</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Carlos,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Test case at bottom.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Instructions:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Call ListenTask() with a port number of your choice, example ListenTask(23);&lt;/P&gt;&lt;P&gt;telnet to the port from a PC, "telnet x.x.x.x"&lt;/P&gt;&lt;P&gt;Don't any any activity on the socket... simply wait a couple minutes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The application has a keepalive of 1 minute.&amp;nbsp; It will incorrectly disconnect after this time.&amp;nbsp; Change the keepalive to 0 by changing FTPD_SOCKET_KEEPALIVE_TIMEOUT_M (0)&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Try the same as above.&amp;nbsp; Socket will not disconnect.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This only happens in RTCS4.2, but not 4.1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;mqx.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;bsp.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;rtcs.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define FTPD_SOCKET_WAIT_TIMEOUT_MS (5000)&lt;/P&gt;&lt;P&gt;#define FTPD_SOCKET_KEEPALIVE_TIMEOUT_M (1)&lt;/P&gt;&lt;P&gt;#define FTPD_MAX_MESSAGE_SIZE (128)&lt;/P&gt;&lt;P&gt;#define FTPD_SESSION_LIMIT (6)&lt;/P&gt;&lt;P&gt;#define FTPD_PENDING_LIMIT (3)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static const uint32_t OptValueTimeWaitTimeout&amp;nbsp; = FTPD_SOCKET_WAIT_TIMEOUT_MS;&lt;/P&gt;&lt;P&gt;static const uint32_t OptValueKeepAliveTimeout = FTPD_SOCKET_KEEPALIVE_TIMEOUT_M;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Session information&lt;/P&gt;&lt;P&gt;typedef struct&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; bool&amp;nbsp;&amp;nbsp;&amp;nbsp; Active;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CtrlSocket; // Socket handle for control connection&lt;/P&gt;&lt;P&gt;} &lt;/P&gt;&lt;P&gt;FTPD_SESSION;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//-----------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;//&lt;/P&gt;&lt;P&gt;//-----------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;static _task_id TaskCreate(void (_CODE_PTR_ TaskPtr)(uint32_t),&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t StackSize,&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t Priority,&lt;/P&gt;&lt;P&gt;&amp;nbsp; const char *Name,&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t Parameter)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; TASK_TEMPLATE_STRUCT Task;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset((void *) &amp;amp;Task, 0, sizeof(Task));&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_ADDRESS&amp;nbsp;&amp;nbsp; = TaskPtr;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_STACKSIZE = StackSize;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_PRIORITY&amp;nbsp;&amp;nbsp; = Priority;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_ATTRIBUTES = MQX_FLOATING_POINT_TASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.TASK_NAME = (char *) Name;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Task.CREATION_PARAMETER = Parameter;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return _task_create(0,0,(uint32_t) &amp;amp;Task);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Handle a new session&lt;/P&gt;&lt;P&gt;static void SessionTask(uint32_t Parameters)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTPD_SESSION *SessionPtr = (FTPD_SESSION *) Parameters;&lt;/P&gt;&lt;P&gt;&amp;nbsp; char cmd[FTPD_MAX_MESSAGE_SIZE];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t count = FTPD_SOCKET_KEEPALIVE_TIMEOUT_M;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; RTCS_attachsock(SessionPtr-&amp;gt;CtrlSocket);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; printf("Socket connected with KEEPALIVE = %u\r\n", count);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; while(1)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // read from socket and throw away data&lt;/P&gt;&lt;P&gt;&amp;nbsp; count = recv(SessionPtr-&amp;gt;CtrlSocket, cmd, 1, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (count == RTCS_ERROR) break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; printf("Socket shutting down\r\n");&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SessionPtr-&amp;gt;CtrlSocket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; SessionPtr-&amp;gt;Active = FALSE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;// Listen Socket&lt;/P&gt;&lt;P&gt;void ListenTask(uint32_t ListenPort)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct sockaddr_in remoteAddr, localAddr;&lt;/P&gt;&lt;P&gt;&amp;nbsp; FTPD_SESSION FtpdSession[FTPD_SESSION_LIMIT];&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint16_t addrLen;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t i, Socket, SocketNew, Priority;&lt;/P&gt;&lt;P&gt;&amp;nbsp; uint32_t MaxPending&amp;nbsp; = FTPD_PENDING_LIMIT;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Init FTPd session tracking&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i=0; i&amp;lt;FTPD_SESSION_LIMIT; i++) FtpdSession[i].Active = FALSE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // store the current task priority&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_get_priority(_task_get_id(), &amp;amp;Priority);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // create TCP/IP socket&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ( (Socket = socket(AF_INET, SOCK_STREAM, 0)) == RTCS_HANDLE_ERROR)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setsockopt(Socket, SOL_TCP, OPT_KEEPALIVE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void *) &amp;amp;OptValueKeepAliveTimeout, sizeof(OptValueKeepAliveTimeout));&lt;/P&gt;&lt;P&gt;&amp;nbsp; setsockopt(Socket, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, (void *) &amp;amp;OptValueTimeWaitTimeout,&amp;nbsp; sizeof(OptValueTimeWaitTimeout));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Bind socket to the listen port&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_family&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = AF_INET;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_port&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ListenPort;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localAddr.sin_addr.s_addr = INADDR_ANY;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (bind(Socket, (struct sockaddr_in *) &amp;amp;localAddr, sizeof(localAddr)) != RTCS_OK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(Socket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Listen on listen port&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (listen(Socket, MaxPending) != RTCS_OK)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(Socket, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; _task_destroy(_task_get_id());&lt;/P&gt;&lt;P&gt;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Accept new sessions&lt;/P&gt;&lt;P&gt;&amp;nbsp; addrLen = sizeof(remoteAddr);&lt;/P&gt;&lt;P&gt;&amp;nbsp; SocketNew = accept(Socket, (struct sockaddr_in *) &amp;amp;remoteAddr, &amp;amp;addrLen);&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (SocketNew == RTCS_HANDLE_ERROR)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; _time_delay(1000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; else&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; setsockopt(SocketNew, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, (void *) &amp;amp;OptValueTimeWaitTimeout, sizeof(OptValueTimeWaitTimeout));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // find a session and start the session task&lt;/P&gt;&lt;P&gt;&amp;nbsp; for (i=0; i&amp;lt;FTPD_SESSION_LIMIT; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (FtpdSession[i].Active == FALSE)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; // start a new session&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset(&amp;amp;(FtpdSession[i]), 0, sizeof(FtpdSession[0]));&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].Active = TRUE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].CtrlSocket = SocketNew;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; RTCS_detachsock(SocketNew);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Spawn session handler&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (TaskCreate(SessionTask, 1024, Priority, "Session", (uint32_t) &amp;amp;FtpdSession[i]) == MQX_NULL_TASK_ID)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; FtpdSession[i].Active = FALSE;&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SocketNew, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // If no free session so close the connection&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (i == FTPD_SESSION_LIMIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; shutdown(SocketNew, FLAG_CLOSE_TX);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Limit the number of accept loops we process every second.&lt;/P&gt;&lt;P&gt;&amp;nbsp; _time_delay(250);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 14 Jan 2016 19:20:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445845#M14946</guid>
      <dc:creator>pmt</dc:creator>
      <dc:date>2016-01-14T19:20:38Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445846#M14947</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;HI PMT,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;thank you, I reproduced this issue and confirmed this is a bug. I reported it to MQX development team. Just for your reference the report number is MQX-5684.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I will keep you informed about the status of the issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;We really appreciate this inputs.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Carlos&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Jan 2016 23:33:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445846#M14947</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2016-01-29T23:33:35Z</dc:date>
    </item>
    <item>
      <title>Re: OPT_KEEPALIVE Broken in RTCS 4.2?  Causing idle connection to RST in RTSC 4.2, but not 4.1</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445847#M14948</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Arial','sans-serif';"&gt;HI PMT,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Arial','sans-serif';"&gt;Workaround could be to call the setsockopt() after listen()/connect() returns.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Arial','sans-serif';"&gt;Regards,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10.5pt; font-family: 'Arial','sans-serif';"&gt;Carlos&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Feb 2016 20:40:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/OPT-KEEPALIVE-Broken-in-RTCS-4-2-Causing-idle-connection-to-RST/m-p/445847#M14948</guid>
      <dc:creator>Carlos_Musich</dc:creator>
      <dc:date>2016-02-02T20:40:06Z</dc:date>
    </item>
  </channel>
</rss>

