繁体   English   中英

套接字未创建Win32 C ++

[英]socket not creating win32 c++

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

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 : %d\n", 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 : %d\n", 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选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM