C++ 在c++;窗户

C++ 在c++;窗户,c++,udp,codeblocks,winsock2,C++,Udp,Codeblocks,Winsock2,我正在编写一个UDP服务器作为应用程序的一部分。在以下代码段中: int ServerManager::onListen(void * data) { int numbytes; char buf[512]; socklen_t addrlen = sizeof(sockaddr_in); struct sockaddr_in addr; if((numbytes = recvfrom(listenSocket,buf, sizeof(buf),0,(SO

我正在编写一个UDP服务器作为应用程序的一部分。在以下代码段中:

int ServerManager::onListen(void * data)
{
    int numbytes;
    char buf[512];
    socklen_t addrlen = sizeof(sockaddr_in);
    struct sockaddr_in addr;
    if((numbytes = recvfrom(listenSocket,buf, sizeof(buf),0,(SOCKADDR*) &addr, &addrlen)
    == -1))
    {
        std::cout << "recv error:" << WSAGetLastError();
        return -1;
    }
    std::cout << "done";
    return 0;
}
int ServerManager::onListen(void*data)
{
整数单位;
char-buf[512];
socklen_t addrlen=sizeof(sockaddr_in);
地址中的结构sockaddr\u;
if((numbytes=recvfrom(listenSocket、buf、sizeof(buf)、0、(SOCKADDR*)和addr以及addrlen)
== -1))
{

std::cout错误是由套接字的设置引起的。 将ai_系列从“AF_unsec”更改为“AF_INET”解决了本例中的问题,但为了保持ipv6兼容性,代码修改如下

int ServerManager::onListen(void * data)
{
    int numbytes;
    char buf[MAXBUFLEN];
    SOCKADDR_STORAGE addr;
    socklen_t addrlen = sizeof(addr);
    if((numbytes = recvfrom(listenSocket,buf, sizeof(buf),0,(LPSOCKADDR) &addr, &addrlen)
    == -1))
    {
        std::cout << "recv error:" << WSAGetLastError();
        return -1;
    }
    std::cout << "done";
    return 0;
}
int ServerManager::onListen(void*data)
{
整数单位;
char-buf[MAXBUFLEN];
存储地址;
socklen_t addrlen=sizeof(addr);
if((numbytes=recvfrom(listenSocket,buf,sizeof(buf),0,(LPSOCKADDR)&addr,&addrlen)
== -1))
{

std::cout是您实际的代码吗?是的。listenSocket等的绑定在一个单独的类函数中。如果相关,我可以发布它(但它相当长,运行良好)。它不是ipv6数据包,是吗?您是否尝试过将addr设为SOCKADDR和
addrLen=sizeof(addr)
?啊!修复了它。套接字被设置为AF_unsec而不是AF_INET。更改它解决了问题。@kfsone:
SOCKADDR
SOCKADDR\u中的
SOCKADDR\u相同,原因是历史原因。您可能指的是
SOCKADDR\u存储
,它保留了足够的空间来容纳任何IPv4或IPv6地址。