2013-05-28 3 views
1

제공되는 서버/포트에 대한 연결을 만들려고합니다. 연결을 만들 때 적어도 패킷을 ping 할 수 있습니다. 나는 보내기()) 정확한 바이트 수를 반환하는 것 때문에 내가 할 수라고 생각,하지만 난) (RECV하려고 할 때 바로 후, 전화가 왜 전송이 것에연결이 Recv()에서 거부되었습니다. send가 제대로 작동하는 것 같습니다.

"Error on Receiving .. Connection Refused" 

어떤 아이디어를 말하는 실패 에러를 내지 않겠지 만, recv는하겠습니까? 다음은 내 오류를 일으키는 코드 부분입니다. 자체 스레드에서 실행 중입니다. TCP 연결이 다른 스레드에서 이루어졌으며 해당 소켓 설명자가이 스레드로 전달되었습니다 (아래 m_sockfd라고 함).

void ConnectionManager::operator()() 
{ 

    int rc = 0, numBytes=0 ; 
    char reply[256] ; 

    // Send a ping 
    char PingPacket[23] ; 
    PreparePingPacket(PingPacket) ; 
    numBytes = send(m_sockfd,PingPacket,23,0); 
    if(numBytes == -1) 
    { 
    fprintf(stderr, "Error on Sending Ping .. \n") ; 
    return ; 
    } 
    if(numBytes < 23) 
    { 
    fprintf(stderr, "Didn't send the whole Ping Request .. %d \n", numBytes) ; 
    } 

    numBytes = recv(m_sockfd, reply, 256, 0) ; 

    if(numBytes == -1) 
    { 
    fprintf(stderr, "Error on Receiving .. %s \n", strerror(errno)) ; 
    return ; 
    } 

    ParsePacket(reply, rc) ; 
} 

나는 실제 연결을 수행 내 코드를 붙여 넣을 수 있지만,로 시작하는 다음 전송을 통해 간 적이없는 것 오류를했다면 내가 알 것?

읽어 주셔서 감사합니다.

+0

WSAGetLastError()를 사용하여 Winsock 오류 코드를 가져온 다음 [Microsoft] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms741580(v=vs.85).aspx) 그것이 무엇을 의미하는지 알기 위해. – Serdalis

+0

대학의 서버에서 코드를 실행했는데 완벽하게 작동합니다. 집에서이 문제 만 치고있는 것처럼 보입니다. 포트 포워딩을 사용하여 특정 포트로 들어오는 모든 트래픽을 지시하고 들어오는 연결을 확인할 수 있는지 확인했지만 recv()가 61/Connection Refused를 발행하는 이유를 확인하지 못했습니다. –

답변

0

내 생각에 그것은 매우 어리 석습니다. 문제는 내 getaddrinfo() 문과 함께했습니다. 나는 어떻게 든 "struct addrinfo"힌트를 모두 0으로 memsetting 한 후에 전달했습니다. 이로 인해 엔드 포인트가 어떻게 든 무효화되었습니다. 구조체의 값을 변경하기 전에 memset을 배치 한 후이 문제는 사라졌습니다. 발송물이 어떻게 처리되었는지는 아직 확실하지 않지만 그게 문제였습니다.

관련 문제