0

WSAAccept 関数の使用に問題があります。Windows Phone プラットフォームでこの機能を使用しています。MSDN によると、この関数は Windows Phone でサポートされていますが、残念ながら、この関数は addr パラメータが指す sockaddr 構造体の正しい長さを返しません。馬鹿げた値を渡しても、戻っても変わらない。

それを修正するために何ができるか、そのような動作の理由は何ですか?

どんな助けでも大歓迎です。

EDIT これは、関数がどのように使用されるかです:

sockaddr address;
int size = 28; //it is a max size of union in which it is stored address;

c=accept(s,&address,&size); //where s is the socket;

しかし、accept は Windows Phone プラットフォームではサポートされていないため、ラッパーがあります。

SOCKET accept(
        SOCKET s,
        struct sockaddr *addr,
        int *addrlen
        )
    {
        return c = WSAAccept(s, addr, addrlen, NULL, NULL);
    }
4

2 に答える 2

0

に無効なパラメータを渡していますWSAAccept()。ソケット ファミリが の場合、ではなくAF_INETへのポインタを渡す必要があります。ソケット ファミリがの場合は、へのポインタを渡す必要があります。いずれの場合も、 の実際のサイズである値を渡す必要があります。sockaddr_insockaddrAF_INET6sockaddr_in6addrlensockaddr_...

sockaddr_in address;
int size = sizeof(address);

c = accept(s, (sockaddr*)&address, &size);
if (c == INVALID_SOCKET)
{
    // failed, call WSAGetLastError() to find out why...
}

SOCKET accept(
        SOCKET s,
        struct sockaddr *addr,
        int *addrlen
        )
    {
        return WSAAccept(s, addr, addrlen, NULL, NULL);
    }
于 2015-07-28T15:20:32.317 に答える
0

accept 関数の後に getpeername 関数を呼び出すことで、適切な addrlen を取得できました。今のところ、問題は解決しました。

于 2015-07-30T11:36:59.293 に答える