TCP套接字从错误的端口接收

时间:2012-03-14 14:44:58

标签: linux sockets networking

我遇到TCP套接字接收错误目标端口消息的问题。

操作系统是Ubuntu Linux 10.10,内核版本是2.6.31-11-rt,但这也适用于其他内核。有这个问题的C / C ++程序就是这样做的:

  1. TCP服务器套接字正在端口9000侦听INADDR_ANY中的连接。

  2. TCP消息接收者线程通过recv(2)接收消息。读取消息后连接未关闭,但线程将继续从同一连接中继续读取。

  3. 错误:TCP消息接收器也接收到9000以外的其他端口的消息。例如,当远程SFTP客户端连接到TCP消息接收器正在侦听的PC时,它会使TCP消息接收器也接收SFTP消息。这怎么可能? TCP端口如何以这种方式“泄漏”?我认为SFTP应该使用22端口,对吧?那么这些消息在端口9000中是如何可见的呢?

  4. 更多信息:

    • 同时有一个原始套接字侦听另一个网络接口,并且该接口处于混杂模式。这会产生影响吗?

    • 消息接收之间未关闭TCP连接。消息侦听器只是继续从套接字读取数据。这真的是实现TCP消息接收器的正确方法吗?

    有没有人见过这种问题?提前谢谢。

    编辑:

    好的,这是一些代码。代码看起来没那么好,所以最奇怪的是,TCP套接字如何接收发送到另一个端口的数据?

    /// Create TCP socket and make it listen to defined port
    TcpSocket::listen() {
        m_listenFd = socket(AF_INET, SOCK_STREAM, 0)
        ...
        bzero(&m_servaddr, sizeof(sockaddr_in));
        m_servaddr.sin_family = AF_INET;
        m_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        m_servaddr.sin_port = htons(9000);
        bind(m_listenFd, (struct sockaddr *)&m_servaddr, sizeof(sockaddr_in);
        ...
        listen(m_listenFd, 1024);
        ...
        m_connectFd = accept(m_listenFd, NULL, NULL);
    }
    
    /// Receive message from TCP socket.
    TcpSocket::receiveMessage() {
        Uint16 receivedBytes = 0;
        // get the common fixed-size message header (this is an own message structure)
        Uint16 numBytes = recv(m_connectFd, msgPtr + receivedBytes, sizeof(SCommonTcpMSGHeader), MSG_WAITALL);
        ...
        receivedBytes = numBytes;
        expectedMsgLength = commonMsgHeader->m_msgLength;   // commonMsgHeader is mapped to received header bytes
        ...
        // ok to get message body
        numBytes = recv(m_connectFd, msgPtr + receivedBytes, expectedMsgLength - receivedBytes, MSG_WAITALL);
    }
    

2 个答案:

答案 0 :(得分:0)

  

消息接收之间未关闭TCP连接。该   消息监听器只是继续从套接字读取数据。这是   真的是实现TCP消息接收器的正确方法吗?

是但是它必须关闭套接字并在收到EOS指示时退出(recv()返回零)。

我认为你的原始套接字和TCP套接字FD在十几分之一的地方混淆了。

答案 1 :(得分:0)

嗯......看来它是接收消息的所有原始套接字。从日志中可以看出,它是原始消息处理程序打印出消息接收的东西,而不是TCP消息处理程序。咄...! :S抱歉。所以看起来原始套接字绑定到其他网络接口不能正常工作。需要解决这个问题。有趣的是,有时它适用于SSH / SFTP,有时它不会。