⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messageserverdlg.cpp

📁 我为聊狂的聊天软件,又一款UDP聊天软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		//向所有用户更新用户列表
		Send_User(tempInfo.petName, i_myIcon );
	}
}

//发送线程
UINT CMessageServerDlg::SendThread  (LPVOID clientSocket)
{
	SOCKET mySocket;
	mySocket = (SOCKET)clientSocket;

	char recvBuffTemp[500];
	char *recvBuff;
	CWinThread *now;
	

	mutex.Lock ();  //实现互斥
	strcpy(recvBuffTemp, send_Data.data );
	now = send_Data.thread ;
	mutex.Unlock ();   //解除互斥

	recvBuff = recvBuffTemp;

	if(strcmp(recvBuff, "closed") ==0)  //如果是要求关闭SOCKET
	{
		if( mySocket != INVALID_SOCKET )
		{
			send(mySocket, "closed", strlen("closed"), 0);

			//断开与客户机的连接
			closesocket(mySocket);
		}
		AfxEndThread(0);
	}
	else 
	{
		//取得消息类型
		char *pos;
		char messageStyle[20];
		int i, count;

		pos = strchr(recvBuff, '~');
		count = strlen(recvBuff) - strlen(pos);
		for(i=0; i< count; ++i)
		{
			messageStyle[i] = recvBuff[i];
		}
		messageStyle[i] = '\0';
		recvBuff = pos +1;

		//判断消息类型
		if(strcmp(messageStyle, "userInfoList") ==0)
		{
			send(mySocket, "userInfoList", strlen("userInfoList")+1, 0);
			send(mySocket,recvBuff, strlen(recvBuff) +1, 0);
		}
		else if(strcmp(messageStyle, "message") ==0)
		{
			//开始转发数据
		    send(mySocket, recvBuff, strlen(recvBuff) +1, 0);
		}

		now->SuspendThread ();  //实现自身挂起
	}
	return TRUE;
}


//接收进程
UINT CMessageServerDlg::RecvThread(LPVOID clientSocket)
{
	SOCKET mySocket;
	mySocket = (SOCKET)clientSocket;
	
	socket_Info tempSocketInfo;
	CUserInfo tempUserInfo;

	POSITION pos;
	POSITION pos2;
	
	//不断接收用户的输入
	while(1)
	{
		char strTemp[500];
		int iStatus;
		
		iStatus = ::recv(mySocket, strTemp, 500, 0);
		
		if(iStatus >0)
		{
			strTemp[iStatus]='\0';
		
			//***********************************************
			if(strcmp(strTemp, "closed") == 0)  //如果是关闭消息
			{
				//查找是否有这位用户
				pos = socket_List.GetHeadPosition ();
				pos2 = user_List.GetHeadPosition ();
				
				if(pos!=NULL || pos2!=NULL)
				{
					do
					{
						if(pos !=NULL)
						{
						    tempSocketInfo = socket_List.GetNext (pos);
						}
						if(pos2 != NULL)
						{
							tempUserInfo = user_List.GetNext (pos2);
						}

						
						if(tempSocketInfo.client_Socket == mySocket)
						{
							//如果找到了
							mutex.Lock ();  //实现互斥
							strcpy(send_Data.data , strTemp);
							send_Data.thread = tempSocketInfo.thread ;
							mutex.Unlock ();
							send_Data.thread->ResumeThread ();  //线程恢复
		
							break;
						}
					}while(pos!=NULL);
				}  //end if(pos!=NULL)
				
				if(pos != NULL)
				{
					socket_List.GetPrev (pos);
					socket_List.RemoveAt (pos);  //删除该记录
				}
				if(pos2 != NULL)
				{
					user_List.GetPrev (pos2);
					user_List.RemoveAt (pos2);
				}

				AfxEndThread(0);  //关闭套接字并退出线程
			}
			//end if关闭消息处理结束

			//*******************如果是其它消息******************
			else
			{
				char *temp;
				char strPetName[20];

				temp = strchr(strTemp, ',');
				int iCount = strlen(strTemp) - strlen(temp)-1;
				for(int i=0; i< iCount; ++i)
				{
					strPetName[i] = strTemp[i+1];
				}
				strPetName[i] = '\0';
				
				//查找是否有这位用户
				pos = socket_List.GetHeadPosition ();
				if(pos!=NULL)
				{
					CString tempPetName;
					tempPetName.Format ("%s", strPetName);
					do
					{
						tempSocketInfo = socket_List.GetNext (pos);
						
						if(tempSocketInfo.petName .Compare (tempPetName) ==0)
						{
							//如果找到了
							mutex.Lock ();  //实现互斥
							sprintf(send_Data.data ,"message~%s\0",  strTemp);
							send_Data.thread = tempSocketInfo.thread ;
							mutex.Unlock ();
							send_Data.thread->ResumeThread ();  //线程恢复
							break;
						}
					}while(pos!=NULL);
				}  //end if(pos!=NULL)
			} //end else
			//***************一般消息处理结束****************

		}  //end if(iStatus>0)
	}  //end while(1)
	return TRUE;
}

void CMessageServerDlg::GetUserInfo(char *recvData)
{
	int len;
	//开始保存用户信息
	char temp[10];
	char *pos;
	int i;
	
	//头像号
	pos = strchr(recvData, ','); 
	len = strlen(recvData) - strlen(pos);
	for(i=0; i < len; ++i)
	{
		temp[i] = recvData[i];
	}
	temp[i]='\0';
	userInfo.m_imyIcon  =atoi(temp) -1 ;
	recvData = pos+1;
	
	//妮名
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strPetName [i] = recvData[i];
	}
	userInfo.m_strPetName [i] ='\0';
	recvData= pos+1;
	
	//年龄
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i < len; ++i)
	{
		temp[i] = recvData[i];
	}
	temp[i]='\0';
	userInfo.m_iAge =atoi(temp);
	recvData = pos+1;
	
	//性别
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strSex  [i] = recvData[i];
	}
	userInfo.m_strSex  [i] ='\0';
	recvData= pos+1;
	
	//密码
	
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strPassword  [i] = recvData[i];
	}
	userInfo.m_strPassword  [i] ='\0';
	recvData= pos+1;
	
	//真名
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strRealName  [i] = recvData[i];
	}
	userInfo.m_strRealName  [i] ='\0';
	recvData= pos+1;
	
	//生肖
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strSx  [i] = recvData[i];
	}
	userInfo.m_strSx  [i] ='\0';
	recvData= pos+1;
	
	//血型
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strBlood  [i] = recvData[i];
	}
	userInfo.m_strBlood  [i] ='\0';
	recvData= pos+1;
	
	//星座
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strConstallation  [i] = recvData[i];
	}
	userInfo.m_strConstallation  [i] ='\0';
	recvData= pos+1;
	
	//学校
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strSchool   [i] = recvData[i];
	}
	userInfo.m_strSchool   [i] ='\0';
	recvData= pos+1;
	
	//工作
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strJob   [i] = recvData[i];
	}
	userInfo.m_strJob   [i] ='\0';
	recvData= pos+1;
	
	//主页
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strHoemPage   [i] = recvData[i];
	}
	userInfo.m_strHoemPage   [i] ='\0';
	recvData= pos+1;/////////////////////
	
	//地址
	
	pos = strchr(recvData, ',');
	len = strlen(recvData) - strlen(pos);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strAddress   [i] = recvData[i];
	}
	userInfo.m_strAddress   [i] ='\0';
	recvData= pos+1;
	
	//电子邮件
	len= strlen(recvData);
	for(i=0; i<len ; ++i)
	{
		userInfo.m_strMail   [i] = recvData[i];
	}
	userInfo.m_strMail   [i] ='\0';
	recvData= pos+1;
}


//输出在线用户列表
//**编得好苦呀,多线程今日总算体会到了它的难度,不过成功就好
void CMessageServerDlg::Send_User(CString new_User, int i_myIcon)
{
	POSITION po;
	int iStatus =0;
	int count1;
	char sendBuff[100];
	SOCKET mySocket;

    sprintf(sendBuff, "%d, %s\0", i_myIcon , new_User);
	
	po=socket_List.GetHeadPosition ();
	count1 = socket_List.GetCount ();
	
	//向所有用户发送
	for(int j=0; j< count1; ++j)
	{
		
		socket_Info tempSocket;
		
		//得到发送目的进程的那个线程
		tempSocket = socket_List.GetNext (po);
		mySocket = tempSocket.client_Socket ;

		send(mySocket, "userInfoList", strlen("userInfoList")+1, 0);
		send(mySocket,sendBuff, strlen(sendBuff) +1, 0);
		
 /*   	//利用线程互斥技术
		mutex.Lock ();
		send_Data.thread = tempSocket.thread ;
		sprintf(send_Data.data ,"%s~%s\0", "userInfoList", sendBuff);
		mutex.Unlock ();
		send_Data.thread ->SetThreadPriority (THREAD_PRIORITY_HIGHEST);
		send_Data.thread ->ResumeThread ();          //发送线程激活
*/
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -