qq_37498822 2021-10-13 10:38 采纳率: 0%
浏览 61
已结题

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;
        }
    }
}

  • 写回答

3条回答 默认 最新

  • qq_37498822 2021-10-13 10:40
    关注

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

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月13日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line