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 中的 keepalive 逻辑上使用调试器,在最新的 Microchip Library for Applications TCP/IP 堆栈 5.42.08 中默认为 10 秒。

于 2013-12-30T16:59:04.843 回答