0

我在使用 WSAAccept 函数时遇到了困难。我在 Windows Phone 平台上使用这个功能。MSDN 说 Windows Phone 支持此函数,但不幸的是,此函数永远不会返回 addr 参数指向的 sockaddr 结构的正确长度。即使我通过了ridicolouos 值,它在返回时也不会改变。

有没有人知道可以做些什么来解决这个问题以及这种行为的原因是什么?

我将不胜感激任何帮助。

编辑 这是该功能的使用方式:

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;

但因为 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,您必须传递一个指向 a 的指针sockaddr_in,而不是 a sockaddr。如果套接字系列是AF_INET6,则必须传递一个指向 a 的指针sockaddr_in6。在任何一种情况下,您都必须传递一个addrlen值,该值是sockaddr_....

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

我设法通过在接受函数后调用 getpeername 函数来获得正确的 addrlen。现在它解决了这个问题。

于 2015-07-30T11:36:59.293 回答