接受返回大小未改变



我在使用WSAAccept功能时遇到了困难。我在Windows Phone平台上使用这个功能。MSDN说这个函数在Windows Phone上是支持的,但不幸的是,这个函数从来没有返回给我addr参数所指向的sockaddr结构的正确长度。即使我传递了一个荒谬的值,它也不会在返回时被改变。

有没有人有任何想法可以做些什么来解决这个问题,什么可能是这种行为的原因?

我将非常感谢你的帮助。

编辑函数是这样使用的:

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);
    }

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);
    }

我设法通过在接受函数之后调用getpeername函数来获得适当的地址。现在它解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新