编程思路,在主程序中用来向指定服务器发送数据,在线程中用select模型来接收数据。实验中线程只能接收一次,后面select有返回值,显示有可读数据集,但recv却为0。
全局变量:
vector <SOCKET> m_socket;
fd_set fdSocket;
char s1[12];
主程序:
初始化:
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("1已连接2.212");
FD_SET(m_socket[0],&fdSocket);
}
if(::connect(m_socket[1],(sockaddr*)&servAddr,sizeof(servAddr))>-1)
{
m_msg.AddString("2已连接2.212");
FD_SET(m_socket[1],&fdSocket);
}
threadinfo.lpdlg=this;
CWinThread* pThread=AfxBeginThread(ThreadFunc,&threadinfo);
发送按钮BTN1:
::send(m_socket[1].s,s1,12,0);
线程代码:
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);
}
}
}
}
执行BTN,第一次的时候数据能接收到。但是后面按下,就一直收不到数据了。有高人能解惑吗?实在发现不了问题出在哪里。