0

次のコードを検討してください。

{
    int Socket1 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    sockaddr_in SrcSockAddr;
    SrcSockAddr.sin_family = PF_INET;
    SrcSockAddr.sin_addr.s_addr = inet_addr("192.168.1.2");
    SrcSockAddr.sin_port = htons(5061);

    if( -1 == bind(Socket1, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )
       exit(1);

    sockaddr_in DstSockAddr;
    DstSockAddr.sin_family = PF_INET;
    DstSockAddr.sin_addr.s_addr = inet_addr("192.168.1.3");
    DstSockAddr.sin_port = htons(5061);

    if( connect(Socket1, (sockaddr*)&DstSockAddr, sizeof(DstSockAddr)) )
        exit(2);


    int Socket2 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    if( -1 == bind(Socket2, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )
        exit(3);

    DstSockAddr.sin_port = htons(5062);
    if( connect(Socket2, (sockaddr*)&(DstSockAddr), sizeof(DstSockAddr)) )
        exit(4);

    exit(0);
}

両方のアドレスが正しいと仮定すると、実行結果は 3 になります。2 つのソケットを 1 つのアドレスにバインドすることはできませんが、これは完全に理にかなっています。
ただし、サーバーの状況では、accept() は connect() のような結果コードではなく、別の記述子を返します。したがって、1 つのアドレスに対して複数の着信接続を行うことができますが、発信接続は 1 つだけです。

これには何か理由がありますか?


編集:
ええと、bind() が必要ないことがわかりました。しかし、パケットの送信元ポートを設定する方法は?

4

2 に答える 2

0

2 つのソケット プロセスを同じ にバインドしていstructaddr.PORTます。あなたができないこと。別のポート番号を持つ別の socketaddr 構造体を変更すると、問題ないはずです。IP+PORT は一意である必要があります。

if( -1 == bind(Socket1, (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) )

 if( -1 == bind(Socket2,
 (sockaddr*) &SrcSockAddr, sizeof (SrcSockAddr)) ) //SrcSockAddr already in use
于 2012-10-15T06:08:52.197 に答える
0

2 つのソケットを同じ IP:port にバインドすることはできません。ただしaccept()、IP:port にバインドされているリッスン ソケットから、保留中のインバウンド接続と同じ数のソケットを使用できます。bind()これらのソケットはすべて、その IP:port をローカル アドレスとして持っていますが、関数によってではなく、リッスンしているソケットからそれを継承しているためです。

于 2012-10-15T06:22:52.137 に答える