6

リッスン ソケットを持つ単純な winsock サーバーがあり、接続が受け入れられると、そのソケットがソケットの配列に格納されるとします (複数の接続を許可するため)。特定の接続の IP アドレスを取得するにはどうすればよいですか? ソケットハンドルに収納されていますか?

4

2 に答える 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 に答える