18,356
社区成员
发帖
与我相关
我的任务
分享
DWORD CTalkDialog::TextOrFileSend(LPVOID lpParameter) //这里利用SELECT这个函数,作为消息中心!
{
CTalkDialog *pTalkDialog=(CTalkDialog*) lpParameter;
fd_set AllSocket;//包含了文本通讯的socket与文件传输的socket;
fd_set WirteSocket;
fd_set ReadSocket;
FD_ZERO(&AllSocket);
//FD_SET(pTalkDialog->m_ServTxSock,&AllSocket);
//FD_SET(pTalkDialog->m_CliTxSock,&AllSocket);
while(TRUE)
{
FD_ZERO(&WirteSocket);
FD_ZERO(&ReadSocket);
FD_SET(pTalkDialog->m_CliTxSock,&WirteSocket);
FD_SET(pTalkDialog->m_ServTxSock,&ReadSocket);
int nRect=select(0,&ReadSocket,&WirteSocket,0,0);
if(nRect>0)
{
if(FD_ISSET(pTalkDialog->m_ServTxSock,&ReadSocket))
{
pTalkDialog->RecvText();
}
if(FD_ISSET(pTalkDialog->m_CliTxSock,&WirteSocket))
{
pTalkDialog->m_TxFlag=TRUE;
}
}
Sleep(1);
}
return 0;
}
void CTalkDialog::OnSendTextBtn()
{
// TODO: 在此添加控件通知处理程序代码
if(m_TxFlag==TRUE)
{
//m_TxFlag=FALSE;
CString str;
GetDlgItem(IDC_SendEdit)->GetWindowText(str); //得到发送RICHEDIT中的文本!
USES_CONVERSION;
LPSTR lpText = W2A(str); //转化为 char* ==LPSTR
CTime time=CTime::GetCurrentTime();
CString Str_time=time.Format("%H:%M:%S");
Str_time+=" ";
Str_time+=str;
sendto(m_CliTxSock,lpText,strlen(lpText),0,(SOCKADDR*)&m_SendTxServInfo,sizeof(SOCKADDR));
GetDlgItem(IDC_SendEdit)->SetWindowTextW(L""); //点击发送后将发送文本框的内容消除!
CString Strall;
GetDlgItem(IDC_RecvEdit)->GetWindowText(Strall);// cstring==LPCTSTR;
Strall+=Str_time;
Strall+="\r\n"; //这样后,并不会换行,要设置RICHEDIT的属性Auto HScroll 设置为FALSE 、Multiline 设置为True
GetDlgItem(IDC_RecvEdit)->SetWindowText(Strall);
//}
}
void CTalkDialog::RecvText()
{
char RecvBuf[10000];
SOCKADDR_IN RecvTxCliInfo;
int len=sizeof(SOCKADDR);
recvfrom(m_ServTxSock,RecvBuf,10000,0,(SOCKADDR*)&RecvTxCliInfo,&len);
CTime time=CTime::GetCurrentTime();
CString Str_time=time.Format("%H:%M:%S");
CString str(Str_time);
str+=" ";
str+=RecvBuf;
str+="\r\n";
CString GetStr;
GetDlgItem(IDC_RecvEdit)->GetWindowText(GetStr);
GetStr+=str;
GetDlgItem(IDC_RecvEdit)->SetWindowText(GetStr);
}