4

関数の使用に問題がありgetsocknameます。私はこのコードを持っています:

struct sockaddr sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, &sa, &sa_len) != SOCKET_ERROR)
{
   ///
}
else
{
   int error = WSAGetLastError();
   //error here WSAEFAULT always
}

ご覧のとおり、getsockname 関数を使用すると常にエラーが発生します。エラー - WSAEFAULT。しかし、なぜ?構造と構造のサイズは正しいのに、なぜこれが起こるのですか?

WSAEFAULT 説明:

name または namelen パラメーターがユーザー・アドレス・スペースの有効な部分ではないか、namelen パラメーターが小さすぎます。

ps アプリケーションは 64 ビットです

ありがとう!

4

2 に答える 2

4

ソケットstruct sockaddrアドレスを受け入れるには小さすぎます。などの適切なサイズの構造体を使用するか、アドレスを格納するのに十分な大きさであることが保証されている をstruct sockaddr_in使用することをお勧めします。struct sockaddr_storageを使用するsockaddr_storageと、最小限の調整で IPv4 と IPv6 の両方を簡単にサポートできます。

編集されたコード:

struct sockaddr_storage sa;
int sa_len;
sa_len = sizeof(sa);
if (getsockname(socketfd, (struct sockaddr *)&sa, &sa_len) != SOCKET_ERROR)
于 2013-01-31T11:26:52.027 に答える
1

一般的なstruct sockaddrの代わりに、プロトコルに指定されたもの、つまり IPv4 アドレス用の *struct sockaddr_in* を使用します。完全な例については、こちらを参照してください。

于 2013-01-31T11:27:18.337 に答える