1

PIC24F でサーバーを構築しようとしています。

これは私が発行しているコードの一部です:

switch(TCPServerState) {
            case SM_HOME:
                // Allocate a socket for this server to listen and accept connections on
                socket.Socket = TCPOpen(0, TCP_OPEN_SERVER, SERVER_PORT, TCP_PURPOSE_GENERIC_TCP_SERVER);
                if(socket.Socket != INVALID_SOCKET) {
                    TCPServerState = SM_LISTENING;
                }
                break;
            case SM_LISTENING:
                // See if anyone is connected to us
                //if(TCPIsConnected(socket.Socket)) {
                if(!TCPWasReset(socket.Socket)){
                    if(socket.Connected == 0) {
                        socket.Connected = 1;
                        printf("Socket is CONNECTED: %d\n", socket.Socket);
                    }
                    uint16_t avaible = TCPIsGetReady(socket.Socket);
                   // Some stuff
                }
                else if(socket.Connected == 1){
                   printf("Socket RESET: %d\n", socket.Socket);
                   TCPServerState = SM_CLOSING;
                }
                break;
            case SM_CLOSING:
                // Close the socket connection.
                socket.Connected = 0;
                TCPClose(socket.Socket);
                TCPServerState = SM_HOME;
                printf("Socket is CLOSED: %d\n", socket.Socket);
                break;
        }

クライアントソケットを適切に閉じるとすべて正常に動作しますが、イーサネットケーブルを切断すると切断を検出できず、TCPWasReset が FALSE (または TCPIsConnected が TRUE) のままであるため、コードがソケットを閉じません。

では、ネットワークケーブルの切断を検出するにはどうすればよいですか (ソフトウェア keep_alive 実装を追加せずに) ?

ありがとう

4

1 に答える 1

1

いくつかの項目を確認してください。

  • TickInit()を呼び出します。StackInit() の前に;

  • アプリケーションに適した TIMER1 クロック ソース (内部クロックまたは外部クロック (T1CON.TCS)) を選択します。

    それ以外の場合は、TCP.C のキープアライブ ロジックでデバッガーを使用してください。最新の Microchip Library for Applications TCP/IP スタック 5.42.08 ではデフォルトで 10 秒に設定されています。

于 2013-12-30T16:59:04.843 に答える