2012-03-14 2 views
3

잘못된 대상 포트로 메시지를 수신하는 TCP 소켓에 문제가 있습니다.잘못된 포트에서 TCP 소켓을 수신합니다.

OS는 Ubuntu Linux 10.10이고 커널 버전은 2.6.31-11-rt이지만 다른 커널에서도 마찬가지입니다. 이 문제가있는 C/C++ 프로그램이 수행합니다

  1. TCP 서버 소켓 9000

  2. 메시지가 RECV와 수신 포트에서 INADDR_ANY에 연결 듣고있다 (2) TCP 메시지 수신자 실. 메시지를 읽은 후 연결이 닫히지는 않지만 스레드는 동일한 연결에서 영원히 계속 읽습니다.

  3. 오류 : 9000 이외의 다른 포트에 대한 메시지도 TCP 메시지 수신자가 수신합니다. 예를 들어, 원격 SFTP 클라이언트가 TCP 메시지 수신자가 수신중인 PC에 연결하면 TCP 메시지 수신자가 SFTP 메시지도 수신하게됩니다. 어떻게 이런 일이 가능할까요? 어떻게 TCP 포트가 "누출"할 수 있습니까? SFTP에서 포트 22를 사용해야한다고 생각하니? 그런 다음 해당 메시지가 포트 9000에 어떻게 표시 될 수 있습니까?

상세 정보 :

  • 동시에 다른 네트워크 인터페이스에서 수신 원시 소켓이, 그리고 인터페이스는 무차별 모드에 있습니다. 이것이 효과가있을 수 있습니까?

  • 메시지 수신 사이에 TCP 연결이 닫히지 않습니다. 메시지 수신기는 소켓에서 데이터를 계속 읽습니다. 이것은 실제로 TCP 메시지 수신자를 구현하는 올바른 방법입니까?

이런 종류의 문제를 본 사람이 있습니까? 미리 감사드립니다.

편집 :

좋아, 여기에 몇 가지 코드가 있습니다. 이 코드는 완벽하게 보입니다. 그래서 가장 이상한 것은 TCP 소켓이 다른 포트로 전송 된 데이터를 수신 할 수 있다는 것입니다. 는 EOS 표시 (RECV()를 0을 반환)를 수신 할 때

/// 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); 
} 
+1

다른 문제가 발생할 가능성이 있습니다 (TCP 소켓이 아닌 원시 소켓에서 읽은 것일 수 있습니다). 어떤 종류의 "메시지"를 얻을 수 있습니까? sftp 클라이언트가 연결할 때? – nos

+0

@nos 내가 읽는 소켓은 TCP 소켓 클래스에 있기 때문에 올바른 소켓이어야합니다. Raw 소켓은 다른 클래스에서와 유사합니다. 혼란 스러울 수 없습니다. 메시지는 네트워크에서 오는 모든 데이터입니다.TCP 메시지 핸들러 클래스의 출력물은 수신해서는 안되는 물건을 받았습니다. – HJK25

+0

시퀀스는'socket()','bind()','listen()','accept()'이어야한다. 귀하의 코드는 무엇입니까, 당신은 관련 부품을 게시 할 수 있습니까? –

답변

0

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?

네하지만 소켓 종료를 닫아야합니다.

원시 소켓과 TCP 소켓의 십분의 일이 어딘가에 섞여 있다고 생각합니다.

+0

원시 소켓과 TCP 소켓은 혼동하지 않습니다. 문제는 TCP 소켓이 완전히 잘못된 포트에서 데이터를 가져 오는 것입니다. – HJK25

+0

@ HJK25 네가 그렇게 말한다면 25 년 동안 네트워크 프로그래밍에서 본 적이 없다. 나는 가능한 한 다른 설명을, 즉 어딘가에서 내 자신의 코드에서 찾을 수있을 것이다. 원시 소켓없이 모두 실행할 수 있습니다. – EJP

+0

raw 소켓의 인터페이스를 non-promiscuous 모드로 설정하려고 시도했지만 도움이되지 않았습니다. TCP 소켓을 열어두고 EOS를 수신 한 후에도 닫지 않는 것이 좋습니다. 이미 열려있는 연결을 통해 원격 호스트에 데이터를 보낼 수 있기 때문에 열어보고 싶습니다. 원격 호스트가 서버이고이 현재 호스트가 클라이언트로 작동 할 수 있도록 할 수 있습니까? – HJK25

0

음 ... 메시지를받은 것은 원시 소켓이었습니다. 로그에서 볼 때 메시지 수신자가 아닌 원시 메시지 핸들러가 TCP 메시지 처리기가 아닌지 확인할 수 있습니다. 이런 ...! : S 죄송합니다. 그래서 원시 소켓을 다른 네트워크 인터페이스에 바인딩하는 것이 올바르게 작동하지 않는 것 같습니다. 그것을 고칠 필요가 있습니다. 재미 있긴하지만 SSH/SFTP와 함께 작동하는 경우도 있지만 가끔은 그렇지 않습니다.

+0

어쨌든, 모두에게 감사드립니다. – HJK25

관련 문제