Puzzle rencontré dans la programmation de socket Select

Questions et réponses du rseoc 2021-12-30 13:57:29 阅读数:669

puzzle rencontr dans la programmation

Idées de programmation,Utilisé dans le programme principal pour envoyer des données au serveur spécifié,Utilisation dans les filsselectModèle pour recevoir les données.Le thread ne peut recevoir qu'une seule fois dans l'expérience,DerrièreselectAvec valeur de retour,Afficher les ensembles de données lisibles,Mais...recvMais pour0.

Variables globales:

vector <SOCKET> m_socket;
fd_set fdSocket;

char s1[12];

Procédure principale:

Initialisation:

        int netID=0;
        
        s1[0]=(netID & 0xff00)>>8;
        s1[1]=netID & 0x00ff;
        s1[2]=0x00;
        s1[3]=0x00;
        s1[4]=0x00;
        s1[5]=0x06;
        s1[6]=0x01;
        s1[7]=0x03;
        s1[8]=0x00;
        s1[9]=0x01;
        s1[10]=0x00;
        s1[11]=0x0A;


    CInitSock initSock;
    
    servAddr.sin_family=AF_INET;
    servAddr.sin_port=htons(502);

m_socket.resize(2);
    m_socket[0]=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    m_socket[1]=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    FD_ZERO(&fdSocket);
    servAddr.sin_addr.S_un.S_addr=inet_addr("192.168.2.212");
    if(::connect(m_socket[0],(sockaddr*)&servAddr,sizeof(servAddr))>-1)
    {
        m_msg.AddString("1Connecté2.212");
        FD_SET(m_socket[0],&fdSocket);
    }
    if(::connect(m_socket[1],(sockaddr*)&servAddr,sizeof(servAddr))>-1)
    {
        m_msg.AddString("2Connecté2.212");
        FD_SET(m_socket[1],&fdSocket);
    }

threadinfo.lpdlg=this;

CWinThread* pThread=AfxBeginThread(ThreadFunc,&threadinfo);

Envoyer le boutonBTN1:

::send(m_socket[1].s,s1,12,0);

Code thread:

Threadinfo* pInfo=(Threadinfo*)lpParam;

CListBox *pListBox=nullptr;
    pListBox=(CListBox *)pInfo->lpdlg->GetDlgItem(IDC_LIST1);

while(true)
    {
        fd_set fdRead=fdSocket;
        int nRet = select(0, &fdRead, NULL, NULL, NULL);
        if(nRet>0)
        {
            for(int i=0;i<(int)fdSocket.fd_count;i++)
            {
                if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
                {
                    char szText[256];
                    int nRecv=::recv(fdSocket.fd_array[i],szText,strlen(szText),0);
                    szText[nRecv]='\0';
                    CString str1,str2;
                    str1="";
                    for(int j=0;j<nRecv;j++)
                    {
                        str2.Format("%02x ",szText[j]);
                        str1+=str2;
                    }
                    CString msg=szText;
                    pListBox->AddString(str1);
                    FD_CLR(fdSocket.fd_array[i],&fdRead);
                }
            }
        }
    }

Mise en œuvreBTN, La première fois que les données sont reçues . Mais appuyez à l'arrière , Je n'ai jamais reçu de données . Y a - t - il quelqu'un de haut placé qui puisse résoudre le mystère ? Je ne sais pas où est le problème .

版权声明:本文为[Questions et réponses du rseoc]所创,转载请带上原文链接,感谢。 https://primo.wiki/2021/12/202112231449171050.html