2013-07-18 2 views
0

목표는 udp 프로토콜을 사용하여 네트워크에서 데이터를 수신하는 C++ 프로그램을 작성하는 것입니다. OS - 리눅스. 나는 몇 가지 질문이있다.udp 프로토콜을 사용하여 네트워크에서 데이터를 수신 할 수 없습니다.

  1. 저는 C++ 프로그램을 작성하기 위해 Linux C 라이브러리를 사용할 수 있는지 확인하고자합니다.
  2. 어디서나 리눅스에서 소켓을 사용하여 프로그래밍하는 방법을 단계별로 자세히 설명하는 전체 자습서가 있습니까? (나는 네트워크에서 많은 튜토리얼을 알고 있지만 인터넷에서 udp 데이터를 수신하는 데 도움이되는 어떤 것을 찾고 있는데, 같은 장치에있는 다른 프로그램이 아닙니다.).
  3. 터미널에서 (tcpdump를 사용하여) 내 컴퓨터가 지정한 포트로 주소가 지정된 udp 패키지를 수신합니다. 나는이 프로그램이 어떤 UDP 패키지를 기다린다 생각 (그리고 그가 그것을받지 않는 이유를 모르겠어) - 어떤 내 프로그램 잘못된 것은 내가 receiveData() 아무 일이 없을 것 호출 할 때이

    class Connection 
    { 
    private: 
        char * buffer; 
        int bufferSize; 
        int sock; 
        struct sockaddr_in server; 
        struct sockaddr_in other; 
        socklen_t addressLength; 
    
    public: 
        Connection(string address, int port, int bufferSize); 
        ~Connection(); 
        int reciveData(); 
    }; 
    
    Connection::Connection(string address, int port, int bufferSize) 
    { 
        this->addressLength = sizeof(this->server); 
    
        this->sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    
        if(this->sock == -1) 
        { 
         cout << "Socket error!" << endl; 
         exit(1); 
        } 
    
        memset(&(this->server), 0, sizeof(this->server)); 
        this->server.sin_family = AF_INET; 
        this->server.sin_port = htons(port); 
        this->server.sin_addr.s_addr = htonl(INADDR_ANY); 
    
        if(bind(this->sock, (sockaddr *) &(this->server), this->addressLength) == -1) 
        { 
         cout << "Bind socket error!" << endl; 
         exit(1); 
        } 
    
        this->bufferSize = bufferSize; 
        this->buffer = new char[bufferSize]; 
    
        cout << "Socket created!" << endl; 
    } 
    
    int Connection::receiveData() 
    { 
        int returned; 
        fflush(stdout); 
    
        if((returned =recvfrom(this->sock, this->buffer, this->bufferSize, 0, (sockaddr *) &(this->other), &this->addressLength)) == -1) 
        { 
         cout << "Receiving error!" << endl; 
         exit(1); 
        } 
    
        return returned; 
    } 
    

    처럼 보이는.

  4. 누군가 나를 udp 서버와 클라이언트 프로그램의 차이점을 설명해 주시겠습니까?

고마워요.

답변

1

recvfrom()을 호출하면 this->addressLength에 대한 포인터가 전달됩니다. 입력시 길이는 주소 버퍼의 전체 크기 여야합니다. 출력시 실제 주소 길이가 반환됩니다. 따라서 recvfrom()addressLength 회원을 변경하여 후속 코드에 영향을 줄 수 있습니다. 대신 지역 변수를 사용

int Connection::receiveData() 
{ 
    int returned; 
    int addrlen = sizeof(this->other); 

    fflush(stdout); 

    returned = recvfrom(this->sock, this->buffer, this->bufferSize, 0, (sockaddr *) &(this->other), &addrLen); 
    if(returned == -1) 
    { 
     cout << "Receiving error!" << endl; 
     exit(1); 
    } 

    return returned; 
} 

또는 대신 별도의 멤버 변수 사용 : 당신을 귀찮게

class Connection 
{ 
private: 
    char * buffer; 
    int bufferSize; 
    int sock; 
    struct sockaddr_in server; 
    struct sockaddr_in other; 
    socklen_t serverAddressLength; 
    socklen_t otherAddressLength; 

public: 
    Connection(string address, int port, int bufferSize); 
    ~Connection(); 
    int reciveData(); 
}; 

Connection::Connection(string address, int port, int bufferSize) 
{ 
    this->serverAddressLength = sizeof(this->server); 

    this->sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    if(this->sock == -1) 
    { 
     cout << "Socket error!" << endl; 
     exit(1); 
    } 

    if(this->sock == -1) 
    { 
     cout << "Socket error!" << endl; 
     exit(1); 
    } 

    memset(&(this->server), 0, sizeof(this->server)); 
    this->server.sin_family = AF_INET; 
    this->server.sin_port = htons(port); 
    this->server.sin_addr.s_addr = htonl(INADDR_ANY); 

    if(bind(this->sock, (sockaddr *) &(this->server), this->serverAddressLength) == -1) 
    { 
     cout << "Bind socket error!" << endl; 
     exit(1); 
    } 

    this->bufferSize = bufferSize; 
    this->buffer = new char[bufferSize]; 

    cout << "Socket created!" << endl; 
} 

int Connection::receiveData() 
{ 
    int returned; 
    fflush(stdout); 

    this->otherAddressLength = sizeof(this->other); 
    if((returned =recvfrom(this->sock, this->buffer, this->bufferSize, 0, (sockaddr *) &(this->other), &this->otherAddressLength)) == -1) 
    { 
     cout << "Receiving error!" << endl; 
     exit(1); 
    } 

    return returned; 
} 
불행하게도
+0

가 작동하지 않습니다 ... –

+0

미안, 문제는 있었다 방화벽. –

관련 문제