再请高手看看服务器端
207 2003-04-18 08:03:57 UINT CChat::thread(LPVOID p) //(原来是UINT thread(LPVOID p)
{
//定义缓冲区
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
//获得当前运行窗口的句柄
//CChat *chatview=(CChat*)AfxGetApp()->GetMainWnd();
CChat *chatview=(CChat*) p;
//获得还没有被占用的数组序号
msgcount=chatview->getcount();
//如果不等于-1,则表示还有空缺Socket
if(msgcount==-1)
loop=0;
if(loop)
{
s=1;
//使用空缺的Socket等待客户连接
chatview->msgsock[msgcount]=accept(chatview->sock,(sockaddr *)&(chatview->serv),&(chatview->addlen));
if(chatview->msgsock[msgcount]==INVALID_SOCKET)
{
//如果返回错误,则提示错误
chatview->m_ser_talk.SetWindowText("Error Accept");
}
else
{
//如果客户端成功,则再次启动另一个线程,启动线程
/**原来是线程转换成类函数这怎写?*/ AfxBeginThread(thread,0);
//显示联机成功信息
chatview->SetForegroundWindow ();
chatview->m_ser_list.InsertItem (chatview->count++,"连接成功");
chatview->m_ser_list.InsertItem (chatview->count++,inet_ntoa(chatview->serv.sin_addr));
chatview->m_ser_list.Scroll (size);
chatview->m_send.EnableWindow (true);
//如果没发生错误,则一直循环等待数据的到来
while(s!=SOCKET_ERROR)
{
//循环接收数据
s=recv(chatview->msgsoc[msgcount],buff,100,0);
chatview->SetForegroundWindow();
//如果接收成功,则显示接收到的数据
if(s!=SOCKET_ERROR)
{
chatview->m_ser_list.InsertItem(chatview->count++,buff);
chatview->m_ser_list.Scroll(size);
//发送信息到所有的客户端
chatview->sendtoall(chatview->msgsock[msgcount],buff);
}
}
//如果发生错误,发送连接中断消息到客户端
send(chatview->msgsock[msgcount],"Disconnected",100,0);
//显示相关信息
chatview->m_ser_list.InsertItem(chatview->count++,"Disconnected");
chatview->m_ser_list.Scroll(size);
//将该Socket设定为NULL
chatview->msgsock[msgcount]=NULL;
//然后判断是否还有其他客户在保持连接
for(int i=0;i<5;i++)
if(chatview->msgsock[i]!=NULL)
flag=1;
//如果没有客户连接了,则将发送按钮设定为不可用
if(flag!=1)
chatview->m_send.EnableWindow(false);
//关闭连接
closesocket(chatview->msgsock[msgcount]);
//flag=0;
}
}
//终止线程
//AfxEndThread(thread,0);
return 0;
}