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

标签 linux sockets networking

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

操作系统是 Ubuntu Linux 10.10,内核版本是 2.6.31-11-rt,但其他内核也会出现这种情况。有这个问题的C/C++程序是这样做的:

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

  2. TCP 消息接收器线程使用 recv(2) 接收消息。读取消息后连接没有关闭,但线程继续从同一个连接永远读取。

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

更多信息:

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

  • 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);
}

最佳答案

The TCP connection is not closed in between message receptions. The message listener just keeps reading data from the socket. Is this really a correct way to implement a TCP message receiver?

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

我认为你的原始套接字和 TCP 套接字 FD 在某处混淆了。

关于linux - TCP 套接字从错误的端口接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704186/

相关文章:

c++ - 矩阵压缩方法

linux - Bash - 需要根据 bash 中命令的输出将数据写入文件

linux - wget 本地 HTTPS 站点?我可以设置 wget 应该用来连接到站点的 IP 吗?

android - Android 的套接字和多线程

linux - 为什么在添加IPv4地址时linux ip命令不接受主机名

c# - 将所有流量转发到 http 代理(隧道)

linux - 在无效的输出条件上重复一个特定的 case 语句并在 case 内循环

linux - 查找没有特定权限的文件

c - 如何确定同一 iOS 设备上对等 TCP 连接的 PID?

java - Tomcat连接器具有异步Servlet的工作能力和可伸缩性