visual studio MFC connect失败问题

请各位帮忙看一下问题。
在写一个程序,需要在后台进行socket连接,可是发现除了在button进程中connect连接成功,在Ontimer或单独thread都失败。
ontimer和AfxBeginThread的实现:

void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch (nIDEvent)
    {
    case 1:
        int ck = 1;
        int result_id;
        int i = 1;
        m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
        if (INVALID_SOCKET == m_socket[i]) {
            ck = 0;
            MessageBox("创建套接字失败!");
            return;
        }

        if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], m_hWnd, UM_SOCK1, FD_READ))
        {
            ck = 0;
            MessageBox("注册网络读取事件失败!");
            //return FALSE;
        }

        SOCKADDR_IN addrSrv;
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(tcp_local_port);
        addrSrv.sin_addr = tcp_local_ip;
        tcp_local_port += 1;

        bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

        // SOCKADDR_IN addrSrv;
        CString remote_ip_str;
        CString remote_port_str;

        if (remote_ip_str.IsEmpty()) {
            addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
        }
        else {
            addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
        }

        if (remote_port_str.IsEmpty()) {
            addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
        }
        else {
            u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
            addrSrv.sin_port = htons(port);
        }

        addrSrv.sin_family = AF_INET;

        remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
        remote_port_str.Format("%d", htons(addrSrv.sin_port));

        result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
        if (result_id < 0)
        {
            ck = 0;
            //MessageBox("连接yeelink失败"); 
            return;
        }
    }
    CDialog::OnTimer(nIDEvent);
}

UINT ThreadFunc(LPVOID lpParam)
{
    int ck=1;
    int result_id;
    HWND* m_hWnd = (HWND*)lpParam;
    CString remote_ip_address[10];

    while (1)
    {
        for (int i = 1; i <= 9; i++)
        {
            remote_ip_address[1].Format("192.168.31.29", i);
#if 1
            if (m_socket[i] == NULL)
            {
                m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
                if (INVALID_SOCKET == m_socket[i]) {
                    ck = 0;
                    //    MessageBox("创建套接字失败!");
                    return 0;
                }
            }
            if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], *m_hWnd, UM_SOCK1, FD_READ))
            {
                ck = 0;
            //    MessageBox("注册网络读取事件失败!");
                if (m_socket[i])
                {
                    shutdown(m_socket[i], SD_BOTH);
                    closesocket(m_socket[i]);
                }
                break;
            }

            SOCKADDR_IN addrSrv;
            addrSrv.sin_family = AF_INET;
            addrSrv.sin_port = htons(tcp_local_port);
            addrSrv.sin_addr = tcp_local_ip;
            tcp_local_port += 1;

            bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

            // SOCKADDR_IN addrSrv;
            CString remote_ip_str;
            CString remote_port_str;

            if (remote_ip_str.IsEmpty()) {
                addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_address[i]);
        //        addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
            }
            else {
                addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
            }

            if (remote_port_str.IsEmpty()) {
                addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
            }
            else {
                u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
                addrSrv.sin_port = htons(port);
            }

            addrSrv.sin_family = AF_INET;

            remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
            remote_port_str.Format("%d", htons(addrSrv.sin_port));

            result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
            if (result_id < 0)
            {
                ck = 0;
                break;
                //MessageBox("连接yeelink失败"); 
            }
            cmd_start_flag = 1;
#endif
        }
        Sleep(1);
    }
    return 0;
}

void CTimerDlg::OnBUTTONPalayPause()
{
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    int i=1;
    int ck;
    int result_id;

    if (!cmd_start_flag)
    {
        cmd_start_flag = 1;
        InitSocket();
//        pReadAviThread = AfxBeginThread(ThreadFunc, &m_hWnd);
        SetTimer(1, 1000, 0);
#if 0
        m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
        if (INVALID_SOCKET == m_socket[i]) {
            ck = 0;
            MessageBox("创建套接字失败!");
            return;
        }

        if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], m_hWnd, UM_SOCK1, FD_READ))
        {
            ck = 0;
            MessageBox("注册网络读取事件失败!");
            //return FALSE;
        }

        SOCKADDR_IN addrSrv;
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(tcp_local_port);
        addrSrv.sin_addr = tcp_local_ip;
        tcp_local_port += 1;

        bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

        // SOCKADDR_IN addrSrv;
        CString remote_ip_str;
        CString remote_port_str;

        if (remote_ip_str.IsEmpty()) {
            addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
        }
        else {
            addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
        }

        if (remote_port_str.IsEmpty()) {
            addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
        }
        else {
            u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
            addrSrv.sin_port = htons(port);
        }

        addrSrv.sin_family = AF_INET;

        remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
        remote_port_str.Format("%d", htons(addrSrv.sin_port));

        result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
        if (result_id < 0)
        {
            ck = 0;
            //MessageBox("连接yeelink失败"); 
            return;
        }
#endif
    }
    else {
        if (pReadAviThread)
            WaitForSingleObject(pReadAviThread->m_hThread, INFINITE);
        for (int i = 1; i <= 9; i++)
        {
            if (m_socket[i])
            {
                shutdown(m_socket[i], SD_BOTH);
                closesocket(m_socket[i]);
            }
        }
        cmd_start_flag = 0;
        }
    }
}

通过断点检查socket等参数都没有发现问题,可就是在connect时返回-1

请问楼主这个架构
主线程创建的socket 在子线程 close会报错吗?
看起来是异步的 客户端程序 服务器那边监听accept也异步的吗?

已经解决,是因为非阻塞问题,加判断即可。