时间:2019-05-16 标签:c++winsockacceptthrowedexception

问题描述

我使用的是 UE4 4.26.2 github 源代码,windows 10 1909,visual studio 2019。

代码

// 32-bit unsigned integer
typedef unsigned int        uint32;
// 64-bit unsigned integer
typedef unsigned long long  uint64;

template<typename T32BITS,typename T64BITS>
struct SelectIntPointerType<T32BITS,T64BITS,8>
{
    // Select the 64 bit type.
    typedef T64BITS TIntPointer;
};
typedef SelectIntPointerType<uint32,uint64,sizeof(void*)>::TIntPointer UPTRINT;

UPTRINT TcpsocketListen(uint16 Port)
{
    // See TcpsocketConnect() for why WSASocket() is used here.
    SOCKET Socket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,nullptr,WSA_FLAG_NO_HANDLE_INHERIT);

    sockaddr_in SockAddr;
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = 0;
    SockAddr.sin_port = htons(Port);
    int Result = bind(Socket,(SOCKADDR*)&SockAddr,sizeof(SockAddr));
    Result = listen(Socket,1);
    if (!TcpsocketSetNonBlocking(Socket,1))
    {
        closesocket(Socket);
        return 0;
    }

    return UPTRINT(Socket) + 1;
}

////////////////////////////////////////////////////////////////////////////////
int32 TcpsocketAccept(UPTRINT Socket,UPTRINT& Out)
{
    SOCKET Inner = Socket - 1;

    Inner = accept(Inner,nullptr);

}

static UPTRINT          GControlListen      = 0;
GControlListen = TcpsocketListen(1985);
UPTRINT Socket;
int Return = TcpsocketAccept(GControlListen,Socket);

调试时,visual studio 在 行:接受(内部,nullptr,nullptr);

输出: 在 0x00007FFCDF673B19 处抛出异常(在 UE4Editor-Win64-Debug.exe 中):Microsoft C++ 异常:内存位置 0x0000001F892FFC38 处的 int。

最好的祝福, 点

解决方法

关于接受的套接字文档:

参数 sockfd 是一个已创建的套接字 socket(2),使用 bind(2) 绑定到本地地址,并且是 侦听后侦听连接(2)。

所以第一个参数必须只是一个套接字描述符。 您正在将该套接字转换为指针,将地址加 1,这完全改变了套接字中返回值的值。然后传递该数字以接受并减去一。套接字库不知道该数字的含义并崩溃了。

只需在后续调用中使用从套接字库返回的原始值即可。