基于TCP/IP的局域网多用户通信
2006-07-21 11:10:10 来源:WEB开发网核心提示: ●多线程每当服务器上有用户连接成功,服务器都会为其创建两个线程:接收线程(RecvData)和发送线程(SendData),基于TCP/IP的局域网多用户通信(5),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,这儿,我定义了互斥量CMutex m_mutex,等待服务器将其唤醒,
●多线程
每当服务器上有用户连接成功,服务器都会为其创建两个线程:接收线程(RecvData)和发送线程(SendData),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,等待服务器将其唤醒。这两个线程都执行一个无限循环的过程,只有当通信出现异常或用户端关闭连接时,线程才被自身所结束,并且,这两个线程一定是同时生成,同时结束的。很显然,每个连接产生两个线程,使得数据转发变的简单,但同时又使得服务器的任务加重。因此,用户端的连接数量有所限制,视服务器软、硬件能力而定。
同时,由于多线程对结构体info_data都需要操作,所以线程间必须同步。这儿,我定义了互斥量CMutex m_mutex,用它的方法Lock()和Unlock()来完成同步。
我们首先来看一下接收线程(RecvData):(不完整代码)
UINT RecvData(void* cs)
{
SOCKET clientSocket=(SOCKET)cs;
while(1)
{
numrcv=recv(clientSocket, buffer, MAXBUFLEN, NO_FLAGS_SET);
buffer[numrcv]=''\0'';
if(strcmp(buffer,"Close!")!=0) //不是接收的“Close”数据
{
…………
for(i=0;i<count;i++)
{
if(po!=NULL)
{
s1=s_info.GetNext(po);
if(s1.pet.Compare(petname)==0) //比较昵称是否一样
{
m_mutex.Lock(); //互锁
info_data.data=pos;
info_data.thread=s1.thread;
m_mutex.Unlock(); //解锁
}
s1.thread->ResumeThread(); //恢复发送相应的线程
break;
}
}
}
else
{
…………
if(clientSocket==s1.s_client)
{
m_mutex.Lock(); //互锁
info_data.data=buffer;
m_mutex.Unlock(); //解锁
s1.thread->ResumeThread(); //恢复发送相应的线程
s_info.RemoveAt(po1); //删除该用户信息
break;
}
………
goto aa;
}
}
aa: closesocketlink((LPVOID)clientSocket); //关闭连接
AfxEndThread(0,true); //结束本线程
return 1;
}
接下来看一下发送线程(SendData):(不完整代码)
更多精彩
赞助商链接