我的 TCP 套接字接收到目标端口错误的消息时遇到问题。
操作系统是 Ubuntu Linux 10.10,内核版本是 2.6.31-11-rt,但其他内核也会出现这种情况。有这个问题的C/C++程序是这样做的:
TCP 服务器套接字正在监听 INADDR_ANY 端口 9000 中的连接。
TCP 消息接收器线程使用 recv(2) 接收消息。读取消息后连接没有关闭,但线程继续从同一个连接永远读取。
错误: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/