次のコードを検討してください。
{
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() が必要ないことがわかりました。しかし、パケットの送信元ポートを設定する方法は?