WEB开发网
开发学院软件开发VC 基于TCP/IP的局域网多用户通信 阅读

基于TCP/IP的局域网多用户通信

 2006-07-21 11:10:10 来源:WEB开发网   
核心提示: 由此可见,整个系统通信任务的实现还是很复杂的,基于TCP/IP的局域网多用户通信(3),用户端首先必须注册自己,等待注册成功;然后根据自己的注册信息进行服务器登陆,要对数据库进行操作,由于数据库较简单,登陆成功后才能与通信服务器连接,进行用户间通信

由此可见,整个系统通信任务的实现还是很复杂的。用户端首先必须注册自己,等待注册成功;然后根据自己的注册信息进行服务器登陆,登陆成功后才能与通信服务器连接,进行用户间通信。

注册/登陆服务器接收到用户端的信息后,首先判断是注册信息还是登陆信息。如果是注册信息,则将该数据按预定的格式写入数据库,然后返回注册成功的消息,期间有任何异常产生,服务器都会返回注册失败消息,提示用户重新注册;如果是登陆信息,则从数据中提取用户名和ID与数据库中的内容进行比较,如果该用户存在,则返回登陆成功消息,反之,返回登陆失败消息。

通信服务器所完成的主要功能是数据转发,这是通过与图中的共享数据结构进行交互完成的。服务器接收到用户端发来的消息后,提取消息的一部分与共享数据结构存储的内容进行比较,确定所要转发的对象,最后通过多线程及其通信机制完成数据转发。 下面,我们将分三部分来讨论系统的具体实现过程。

三、具体实施

3.1 注册/登陆服务器

注册/登陆服务器程序是基于对话框的,该程序使用I/O端口56789与用户端连接。

首先,在对话框初始化的同时完成网络初始化,即执行Init_net()函数,代码(不完整)如下:

BOOL CServerDlg::Init_net()
{////////////////////////网络初始化///////////////////////////////
  addrLen=sizeof(SOCKADDR_IN);
  status=WSAStartup(MAKEWORD(1, 1), &Data);
  ………
  memset(&serverSockAddr, 0, sizeof(serverSockAddr));
/*以下指定一个与某个SOCKET连接本地或远程地址*/
  serverSockAddr.sin_port=htons(PORT);
  serverSockAddr.sin_family=AF_INET;
  serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
  serverSocket=socket(AF_INET, SOCK_STREAM, 0);//初始化SOCKET
  ………
  status=bind(serverSocket,(LPSOCKADDR)&serverSockAddr,sizeof(serverSockAddr)); //将SOCKET与地址绑定
  ………
  status=listen(serverSocket, 5); //开始监听
  ………
  return true;
}
接着按下RUN键开始服务器功能,执行Reg_Load()函数,使服务器始终处于等待连接状态,但这样也使该线程始终阻塞。当有用户连接时,该函数创建一个任务用于处理与用户及数据库的事务。具体任务函数略(详见原始代码文件)。 void CServerDlg::Reg_Load()
{ 
  while(1)
  {
    CWinThread* hHandle;
    clientSocket=accept(serverSocket,(LPSOCKADDR)&clientSockAddr,&addrLen); //等待连接,阻塞
    hHandle=AfxBeginThread(talkToClient,(LPVOID)clientSocket);//有连接时,创建任务
      ………
  }
}
任务函数在接收到消息时,要对数据库进行操作,由于数据库较简单,采用ODBC连接ACCESS数据库(将netuser.mdb在ODBC数据管理器中安装成同名数据源)具体代码略。

3.2 通信服务器

上一页  1 2 3 4 5 6  下一页

Tags:基于 TCP IP

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接