リッスン ソケットを持つ単純な winsock サーバーがあり、接続が受け入れられると、そのソケットがソケットの配列に格納されるとします (複数の接続を許可するため)。特定の接続の IP アドレスを取得するにはどうすればよいですか? ソケットハンドルに収納されていますか?
質問する
12335 次
2 に答える
8
ソケットが接続されている限り、自分のソケット アドレスとピア ソケット アドレスの両方を取得できます。
getsocknameは、ローカル名 (つまり、パイプの側から) を提供しますgetpeernameは、ピア名 (つまり、パイプの遠い側から) を提供します
この情報は、ソケットが開いている/接続されている場合にのみ使用できるため、ピアが切断された後に使用できる場合は、どこかに保存するとよいでしょう。
于 2013-03-13T10:21:03.783 に答える
6
はい、構造体に格納されていsocketaddr_in
ます。次を使用して抽出できます。
SOCKADDR_IN client_info = {0};
int addrsize = sizeof(client_info);
// get it during the accept call
SOCKET client_sock = accept(serv, (struct sockaddr*)&client_info, &addrsize);
// or get it from the socket itself at any time
getpeername(client_sock, &client_info, sizeof(client_info));
char *ip = inet_ntoa(client_info.sin_addr);
printf("%s", ip);
于 2013-03-13T10:16:20.333 に答える