套接字没有创建win32 c++

Posted

技术标签:

【中文标题】套接字没有创建win32 c++【英文标题】:socket not creating win32 c++ 【发布时间】:2015-11-02 14:00:52 【问题描述】:

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

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()

套接字停止后不创建

【问题讨论】:

您在两次运行之间等待多长时间?究竟出了什么问题? 第一次执行套接字我没有收到任何错误第二次弹出“套接字未创建1”消息并且套接字未创建。我在 5 秒后停止套接字并重新创建套接字然后我得到错误 WSAGetLastError() 的值是多少? 我得到 WSAGetLastError() 的值为 6 错误 6 (ERROR_INVALID_HANDLE) 不是 WinSock 错误代码。 WinSock 错误超过 10000 个。此外,如果bind() 失败,您的代码会泄漏SOCKET。一旦socket() 返回一个有效的套接字,您必须在使用完毕后调用closesocket() 来释放它。如果bind() 失败,您必须关闭它。而soo = NULL 完全是错误的,您必须改用soo = INVALID_SOCKET。并且server_close_socket() 应该在关闭套接字后设置soo = INVALID_SOCKET 【参考方案1】:

您错误地处理了套接字,甚至是 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;
        
    
;

【讨论】:

【参考方案2】:

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

【讨论】:

@ElderBug OP 确实做到了。然而,看到这个问题出现了数百万次,我有理由怀疑 OP 误解了这个问题。想打赌,比如说,50 的声誉? OP 说他得到“Socket Not Created1”。如果您阅读他的代码,当socket() 失败时会打印此错误,而不是bind()。绑定是在那之后,并且不打印同样的东西。 如果我等待 2 分钟然后我没有收到任何错误但我无法从客户端发送请求

以上是关于套接字没有创建win32 c++的主要内容,如果未能解决你的问题,请参考以下文章

win32 基础数据发送与接收

win32 基础数据发送与接收

C++ 套接字 - 客户端给出分段错误(linux)

win-socket

在套接字 C++ 中选择不起作用

在西雅图 C++ Builder 10 中使用 Web.Win.Sockets