我遇到TCP套接字接收错误目标端口消息的问题。
操作系统是Ubuntu Linux 10.10,内核版本是2.6.31-11-rt,但这也适用于其他内核。有这个问题的C / C ++程序就是这样做的:
TCP服务器套接字正在端口9000侦听INADDR_ANY中的连接。
TCP消息接收者线程通过recv(2)接收消息。读取消息后连接未关闭,但线程将继续从同一连接中继续读取。
错误:TCP消息接收器也接收到9000以外的其他端口的消息。例如,当远程SFTP客户端连接到TCP消息接收器正在侦听的PC时,它会使TCP消息接收器也接收SFTP消息。这怎么可能? TCP端口如何以这种方式“泄漏”?我认为SFTP应该使用22端口,对吧?那么这些消息在端口9000中是如何可见的呢?
更多信息:
同时有一个原始套接字侦听另一个网络接口,并且该接口处于混杂模式。这会产生影响吗?
消息接收之间未关闭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);
}
答案 0 :(得分:0)
消息接收之间未关闭TCP连接。该 消息监听器只是继续从套接字读取数据。这是 真的是实现TCP消息接收器的正确方法吗?
是但是它必须关闭套接字并在收到EOS指示时退出(recv()返回零)。
我认为你的原始套接字和TCP套接字FD在十几分之一的地方混淆了。
答案 1 :(得分:0)
嗯......看来它是接收消息的所有原始套接字。从日志中可以看出,它是原始消息处理程序打印出消息接收的东西,而不是TCP消息处理程序。咄...! :S抱歉。所以看起来原始套接字绑定到其他网络接口不能正常工作。需要解决这个问题。有趣的是,有时它适用于SSH / SFTP,有时它不会。