打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VC下Socket多线程通讯类

VC下Socket多线程通讯类

/*

public:

 void SendServerUDP(CString NewInfo);

 void SendClientUDP(CString NewInfo);

 CString GetLocalIP();

 CString GetLocalHost();

 int  GetUDPPort();

 bool SetUDPIP(CString NewIP);

 bool SetUDPPort(int NewPort);

 bool CloseUDPClient();

 bool CloseUDPServer();

 bool CreateUDPClient();

 bool CreateUDPServer();

 void SendServerTCP(CString NewInfo);

 void SendClientTCP(CString NewInfo);

 bool SetTCPIP(CString NewIP);

 int  GetTCPPort();

 bool SetTCPPort(int NewPort);

 bool CloseTCPClient();

 bool CloseTCPServer();

 bool CreateTCPClient();

 bool CreateTCPServer();

*/

 

#define hui             //显示提示信息

 

//客户端登陆信息结构

typedef struct _CLIENT_INFORMATION

{

 char User[64];    //客户端主机名

 char IP[64];      //客户端IP

 char Type[20];    //指令类型(USERINFORMATION: 客户端信息)

 int  Data;        //指令数据(1:客户登陆、0:客户退出)

}CLIENT_INFORMATION;

//TCP(Socket)指针结构

typedef struct _SERVICE_TCP_PARM

{

 int  SocketService;          //Windows Socket

 CLIENT_INFORMATION Userinfo; //客户端信息

}SERVICE_TCP_PARM;

//服务器发送TCP数据包结构

typedef struct _SERVER_TCP_SEND_MESSAGE

{

    char Mag[20];

 char Type[20]; //指令类型(保留)

 int  Data;     //指令数据(保留)

 SERVICE_TCP_PARM User;

}SERVER_TCP_SEND_MESSAGE;

//客户端发送TCP数据包结构

typedef struct _CLIENT_TCP_SEND_MESSAGE

{

    char Mag[20];

 char Type[20]; //指令类型(保留)

 int  Data;     //指令数据(保留)

 SERVICE_TCP_PARM User;

}CLIENT_TCP_SEND_MESSAGE;

//UDP(Socket)指针结构

typedef struct _SERVICE_UDP_PARM

{

 int  SocketService;          //Windows Socket

 CLIENT_INFORMATION Userinfo; //客户端信息

}SERVICE_UDP_PARM;

//UDP(Socket)指针结构

typedef struct _SERVICE_UDP_LIST

{

 int  SocketService;          //Windows Socket

 CLIENT_INFORMATION Userinfo; //客户端信息

 struct sockaddr_in FromAddr; //客户端地址

}SERVICE_UDP_LIST;

//服务器发送UDP数据包结构

typedef struct _SERVER_UDP_SEND_MESSAGE

{

    char Mag[20];

 char Type[20]; //指令类型(保留)

 int  Data;     //指令数据(保留)

 SERVICE_TCP_PARM User;

}SERVER_UDP_SEND_MESSAGE;

//客户端发送UDP数据包结构

typedef struct _CLIENT_UDP_SEND_MESSAGE

{

    char Mag[20];

 char Type[20]; //指令类型(保留)

 int  Data;     //指令数据(保留)

 SERVICE_TCP_PARM User;

}CLIENT_UDP_SEND_MESSAGE;

SERVICE_TCP_PARM* p_TCP_Server;    //服务器TCP传送指针结构

SERVICE_TCP_PARM* p_TCP_Client;    //客户端TCP传送指针结构

SERVICE_UDP_PARM* p_UDP_Server;    //服务器UDP传送指针结构

SERVICE_UDP_PARM* p_UDP_Client;    //客户端UDP传送指针结构

bool g_End_TCP_Proc=false;    //TCP服务器/客户端终止标志(true:终止)

bool g_Server_TCP_Work=false; //TCP服务器工作标志(true:工作中)

bool g_Client_TCP_Work=false; //TCP客户端工作标志(true:工作中)

bool g_End_UDP_Proc=false;    //UDP服务器/客户端终止标志(true:终止)

bool g_Server_UDP_Work=false; //UDP服务器工作标志(true:工作中)

bool g_Client_UDP_Work=false; //UDP客户端工作标志(true:工作中)

std::list<SERVICE_TCP_PARM> g_TCP_Lists; //登陆用户列表

SERVICE_TCP_PARM g_TCP_List;

std::list<SERVICE_UDP_LIST> g_UDP_Lists; //登陆用户列表

SERVICE_UDP_LIST g_UDP_List;

UINT Server_TCP_Service_Proc(LPVOID p);

UINT Server_TCP_Select_Proc(LPVOID p);

UINT Cilent_TCP_Select_Proc(LPVOID p);

UINT Server_UDP_Select_Proc(LPVOID p);

UINT Cilent_UDP_Select_Proc(LPVOID p);

/////////////////////////////////////////////////////////////////////////////

// CMySocket

CMySocket::CMySocket()

{

 if (!AfxSocketInit())

 {

  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);

  return ;

 }

}

CMySocket::~CMySocket()

{

}

// Do not edit the following lines, which are needed by ClassWizard.

#if 0

BEGIN_MESSAGE_MAP(CMySocket, CSocket)

 //{{AFX_MSG_MAP(CMySocket)

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()

#endif // 0

/////////////////////////////////////////////////////////////////////////////

// CMySocket member functions

bool CMySocket::CreateTCPServer()

{

 try

 {

  ::g_End_TCP_Proc=false;

  

  struct sockaddr_in sock_addr;

  sock_addr.sin_family=AF_INET;

  sock_addr.sin_port=htons(m_TCP_PORT);

  sock_addr.sin_addr.S_un.S_addr=inet_addr(m_TCP_IP);

  p_TCP_Server=(SERVICE_TCP_PARM*)malloc(sizeof(SERVICE_TCP_PARM));

  p_TCP_Server->SocketService=socket(AF_INET,SOCK_STREAM,0);//TCP:SOCK_STREAM、UDP:SOCK_DGRAM

  if(p_TCP_Server->SocketService==INVALID_SOCKET)

  {

   free(p_TCP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 建立Socket失败/t");

#endif

   return false;

  }

  if(bind(p_TCP_Server->SocketService,(struct sockaddr*)&sock_addr,sizeof(sockaddr))!=0)

  {   

   closesocket(p_TCP_Server->SocketService);

   free(p_TCP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 绑定Socket失败/t");

#endif

   return false;

  }

  if(listen(p_TCP_Server->SocketService,100) != 0)//客户端总数

  {

   closesocket(p_TCP_Server->SocketService);

   free(p_TCP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 监听Socket失败/t");

#endif

   return false;

  }

  if(AfxBeginThread(Server_TCP_Service_Proc,p_TCP_Server)==NULL)

  {

   closesocket(p_TCP_Server->SocketService);

   free(p_TCP_Server);

#ifdef hui  

   AfxMessageBox("<服务器>/n/n提示信息: 启动失败/t");

#endif

   return false;

  }else

  {

#ifdef hui

//   AfxMessageBox("<服务器>/n/n提示信息: 启动成功/t");

#endif

  }

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CreateTCPClient()

{

 try

 {

  ::g_End_TCP_Proc=false;

        //设置连接服务器信息

  struct sockaddr_in sock_addr;

  sock_addr.sin_family=AF_INET;

  sock_addr.sin_port=htons(m_TCP_PORT);

  sock_addr.sin_addr.S_un.S_addr=inet_addr(m_TCP_IP);

        //建立连接

  p_TCP_Client=(SERVICE_TCP_PARM*)malloc(sizeof(SERVICE_TCP_PARM));

  p_TCP_Client->SocketService=socket(AF_INET,SOCK_STREAM,0);//TCP:SOCK_STREAM、UDP:SOCK_DGRAM

  if(connect(p_TCP_Client->SocketService,(sockaddr*)&sock_addr,sizeof(sock_addr)))

  {

   free(p_TCP_Client);

#ifdef hui

   AfxMessageBox("<客户端>/n/n提示信息: 无法连接到指定服务器/t");

#endif

   return false;

  }

  //取得本机信息

  strcpy(p_TCP_Client->Userinfo.IP,GetLocalIP());

  strcpy(p_TCP_Client->Userinfo.User,GetLocalHost());

  strcpy(p_TCP_Client->Userinfo.Type,"NULL");

  p_TCP_Client->Userinfo.Data=0;

  //创建客户端线程

  if(AfxBeginThread(Cilent_TCP_Select_Proc,p_TCP_Client)==NULL)

  {

#ifdef hui

   AfxMessageBox("<客户端>/n/n提示信息: 启动失败/t");

#endif

   free(p_TCP_Client);

   return false;

  }else

  {

#ifdef hui

//   AfxMessageBox("<客户端>/n/n/n提示信息: 启动成功/t");

#endif

  }

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CloseTCPServer()

{

 try

 {

  ::g_End_TCP_Proc=true;

  Sleep(200);

  if (::g_Server_TCP_Work==true)

  {

   std::list<SERVICE_TCP_PARM>::iterator it_user;

   for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

   {

    closesocket(it_user->SocketService);

   }

   closesocket(p_TCP_Server->SocketService);

  }

  free(p_TCP_Server);

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CloseTCPClient()

{

 try

 {

  ::g_End_TCP_Proc=true;

  Sleep(200);

  if (::g_Client_TCP_Work==true)

  {

   closesocket(p_TCP_Client->SocketService);

  }

  free(p_TCP_Client);

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::SetTCPPort(int NewPort)

{

 try

 {

  m_TCP_PORT=(int)NewPort;

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

int CMySocket::GetTCPPort()

{

 try

 {

  return m_TCP_PORT;

 }catch (_com_error e)

 {

  return 0;

 }

}

bool CMySocket::SetTCPIP(CString NewIP)

{

 try

 {

  m_TCP_IP=(CString)NewIP;

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CreateUDPServer()

{

 try

 {

  ::g_End_UDP_Proc=false;

  //建立接收端口

  struct sockaddr_in sock_addr;

  sock_addr.sin_family=AF_INET;

  sock_addr.sin_port=htons(m_UDP_PORT);

  sock_addr.sin_addr.S_un.S_addr=inet_addr(m_UDP_IP);

  p_UDP_Server=(SERVICE_UDP_PARM*)malloc(sizeof(SERVICE_UDP_PARM));

  p_UDP_Server->SocketService=socket(AF_INET,SOCK_DGRAM,0);//TCP:SOCK_STREAM、UDP:SOCK_DGRAM

  if(p_UDP_Server->SocketService==INVALID_SOCKET)

  {

   free(p_UDP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 建立Socket失败/t");

#endif

   return false;

  }

/*  //允许端口复用

  BOOL Temp = TRUE;

  if(int e=setsockopt(p_UDP_Server->SocketService, SOL_SOCKET, SO_REUSEADDR, (const char *)&Temp, sizeof(BOOL)))

  {  

   closesocket(p_UDP_Server->SocketService);

   free(p_UDP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 设置Socket失败/t");

#endif

   return false;

  }

  // 允许发送广播

  if(int e=setsockopt(p_UDP_Server->SocketService, SOL_SOCKET, SO_BROADCAST, (const char *)&Temp, sizeof(BOOL)))

  { 

   closesocket(p_UDP_Server->SocketService);

   free(p_UDP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 设置Socket失败/t");

#endif

   return false;

  }

*/

  if(bind(p_UDP_Server->SocketService,(struct sockaddr*)&sock_addr,sizeof(sockaddr))!=0)

  {   

   closesocket(p_UDP_Server->SocketService);

   free(p_UDP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 绑定Socket失败/t");

#endif

   return false;

  }

  //建立发送端口

/*  struct sockaddr_in destaddr;

  memset( &destaddr, 0, sizeof(sockaddr_in) );

  destaddr.sin_family = AF_INET;

  destaddr.sin_addr.S_un.S_addr = inet_addr("255.255.255.255");

  destaddr.sin_port = ntohs(theDlg->m_MySocket.m_UDP_PORT);

*/

 /*

  p_UDP_Server_SEND=(SERVICE_UDP_PARM*)malloc(sizeof(SERVICE_UDP_PARM));

  p_UDP_Server_SEND->SocketService=socket(AF_INET,SOCK_DGRAM,0);//TCP:SOCK_STREAM、UDP:SOCK_DGRAM

  if(p_UDP_Server_SEND->SocketService==INVALID_SOCKET)

  {

   free(p_UDP_Server);

   free(p_UDP_Server_SEND);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 建立 Socket 失败/t");

#endif

   return false;

  }

  // 允许发送广播

  if(int e=setsockopt(p_UDP_Server_SEND->SocketService, SOL_SOCKET, SO_BROADCAST, (const char *)&Temp, sizeof(BOOL)))

  { 

   closesocket(p_UDP_Server_SEND->SocketService);

   free(p_UDP_Server);

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 设置Socket失败/t");

#endif

   return false;

  }

*/

  if(AfxBeginThread(Server_UDP_Select_Proc,p_UDP_Server)==NULL)

  {

   closesocket(p_UDP_Server->SocketService);

   free(p_UDP_Server);

#ifdef hui  

   AfxMessageBox("<服务器>/n/n提示信息: 启动失败/t");

#endif

   return false;

  }else

  {

#ifdef hui

   AfxMessageBox("<服务器>/n/n提示信息: 启动成功/t");

#endif

  }

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CreateUDPClient()

{

 try

 {

  //建立激活信号

  ::g_End_UDP_Proc=false;

        //设置连接服务器信息

  struct sockaddr_in sock_addr;

  sock_addr.sin_family=AF_INET;

  sock_addr.sin_port=htons(m_UDP_PORT);

  sock_addr.sin_addr.S_un.S_addr=inet_addr(m_UDP_IP);

  //建立连接

  p_UDP_Client=(SERVICE_UDP_PARM*)malloc(sizeof(SERVICE_UDP_PARM));

  p_UDP_Client->SocketService=socket(AF_INET,SOCK_DGRAM,0);//TCP:SOCK_STREAM、UDP:SOCK_DGRAM

  

  if(connect(p_UDP_Client->SocketService,(sockaddr*)&sock_addr,sizeof(sock_addr)))

  {

   closesocket(p_UDP_Client->SocketService);

   free(p_UDP_Client);

#ifdef hui

   AfxMessageBox("<客户端>/n/n提示信息: 无法连接到指定服务器/t");

#endif

   return false;

  }

  //取得本机信息

  strcpy(p_UDP_Client->Userinfo.IP,GetLocalIP());

  strcpy(p_UDP_Client->Userinfo.User,GetLocalHost());

  strcpy(p_UDP_Client->Userinfo.Type,"NULL");

  p_UDP_Client->Userinfo.Data=0;

  //创建客户端线程

  if(AfxBeginThread(Cilent_UDP_Select_Proc,p_UDP_Client)==NULL)

  {

#ifdef hui

   AfxMessageBox("<客户端>/n/n提示信息: 启动失败/t");

#endif

   closesocket(p_UDP_Client->SocketService);

   free(p_UDP_Client);

   return false;

  }else

  {

#ifdef hui

   AfxMessageBox("<客户端>/n/n/n提示信息: 启动成功/t");

#endif

  }

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CloseUDPServer()

{

 try

 {

  ::g_End_UDP_Proc=true;

  Sleep(200);

  if (::g_Server_UDP_Work==true)

  {

   //设置本机信息

   char userinfo[65535];

   ::memset(&userinfo, '/0', 65535);

   CString info;

   info="服务器终止";

   strcpy(userinfo,info);//发送的信息

   int userinfo_length=info.GetLength ();

   std::list<SERVICE_UDP_LIST>::iterator it_user;

   for(it_user = g_UDP_Lists.begin();it_user != g_UDP_Lists.end();it_user++)

   {

    int nSendLen = sendto(it_user->SocketService, (LPSTR)&userinfo,userinfo_length, 0, (struct sockaddr*)&it_user->FromAddr,sizeof(it_user->FromAddr));

    if((unsigned int)nSendLen != userinfo_length)

    {

#ifdef hui

     AfxMessageBox("<服务器>/n/n发送客户信息/n/n/n提示信息: 发送错误/t");

#endif

    }

   }

   closesocket(p_UDP_Server->SocketService);

   free(p_UDP_Server);

  }

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::CloseUDPClient()

{

 try

 {

  ::g_End_UDP_Proc=true;

  Sleep(200);

  if (::g_Client_UDP_Work==true)

  {

   //设置本机信息

   char userinfo[65535];

   ::memset(&userinfo, '/0', 65535);

   CString info;

   info="退出";

   strcpy(userinfo,info);//发送的信息

   int userinfo_length=info.GetLength ();

   //发送本机信息

   int nSendLen = send(p_UDP_Client->SocketService, (LPSTR)&userinfo,userinfo_length,0);

   if((unsigned int)nSendLen != userinfo_length)

   {

#ifdef hui

   AfxMessageBox("<客户端>/n/n发送信息/n/n/n提示信息: 发送错误/t");

#endif

   }

   closesocket(p_UDP_Client->SocketService);

   free(p_UDP_Client);

  }

  

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::SetUDPPort(int NewPort)

{

 try

 {

  m_UDP_PORT=(int)NewPort;

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

bool CMySocket::SetUDPIP(CString NewIP)

{

 try

 {

  m_UDP_IP=(CString)NewIP;

  return true;

 }catch (_com_error e)

 {

  return false;

 }

}

int CMySocket::GetUDPPort()

{

 try

 {

  return m_UDP_PORT;

 }catch (_com_error e)

 {

  return 0;

 }

}

CString CMySocket::GetLocalHost()

{

 try

 {

  char name[32];

  int nGethostname;

  /*{{hui

  int gethostname (

        char FAR * name, 

        int namelen);//取得本机名

  hui}}*/

  nGethostname = gethostname(name, sizeof(name));

  return (CString)name;

 }catch (_com_error e)

 {

  return "NULL";

 }

}

CString CMySocket::GetLocalIP()

{

 try

 {

  char name[32];

  int nGethostname;

  /*{{hui

  int gethostname (

        char FAR * name, 

        int namelen);//取得本机名

  hui}}*/

  nGethostname = gethostname(name, sizeof(name));

  if(nGethostname == SOCKET_ERROR)

  {

   return "127.0.0.1";

  }

  struct hostent FAR * hostent;

  /*{{hui

  struct hostent FAR * gethostbyname (const char FAR * name);//取得主机通讯信息

  char FAR * inet_ntoa (struct in_addr in);//转换IP地址到字符串

  hui}}*/

  hostent = gethostbyname(name);

  return (CString)inet_ntoa(*((struct in_addr *)hostent->h_addr_list[0]));

 }catch (_com_error e)

 {

  return "127.0.0.1";

 }

}

UINT Server_TCP_Service_Proc(LPVOID p)

{

 try

 {

  g_Server_TCP_Work=true;

  SERVICE_TCP_PARM *p_Accept=(SERVICE_TCP_PARM*)p;

  SOCKET sockets;

  sockaddr_in addr;

  int addrlen;

  while(1)

  {

   //接收客户端请求

   addrlen=sizeof(addr);

   sockets=accept(p_Accept->SocketService,(struct sockaddr*)&addr,&addrlen);

   //结束服务线程

   if(::g_End_TCP_Proc==true)

   {

#ifdef hui

    AfxMessageBox("<服务器>/n/n/n提示信息: 服务已关闭/t");

#endif

    return 0;

   }

   if(sockets==INVALID_SOCKET)

   {

#ifdef hui

    AfxMessageBox("<服务器>/n/n/n提示信息: 客户端登陆错误/t");

#endif

    break;

   }else

   {

    //启动TCP工作线程

    SERVICE_TCP_PARM *p_Temp;

    p_Temp = (SERVICE_TCP_PARM *)malloc(sizeof(SERVICE_TCP_PARM));

    p_Temp->SocketService=sockets;

    strcpy(p_Temp->Userinfo.IP,(CString)inet_ntoa(addr.sin_addr));

    SERVER_TCP_SEND_MESSAGE Server_TCP_Message; //服务器发送TCP数据包

    ::memset(&Server_TCP_Message, '/0', sizeof(Server_TCP_Message));

    //接收客户端信息

    char userinfo[65535];

    ::memset(&userinfo, '/0', 65535);

    int readlen=recv(p_Temp->SocketService,(LPSTR)&userinfo,65535,0);//receive file name

       

    if(readlen==0 || readlen==SOCKET_ERROR)

    {

     ;

    }else

    {

     g_TCP_List=*p_Temp;

     CString info;

     info.Format ("客户:%s (%s) 登陆",userinfo,(CString)p_Temp->Userinfo.IP);

     strcpy(userinfo,info);

     int userinfo_length=info.GetLength ();

#ifdef _DEBUG

     AfxMessageBox((CString)info);

#else

     theDlg->SetReviInfo((CString)info);

#endif

     if(AfxBeginThread(Server_TCP_Select_Proc,p_Temp)==NULL)

     {

#ifdef hui

      AfxMessageBox("<服务器>/n/n/n提示信息: 创建工作线程失败/t");

#endif

     }else

     {

      //插入客户链表数据

      ::g_TCP_Lists.push_back(g_TCP_List);

      //将客户登陆信息发送给所有登陆客户端

      std::list<SERVICE_TCP_PARM>::iterator it_user;

      for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

      {

       int nSendLen = send(it_user->SocketService, (LPSTR)&userinfo,userinfo_length,0);

       if((unsigned int)nSendLen != userinfo_length)

       {

#ifdef hui

        AfxMessageBox("<服务器>/n/n发送登陆信息/n/n/n提示信息: 发送错误/t");

#endif

       }

      }

     }

    }//if(readlen==0 || readlen==SOCKET_ERROR)

   }//if(sockets==INVALID_SOCKET)

  }//while(1)

  return 0;

 }catch (_com_error e)

 {

#ifdef hui

  AfxMessageBox("<服务器>/n/n/n提示信息: 服为器接收客户线程意外结束/t");

#endif

  return 1;

 }

}

UINT Server_TCP_Select_Proc(LPVOID p)

{

 try

 {

  SERVICE_TCP_PARM *p_Temp=(SERVICE_TCP_PARM*)p;

  char userinfo[65535];

  while(1)

  {

   //结束服务线程

   if(::g_End_TCP_Proc==true)

   {

#ifdef hui

    AfxMessageBox("提示信息: 结束工作线程/t");

#endif

//    closesocket(p_Temp->SocketService);

//    free(p_Temp);

    return 0;

   }

   //接收客户端请求  

   ::memset(&userinfo, '/0', 65535);

   int readlen=recv(p_Temp->SocketService,(LPSTR)&userinfo,65535,0);//receive file name

   if(readlen==0 || readlen==SOCKET_ERROR)

   {

    CString info;

    info="客户( " + (CString)p_Temp->Userinfo.IP + " )退出";

    strcpy(userinfo,info);

    int userinfo_length=info.GetLength ();

#ifdef _DEBUG

    AfxMessageBox((CString)info);

#else

    theDlg->SetReviInfo((CString)info);

#endif

    //将客户退出信息发送给所有登陆客户端

    std::list<SERVICE_TCP_PARM>::iterator it_user;

    for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

    {

      if (it_user->SocketService == p_Temp->SocketService)

      {

       it_user=g_TCP_Lists.erase (it_user);// 删除元素

       break;

      }

    }

    for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

    {

     int nSendLen = send(it_user->SocketService, (LPSTR)&userinfo,userinfo_length,0);

     if((unsigned int)nSendLen != userinfo_length)

     {

#ifdef hui

      AfxMessageBox("<服务器>/n/n发送退出信息/n/n/n提示信息: 发送错误/t");

#endif

     }

    }

    closesocket(p_Temp->SocketService);

    free(p_Temp);

    return 0;

   }else

   {

    CString info;

    info.Format ("%s:%s",p_Temp->Userinfo.IP,userinfo);

    strcpy(userinfo,info);

    int userinfo_length=info.GetLength ();

#ifdef _DEBUG

    AfxMessageBox((CString)info);

#else

    theDlg->SetReviInfo ((CString)info);

#endif

    std::list<SERVICE_TCP_PARM>::iterator it_user;

    for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

    {

     int nSendLen = send(it_user->SocketService, (LPSTR)&userinfo,userinfo_length,0);

     if((unsigned int)nSendLen != userinfo_length)

     {

#ifdef hui

      AfxMessageBox("<服务器>/n/n发送登陆信息/n/n/n提示信息: 发送错误/t");

#endif

     }

    } 

   }//if(readlen==0 || readlen==SOCKET_ERROR)

  }//while(1)

 }catch (_com_error e)

 {

#ifdef hui

  AfxMessageBox("提示信息: 工作线程意外结束/t");

#endif

  return 1;

 }

}

UINT Cilent_TCP_Select_Proc(LPVOID p)

{

 try

 {

  SERVICE_TCP_PARM *p_Temp;

  p_Temp=(SERVICE_TCP_PARM *)p;

  CString info;

//  info=(CString)p_Temp->Userinfo.IP + "  " + (CString)p_Temp->Userinfo.User;

  info=(CString)p_Temp->Userinfo.User;

  char userinfo[65535];

  ::memset(&userinfo, '/0', 65535);

  strcpy(userinfo,info);

  int userinfo_length=info.GetLength ();

  //发送本机信息

  int nSendLen = send(p_Temp->SocketService, (LPSTR)&userinfo,userinfo_length,0);

  if((unsigned int)nSendLen != userinfo_length)

  {

#ifdef hui

   AfxMessageBox("<客户端>/n/n发送本机信息/n/n/n提示信息: 发送错误/t");

#endif

   return 1;

  }

  g_Client_TCP_Work=true;

  //进入工作状态

  while(1)

  {

   //结束客户端线程

   if(::g_End_TCP_Proc==true)

   {

#ifdef _DEBUG

    AfxMessageBox("关闭工作线程");

#else

    theDlg->SetReviInfo("关闭工作线程");

#endif

//    closesocket(p_Temp->SocketService);

//    free(p_Temp);

    return 0;

   }

   //接收服务器请求

   ::memset(&userinfo, '/0', 65535);

   int readlen=recv(p_Temp->SocketService,(LPSTR)&userinfo,65535,0);//receive file name

   if(readlen==0 || readlen==SOCKET_ERROR)

   {

#ifdef _DEBUG

    AfxMessageBox("服务器终止");

#else

    theDlg->SetReviInfo("服务器终止");

#endif

//    closesocket(p_Temp->SocketService);

//    free(p_Temp);

    return 0;

   }else

   {

    info=userinfo;

#ifdef _DEBUG

    AfxMessageBox((CString)info);

#else

    theDlg->SetReviInfo ((CString)info);

#endif     

   }//if(readlen==0 || readlen==SOCKET_ERROR)

  }//while(1)

 }catch (_com_error e)

 {

#ifdef hui

  AfxMessageBox("<客户端>/n/n/n提示信息: 工作线程意外结束/t");

#endif

  return 1;

 }

}

UINT Server_UDP_Select_Proc(LPVOID p)

{

 try

 {

  SERVICE_UDP_PARM *p_Temp=(SERVICE_UDP_PARM*)p;

  g_Server_UDP_Work=true;

  char userinfo[65535];

  CString info;

  while(1)

  {

   //结束服务线程

   if(::g_End_UDP_Proc==true)

   {

#ifdef hui

    AfxMessageBox("提示信息: 结束工作线程/t");

#endif

//    closesocket(p_Temp->SocketService);

//    free(p_Temp);

    return 0;

   }

   struct sockaddr_in from;

   int fromlen =sizeof(from);

   //接收客户端请求  

   ::memset(&userinfo, '/0', 65535);

   int readlen=recvfrom(p_Temp->SocketService,(LPSTR)&userinfo,65535,0,(struct sockaddr*)&from,&fromlen);

   if(readlen==0 || readlen==SOCKET_ERROR)

   {

    ;

   }else

   {

    //取得客户链表数据

    g_UDP_List.SocketService = p_Temp->SocketService;

    g_UDP_List.FromAddr = from;

    std::list<SERVICE_UDP_LIST>::iterator it_user;

    bool isuser=false;

    //查询客户IP地址是否已登陆

    for(it_user = g_UDP_Lists.begin();it_user != g_UDP_Lists.end();it_user++)

    {

     if(strcmp((CString)inet_ntoa(it_user->FromAddr.sin_addr),(CString)inet_ntoa(g_UDP_List.FromAddr.sin_addr)) == 0)

     {

      isuser=true;

      if (strcmp((CString)userinfo,"退出") == 0)

      {

       it_user=g_UDP_Lists.erase (it_user);// 删除元素

      }

      break;

     }

    }

    if (isuser == false)

    {

     //插入客户链表数据

     ::g_UDP_Lists.push_back(g_UDP_List);

     info="客户:" + (CString)userinfo + "( " + (CString)inet_ntoa(g_UDP_List.FromAddr.sin_addr) + " )登陆";

    }else

    {

     info=(CString)inet_ntoa(g_UDP_List.FromAddr.sin_addr) + ":" + (CString)userinfo;

    }

    

#ifdef _DEBUG

    AfxMessageBox((CString)info);

#else

    theDlg->SetReviInfo ((CString)info);

#endif

    strcpy(userinfo,info);

    int userinfo_length=info.GetLength ();

    //将客户信息发送给所有登陆客户端

    for(it_user = g_UDP_Lists.begin();it_user != g_UDP_Lists.end();it_user++)

    {

     int nSendLen = sendto(it_user->SocketService, (LPSTR)&userinfo,userinfo_length, 0, (struct sockaddr*)&it_user->FromAddr,sizeof(it_user->FromAddr));

     if((unsigned int)nSendLen != userinfo_length)

     {

#ifdef hui

      AfxMessageBox("<服务器>/n/n发送客户信息/n/n/n提示信息: 发送错误/t");

#endif

     }

    }

   }//if(readlen==0 || readlen==SOCKET_ERROR)

  }//while(1)

 }catch (_com_error e)

 {

#ifdef hui

  AfxMessageBox("提示信息: 工作线程意外结束/t");

#endif

  return 1;

 }

}

UINT Cilent_UDP_Select_Proc(LPVOID p)

{

 try

 {

  SERVICE_UDP_PARM *p_Temp;

  p_Temp=(SERVICE_UDP_PARM *)p;

  //设置本机信息

  char userinfo[65535];

  ::memset(&userinfo, '/0', 65535);

  CString info;

 // info=(CString)p_Temp->Userinfo.IP + "  " + (CString)p_Temp->Userinfo.User;

  info=(CString)p_Temp->Userinfo.User;

  strcpy(userinfo,info);

  int userinfo_length=info.GetLength ();

  //发送本机信息 

  int nSendLen = send(p_Temp->SocketService, (LPSTR)&userinfo,userinfo_length,0);

  g_Client_UDP_Work=true;

  //进入工作状态

  while(1)

  {

   //结束客户端线程

   if(::g_End_UDP_Proc==true)

   {

#ifdef hui

    AfxMessageBox("<客户端>/n/n提示信息: 关闭工作线程/t");

#endif

//    closesocket(p_Temp->SocketService);

//    free(p_Temp);

    return 0;

   }

   ::memset(&userinfo, '/0', 65535);

   //接收服务器信息

   int readlen=recv(p_Temp->SocketService,(LPSTR)&userinfo,65535,0);//receive file name

   if(readlen==0 || readlen==SOCKET_ERROR)

   {

#ifdef hui

    AfxMessageBox("<客户端>/n/n/n提示信息: 服务器终止,客户端退出/t");

#endif

    closesocket(p_Temp->SocketService);

    free(p_Temp);

    return 0;

   }else

   {

    info=userinfo;

#ifdef _DEBUG

    AfxMessageBox((CString)info);

#else

    theDlg->SetReviInfo ((CString)info);

#endif 

   }//if(readlen==0 || readlen==SOCKET_ERROR)

  }//while(1)

 }catch (_com_error e)

 {

#ifdef hui

  AfxMessageBox("<客户端>/n/n/n提示信息: 工作线程意外结束/t");

#endif

  return 1;

 }

}

void CMySocket::SendClientTCP(CString NewInfo)

{

 //设置本机信息

 char userinfo[65535];

 ::memset(&userinfo, '/0', 65535);

 strcpy(userinfo,NewInfo);

 int userinfo_length=NewInfo.GetLength ();

 //发送本机信息

 int nSendLen = send(p_TCP_Client->SocketService, (LPSTR)&userinfo,userinfo_length,0);

 if((unsigned int)nSendLen != userinfo_length)

 {

#ifdef hui

  AfxMessageBox("<客户端>/n/n发送信息/n/n/n提示信息: 发送错误/t");

#endif

 }

}

void CMySocket::SendServerTCP(CString NewInfo)

{

 char userinfo[65535];

 NewInfo="服务器:"+NewInfo;

 ::memset(&userinfo, '/0', 65535);

 strcpy(userinfo,NewInfo);//发送的信息

 int userinfo_length=NewInfo.GetLength ();

 std::list<SERVICE_TCP_PARM>::iterator it_user;

 for(it_user = g_TCP_Lists.begin();it_user != g_TCP_Lists.end();it_user++)

 {

  int nSendLen = send(it_user->SocketService, (LPSTR)&userinfo,userinfo_length,0);

  if((unsigned int)nSendLen != userinfo_length)

  {

#ifdef hui

   AfxMessageBox("<服务器>/n/n发送信息/n/n/n提示信息: 发送错误/t");

#endif

  }

 }

#ifdef _DEBUG

 AfxMessageBox((CString)NewInfo);

#else

 theDlg->SetReviInfo ((CString)NewInfo);

#endif

}

void CMySocket::SendClientUDP(CString NewInfo)

{

 //设置本机信息

 char userinfo[65535];

 strcpy(userinfo,NewInfo);

 int userinfo_length=NewInfo.GetLength ();

 //发送本机信息

 int nSendLen = send(p_UDP_Client->SocketService, (LPSTR)&userinfo,userinfo_length,0);

 if((unsigned int)nSendLen!=userinfo_length)

 {

#ifdef hui

  AfxMessageBox("<客户端>/n/n发送信息/n/n/n提示信息: 发送错误/t");

#endif

 }

}

void CMySocket::SendServerUDP(CString NewInfo)

{

 //设置本机信息

 char userinfo[65535];

 NewInfo="服务器:" + NewInfo;

 strcpy(userinfo,NewInfo);

 int userinfo_length=NewInfo.GetLength ();

 std::list<SERVICE_UDP_LIST>::iterator it_user;

 for(it_user = g_UDP_Lists.begin();it_user != g_UDP_Lists.end();it_user++)

 {

  int nSendLen = sendto(it_user->SocketService, (LPSTR)&userinfo,userinfo_length, 0, (struct sockaddr*)&it_user->FromAddr,sizeof(it_user->FromAddr));

  if((unsigned int)nSendLen != userinfo_length)

  {

#ifdef hui

   AfxMessageBox("<服务器>/n/n发送客户信息/n/n/n提示信息: 发送错误/t");

#endif

  }

 }

#ifdef _DEBUG

 AfxMessageBox((CString)NewInfo);

#else

 theDlg->SetReviInfo ((CString)NewInfo);

#endif

}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AfxMessageBox基本用法
取CString子串
UDP协议(User Datagram Protocol)
Linux关闭防火墙命令
TCP与UDP的区别
lwip
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服