0

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 でないのはなぜですか? 中止または終了メカニズムを正しく使用するにはどうすればよいですか?

4

1 に答える 1

0

少しわかりにくいですが、使用するtcp_get_socketとソケットが割り当てられ、その状態になります。その後、リモートサーバーに接続するためTCP_STATE_CLOSEDに使用します。状態が に変わります。接続が確立されると、状態になります。サーバー側がシャットダウンされると、クライアント側は EVENT : を受け取ります。を使用して現在のソケットを閉じます。また、データの送信が完了したら、この関数を使用してソケットを閉じます。次回は、古いソケットで前に呼び出す必要があります。要するに、すべての接続、すべての.tcp_connectTCP_STATE_SYN_RECTCP_STATE_CONNECTTCP_EVT_ABORTtcp_release_sockettcp_get_sockettcp_connecttcp_get_socket

于 2012-12-19T09:14:21.143 に答える