2016-10-19 8 views
3

UDPベースのプロトコルを実装する必要があるライブラリを作成します。 私はホストA、リモートはホストBです。 ホストA、ポート7011からホストBポート7011にメッセージを送信する必要があります。ホストBはホストA、ポート7011に応答します。通信は非同期ですので、受信メッセージを待ち受けるudpが必要です。また、サーバーがバインドされている同じポートからメッセージを送信する必要がある場合もあります。ここで任意のrecvfromまで特定のクライアントにデータを送信するudpサーバー

は、私はソケットを作成し、結合しています方法です:

udp_server::udp_server(const std::string &localAddress, int localPort) 
    : f_port(localPort), f_addr(localAddress) { 
    char decimal_port[16]; 
    snprintf(decimal_port, sizeof(decimal_port), "%d", f_port); 
    decimal_port[sizeof(decimal_port)/sizeof(decimal_port[0]) - 1] = '\0'; 
    struct addrinfo hints; 
    memset(&hints, 0, sizeof(hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_DGRAM; 
    hints.ai_protocol = IPPROTO_UDP; 
    int r(getaddrinfo(localAddress.c_str(), decimal_port, &hints, &f_addrinfo)); 
    if (r != 0 || f_addrinfo == NULL) { 
     throw udp_client_server_runtime_error(
      ("invalid address or port for UDP socket: \"" + localAddress + ":" + decimal_port + "\"").c_str()); 
    } 
    f_socket = socket(f_addrinfo->ai_family, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP); 
    if (f_socket == -1) { 
     freeaddrinfo(f_addrinfo); 
     throw udp_client_server_runtime_error(
      ("could not create UDP socket for: \"" + localAddress + ":" + decimal_port + "\"").c_str()); 
    } 
    r = bind(f_socket, f_addrinfo->ai_addr, f_addrinfo->ai_addrlen); 
    if (r != 0) { 
     freeaddrinfo(f_addrinfo); 
     close(f_socket); 
     throw udp_client_server_runtime_error(
      ("could not bind UDP socket with: \"" + localAddress + ":" + decimal_port + "\"").c_str()); 
    } 
} 

そして、ここで私がメッセージを送信しようとしている:

ssize_t udp_server::sendto(std::string remoteHost, uint16_t port, const char *message, size_t messageLength) { 
    struct sockaddr_in remote; 
    remote.sin_family = AF_INET; 
    remote.sin_port = htons(7011); 
    remote.sin_addr.s_addr = ::inet_addr("10.8.0.6"); 

    socklen_t addrSize; 
    addrSize = sizeof(remote); 

    memset(remote.sin_zero, '\0', sizeof(remote.sin_zero)); 
    dout << "messageLength: " << messageLength << std::endl; 
    return ::sendto(this->f_socket, message, messageLength, 0, (struct sockaddr *)&remote, addrSize); 
} 

しかし::いつものsendto -1を返します。そして、errnoは無効な引数を意味する22に設定されます。可能な解決策は何ですか?たぶん全体の構造が悪いです。

=== ===ソリューション 0.0.0.0またはINADDR_ANYにする必要があり、私は:( をlocahostために私のサーバーをバインドしました。

+0

どのように 'udp_server :: udp_server'と' server :: sendto'を呼びますか? – dbush

+0

'this-> server = make_unique ( 'localhost'、localControlPort);'次に 'this-> server-> sendto(this-> remoteHost、this-> controlPort、(const char *)(バッファ))、static_cast (長さ)); –

答えて

0

をこのエラーは、あなたがlocalhostにバインドする場合に発生してに送信しようとすることができます非ローカルIP。

あなたが任意のインターフェイスから送信できるようにしたい場合は、0.0.0.0にバインドする必要があります。

はまた、udp_server::sendtoに、あなたは、ハードコード値にremote.sin_portremote.sin_addrを設定します。あなたは、おそらくのuにしたいですここではremoteHostportパラメータがあります。

+0

Rigth。深いデバッグでは、引数をハードコードされた値に変更することにしました。念のために。 –

関連する問題