WSAAccept返回大小不变

时间:2015-07-26 11:17:26

标签: winapi network-programming winsock2 windows-networking

我在使用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平台不支持accept,所以我有一个包装器:

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

2 个答案:

答案 0 :(得分:0)

您将无效参数传递给WSAAccept()。如果套接字系列为AF_INET,则必须将指针传递给sockaddr_in,而不是sockaddr。如果套接字族为AF_INET6,则必须将指针传递给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);
    }

答案 1 :(得分:0)

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