簡體   English   中英

時間:2019-05-16 標簽:c++winsockacceptthrowedexception

[英]c++ winsock accept thrown exception

我使用的是 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 在行中捕獲 C++ 異常:accept(Inner, nullptr, nullptr);

輸出:在 0x00007FFCDF673B19(在 UE4Editor-Win64-Debug.exe 中)拋出的異常:Microsoft C++ 異常:內存位置 0x0000001F892FFC38 處的 int。

最好的祝福,Dian

接受的套接字文檔:

參數 sockfd 是一個使用 socket(2) 創建的套接字,使用 bind(2) 綁定到本地地址,並在 listen(2) 之后偵聽連接。

所以第一個參數必須只是一個套接字描述符。 您正在將該套接字轉換為指針,將地址加 1,這完全改變了套接字中返回值的值。 然后傳遞該數字以接受並減去一。 套接字庫不知道該數字的含義並崩潰了。

只需在后續調用中使用從套接字庫返回的原始值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM