0

私の目的は、udp プロトコルを使用してネットワークからデータを受信する C++ プログラムを作成することです。OS - Linux。いくつか質問があります。

  1. Linux C ライブラリを使用して C++ プログラムを記述できるようにしたいと考えています。
  2. Linuxでソケットを使用してプログラムする方法を段階的に説明する完全なチュートリアルはどこにありますか? (ネットワークには多くのチュートリアルがあることは知っていますが、同じデバイス上の別のプログラムからではなく、インターネットからudpデータを受信するのに役立つものを探しています。)
  3. 端末 (tcpdump を使用) で、コンピューターが指定されたポートにアドレス指定された udp パッケージを受信して​​いることがわかります。このように見える私のプログラムの何が問題になっていますか

    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;
    }
    

    私が呼び出したとき、receiveData()何も起こっていません-プログラムはいくつかのudpパッケージを待っていると思います(なぜ彼がそれを受け取らないのかわかりません)。

  4. 誰かがudpサーバーとクライアントプログラムの違いを説明してもらえますか?

どうもありがとう。

4

1 に答える 1

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;
}
于 2013-07-18T21:29:24.527 に答える