【问题标题】:c++ winsock accept thrown exceptionc++ winsock接受抛出的异常
【发布时间】:2021-09-24 21:48:00
【问题描述】:

我使用的是 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, 0, 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, 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。

最好的祝愿, 滇

【问题讨论】:

  • 为什么是Socket - 1?你希望你的代码做什么?究竟是什么问题?
  • visual studio 在函数“accept”中捕获 c++ 异常。
  • 请提取并提供minimal reproducible example 并将其与完整的错误输出一起包括在内。作为这里的新用户,也可以使用tour 并阅读How to Ask
  • 您最近的编辑似乎不包括接受电话?请提供minimal reproducible example
  • 感谢您的回复。现在我完成了代码。

标签: c++ winsock unreal-engine4


【解决方案1】:

接受的套接字文档:

参数 sockfd 是一个使用 socket(2),使用 bind(2) 绑定到本地地址,并且是 监听后监听连接(2)。

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

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

【讨论】:

  • 感谢您的回复。当我使用原始值 sockfd 时,它运行良好。但在 unrealengine4 中,这些调用可能是为了跨平台兼容性或其他......
  • 我不明白这一点。是否有教程推荐强制转换为 UPTRINT(Socket) + 1 然后将 sizeof (unsigned int) 添加到 Socket 的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多