📄 messageserverdlg.cpp
字号:
//向所有用户更新用户列表
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 + -