我在使用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函数来获得适当的地址。现在它解决了这个问题。