2016-12-21 13 views
3

私のサーバでは、TCPとUDPを2つの異なるポートにバインドします。 私は最初にクライアントとTCPを接続します(受け入れなど)TCPとUDPで同じsockaddr_inを使用できますか?

次に、私のサーバーとクライアントとの通信にUDPを使用したいと思います。 だから私はそのような同じsockaddr_inを使用しようとしました:

void AUDPMonitor::sendMessage(Message &msg) 
{ 
    for (ISocket *socket: *_fdListClients) 
    { 
    if (msg.getClientId() == socket->getSock()) 
    { 
     UDPSocket *UdpSocket = reinterpret_cast<UDPSocket *>(socket); 
     UdpSocket->send(msg, socket->getUserAddr()); 
     break; 
    } 
    } 
} 

_fdListClients私はTCPのコネクションから得たソケットのベクトルです。 エラーメッセージはありませんが、クライアントは何も受信しません。

だから私は同じsockaddr_inを使用することが可能かどうか、それが不可能かどうかを知りたいと思います。

編集:私はクライアントソケット

socklen_t  client_sin_len; 
    sockaddr_in *client_sin = new sockaddr_in; 

    client_sin_len = sizeof(sockaddr_in ); 
    std::cout << "New User ! " << std::endl; 
    if ((cs = accept(fd, reinterpret_cast<struct sockaddr *>(client_sin), &client_sin_len)) == -1) 

答えて

2

を受け入れるときに、TCPとUDPのためsockaddr_inの同じコピーを使用できますが、彼らは別のソケットでなければなりません。

AF_INETで作成された特定のソケットは、SOCK_STREAMにTCPを指定するか、SOCK_DGRAMにUDPを指定します。

あなたはこの持っているのであれば:

struct sockaddr_in sin; 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = INADDR_ANY; 
sin.sin_port = htons(12345); 

をあなたはTCP/12345にバインドするTCPソケットでbindにこれを渡すことができ、あなたはUDPにバインドするUDPソケットにbindにそれを渡すことができます/ 12345。

+0

私はサーバーソケットを作成するのではなく、クライアントソケットを受け入れるときです。私は自分の投稿を編集しました。 –

+0

UDPの場合、あなたは 'accept'を呼び出しません。'sendto'を使ってリモートエンドのIP /ポートを指定するか、クライアントのIP /ポートを渡して' send'を呼び出す必要があります。そうすれば、 'send'は送信先を知ることができます。 – dbush

+0

@dbush実際、彼はtcpから得たsockaddrを使用してUDPでクライアントにメッセージを送信したいと考えています。 たとえば、私はTCPでクライアントを受け入れます。私は彼のsockaddr_inを得た。次に、sendto()関数でこのsockaddr_inを与えます。 –

1

TCPまたはUDPサーバーまたはクライアントで同じSOCAKADDR_IN構造を使用できますが、別のサーバーで使用する場合は、サーバーを同じポートにバインドできないため、ポートとアドレスの値を変更する必要があります。

我々はTCPサーバーおよびUDP Serverを実行している2つのリモートステーションを持っている場合ので、クライアントはそれらを接続するクライアントのための

SOCKET servTcp; // a remote bound and listing tcp socket waiting for remote clients through the blocking function `accept` 
SOCKET servUdp; // a remote bound Udp server waiting for clients 

//:今

SOCKET clientTcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
SOCKET clientUdp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

SOCKADDR_IN sa_serv; 
sa_serv.sin_addr.S_un.S_addr = inet_addr("127.168.0.1"); 
sa_serv.sin_family = AF_INET; 
sa_serv.sin_port = htons(777); 

ソケットclientTcpこのアドレス構造を使用してリモートtcpサーバに接続できます。

UDPサーバーに同じSOCKADDR_IN構造sa_servを使用する:

限り、我々は唯一のポートを変更し、同じリモートマシン上のTPCとUDPサーバなど:

sa_serv.sin_port = htons(1000); // the port is unique for servers to bind on. 

今、私たちは、 udpソケットclientUdpは、sa_servを使用してリモートudp servからデータを送受信できます。

  • SOCKADDR_INは、udpとtcpで同じですが、portの値を変更するだけで、サーバーの場合はアドレスすることもあります。
関連する問題