
利用MFC的基于對話框方式編程,現在的問題是每次除錯時,除錯到以下代碼
int a = SOCKET_Select(pChartRoom->m_ConnectSocket,100,TRUE);
if(a ){
//TCHAR szBuf[MAX_BUF_SIZE] = {0};//對快取區清零
ZeroMemory(szBuf,MAX_BUF_SIZE);
int iRet = recv(pChartRoom->m_ConnectSocket,(char*)szBuf,MAX_BUF_SIZE,0);時總是彈出登錄界面,獲取不到資料。
其主要的代碼為:
void CChartRoomDlg::OnBnClickedStartClient()
{
// TODO: 在此添加控制元件通知處理程式代碼
m_hConnectThread = CreateThread(NULL,0,ConnectThreadFunc,this,0,NULL);
}//創建連接執行緒
DWORD WINAPI ConnectThreadFunc(LPVOID lpParam) //客戶端的連接執行緒,用于接收訊息,不能發訊息
{
TCHAR szBuf[MAX_BUF_SIZE] = {0};//對快取區清零
CChartRoomDlg *pChartRoom = (CChartRoomDlg *)lpParam;//強制轉化為主對化框類,得到主對話框的指標
ASSERT(pChartRoom != NULL);
pChartRoom->m_ConnectSocket= socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//新建socket,保存在m_ConnectSocket中
if(pChartRoom->m_ConnectSocket == INVALID_SOCKET){//新建不成功呼叫資訊提示
AfxMessageBox(_T("新建SOCKET失敗"));
return FALSE;
}
CString strServIp; //strServIp為寬位元組
pChartRoom->GetDlgItemText(IDC_IP_ADDR,strServIp);//取得從界面輸入的IP地址放入strServIp中
int iPort = pChartRoom->GetDlgItemInt(IDC_CONNECT_PORT);//取得界面埠號放入iPort
if(iPort <= 0||iPort>65535){
AfxMessageBox(_T("請輸入合適的視窗:1~65536"));
}
char szIpAddr[16] = {0};//把從埠取得的數放入sockaddr_in這個結構中
USES_CONVERSION; //宏
strcpy_s(szIpAddr,16,T2A(strServIp));//把strServIp寬位元組轉化為窄位元組;WideCharToMultiByte也可以實作轉化
sockaddr_in service; //T2A為宏,最終呼叫API轉換函式
service.sin_family = AF_INET;
service.sin_port = htons(iPort);//把主機IP地址轉化為無符號short型
service.sin_addr.s_addr = inet_addr(szIpAddr);//獲取ip地址
int b=connect(pChartRoom->m_ConnectSocket,(struct sockaddr*)&service,sizeof(sockaddr_in));
if(b){
int ConnectErrorCode = WSAGetLastError();
AfxMessageBox(_T("連接失敗,請重試"));
return FALSE;
}
getsockopt(pChartRoom->m_ConnectSocket,SOL_SOCKET,SO_RCVBUF,(char*)&szBuf,(int*)&szBuf);
//回傳套接字選項資訊
pChartRoom->m_bIsServer = FALSE;
pChartRoom->ShowMsg(_T("系統資訊:連接服務器成功!"));
while(TRUE&&!(pChartRoom->bShutDown)){
//if(SOCKET_Select(pChartRoom->m_ConnectSocket,100,TRUE)){
int a = SOCKET_Select(pChartRoom->m_ConnectSocket,100,TRUE);
if(a ){
//TCHAR szBuf[MAX_BUF_SIZE] = {0};//對快取區清零
ZeroMemory(szBuf,MAX_BUF_SIZE);
int iRet = recv(pChartRoom->m_ConnectSocket,(char*)szBuf,MAX_BUF_SIZE,0);
if(iRet>0){
//right
pChartRoom->ShowMsg(szBuf);
}else{
//close socket
pChartRoom->ShowMsg(_T("聊天室服務器已停止,請重新進行連接"));
break; //跳出當前回圈(while)
}
}
Sleep(100);
}
closesocket(pChartRoom->m_ListenSocket);
WinSockUnload();
return TRUE;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/40532.html
標籤:網絡通信
