【问题标题】:Difference between close and abort in RL_ARM's TCP modeRL_ARM 的 TCP 模式下 close 和 abort 的区别
【发布时间】:2012-12-19 05:56:53
【问题描述】:

TCP 的关闭和 TCP 的中止有什么区别?下面是一个例子:

..//init the socket FD
while(1)
{
switch(socket_state)
{
case 0:
if(0 != FD)
{
    tcp_connect(FD,rem_ip, 502, 0);
    socket_state = 1;
    break;
}
case 2:
    if(TRUE == wait_ack)
    {
            return;
    }
    ..//sending data
    wait_ack = TRUE;
    break;
case 3:
{
    if(0 != FD)
    {
        tcp_close(FD);   //or tcp_abort(FD);
        tcp_release_socket(FD);
        soc_state = 0;
    }
}
     break;
}

}

tcp_callback:

U16 Listener(U8 socket,U8 event,U8* ptr,U16 par)
switch(event)
{
    case TCP_EVT_CONNECT:
        soc_state = 2;
        break;
    case TCP_EVT_ACK:
        wait_ack = __FALSE;
        break;
    case TCP_EVT_ABORT:
        soc_state = 3;
        break;
}
return (1);

现在,当我关闭服务器时,我的客户端将收到TCP_EVT_ABORT 消息,并设置soc_state = 3。在 while(1) 循环中,switch 看到这一点并进入案例 3。我希望它关闭还是中止?在下一次循环迭代中,我回到状态0。为什么文件描述符仍然不是0? 如何正确使用中止或关闭机制?

【问题讨论】:

    标签: c networking embedded posix


    【解决方案1】:

    有点难理解,当你使用tcp_get_socket时,socket被分配,其状态为TCP_STATE_CLOSED。之后,使用tcp_connect连接远程服务器,其状态将变为TCP_STATE_SYN_REC。建立连接后,状态变为TCP_STATE_CONNECT。当服务器端关闭时,客户端将收到事件:TCP_EVT_ABORT。我使用tcp_release_socket 关闭当前套接字。此外,当数据发送完成时,使用此函数关闭套接字。下一次,我们应该在 tcp_connect 之前使用旧套接字调用 tcp_get_socket。简而言之,每一个连接,每一个tcp_get_socket

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2010-09-28
      • 2013-02-10
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多