套接字未创建win32 c++

socket not creating win32 c++

本文关键字:c++ win32 创建 套接字      更新时间:2023-10-16

我正在创建一个套接字。它第一次很容易工作,然后我停止套接字并重新生成它给我错误

class MainServer{
private:
    SOCKET soo;
public:
    // I have Basically Created Server Socket in this Function
    // And passed it
    SOCKET socket_control_mob(){
        struct sockaddr_in server;
        WSADATA wsa;
        printf("nInitialising Winsock...");
        if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
        {
            printf("Failed. Error Code : %d", WSAGetLastError());
            MessageBox(NULL, TEXT("Failed"), L"Failed", NULL);
            soo = NULL;
            return soo;
        }
        printf("Initialised.n");
        //MessageBox(NULL, TEXT("Initialised"), L"Simple Message", NULL);
        //Create a socket
        if ((soo = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
        {
            printf("Could not create socket : %d", WSAGetLastError());
            MessageBox(NULL, TEXT("Socket Not Created1"), L"Failed", NULL);
            soo = NULL;
            return soo;
        }
        printf("Socket created.n");
        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(8890);
        //Bind
        if (bind(soo, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
        {
            printf("Bind failed with error code : %d", WSAGetLastError());
            MessageBox(NULL, TEXT("Binding Error"), L"Failed", NULL);
            soo = NULL;
            return soo;
        }
        puts("Bind done");
        //MessageBox(NULL, TEXT("Bind Done"), L"Simple Message", NULL);
        return soo;
    }
    bool server_close_socket(){
            closesocket(soo);
            WSACleanup();
            return true;
    }
};

我通过调用创建了一个套接字

MainServer s;
s.socket_control_mob()

我已停止的套接字

s.server_close_socket()

套接字在停止后不会创建

您处理套接字,甚至WinSock库本身都不正确。试试类似的东西:

class MainServer
{
private:
    SOCKET soo;
    bool init;
public:
    MainServer()
        : soo(INVALID_SOCKET), init(false)
    {
        WSADATA wsa;
        printf("nInitialising Winsock...");
        int err = WSAStartup(MAKEWORD(2, 2), &wsa);
        if (err != 0)
        {
            printf("Failed. Error Code : %dn", err);
            MessageBox(NULL, L"WSAStartup Failed", L"Failed", NULL);
        }
        else
        {
            init = true;
            printf("Initialized.n");
            //MessageBox(NULL, L"Initialized", L"Simple Message", NULL);
        }
    }
    ~MainServer()
    {
        close_server_socket();
        if (init)
            WSACleanup();
    }
    SOCKET socket_control_mob()
    {
        struct sockaddr_in server = {0};
        close_server_socket();
        //Create a socket
        soo = socket(AF_INET, SOCK_STREAM, 0);
        if (soo == INVALID_SOCKET)
        {
            printf("Could not create socket. Error Code : %dn", WSAGetLastError());
            MessageBox(NULL, L"Socket Not Created", L"socket Failed", NULL);
            return INVALID_SOCKET;
        }
        printf("Socket created.n");
        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons(8890);
        //Bind
        if (bind(soo, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
        {
            printf("Bind failed. Error Code : %d", WSAGetLastError());
            MessageBox(NULL, L"Binding Error", L"bind Failed", NULL);
            close_server_socket();
            return INVALID_SOCKET;
        }
        printf("Bind done.n");
        //MessageBox(NULL, L"Bind Done", L"Simple Message", NULL);
        return soo;
    }
    void server_close_socket()
    {
        if (soo != INVALID_SOCKET)
        {
            closesocket(soo);
            soo = INVALID_SOCKET;
        }
    }
};

这是众所周知的事情。您创建的套接字处于FIN_WAIT状态。为了避免这个问题,在重新运行程序之前等待2分钟,遵循"优雅关闭"协议或为套接字提供SO_REUSEADDR选项。