科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用VC编写C/S消息传送程序

用VC编写C/S消息传送程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

自己编一个服务器与客户机互相传送消息的程序,以便增加自己网络编程的经验。

作者:朱晓华 来源:VCHELP 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
现在介绍客户机程序:

  1.创建一个名为"client"的项目,单文档界面.

  2.在clientview.h中加入代码:

#include "winsock.h"

  添加变量:

CString m_data[1000];
HANDLE m_hListenThread;
SOCKET m_sock;
SOCKADDR_IN m_saSrvr;
BOOLIsconnect;
int count;
CSize sizeTotal;
BOOLflag;

  3.在构造函数中初始化变量:

CClientView::CClientView()
{
 // TODO: add construction code here
 Isconnect=FALSE;
 sizeTotal.cy=350;
 sizeTotal.cx=300;
 flag=FALSE;
}

  4.在析构函数中完成清除操作:

CClientView::~CClientView()
{
 if(m_bInitialized)
  WSACleanup();
  closesocket(m_sock);
 if(m_hListenThread)
  ::TerminateThread(m_hListenThread,0);
}

  5.在菜单中添加"拨号"项:

void CClientView::OnDial()
{
 // TODO: Add your command handler code here

 count=5;
 if(m_bInitialized)
 {
  AfxMessageBox("Already dialing");
  return;
 }
 Cdial dial;
 if(dial.DoModal()==IDOK&&!dial.m_HostAddress.IsEmpty())
 {
  m_saSrvr.sin_family=AF_INET;
  m_saSrvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  m_saSrvr.sin_addr.S_un.S_addr=inet_addr(dial.m_HostAddress);
  m_saSrvr.sin_port=htons(5050);
  int status;
  WSADATA wsaData;
  m_data[0]="initializing Windows Sockets DLL....";
  if((status=WSAStartup(0x0101,&wsaData))==0)
  {
   m_data[0]+="Succeeded";
   m_bInitialized=TRUE;
  }
  else
  {
   m_bInitialized=FALSE;
  }
  m_sock=socket(AF_INET,SOCK_DGRAM,0);
  m_data[1]="Creating socket....";
  if(m_sock==INVALID_SOCKET)
  {
   m_data[1]+="Failed";
  }
  m_data[1]+="Succeeded";
  m_data[2]="Binding socket....";
  sockaddr_in sa;
  sa.sin_family=AF_INET;
  sa.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  sa.sin_port=htons(0);
  if(bind(m_sock,(PSOCKADDR)&sa, sizeof(sa))==SOCKET_ERROR)
  {
   m_data[2]+="Failed";
   closesocket(m_sock);
  }
  m_data[2]+="Succeeded";
  m_data[3]="Creating listener thread....";
  unsigned long idThread;
  m_hListenThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Listen,(void *)this,0,&idThread);
  if(m_hListenThread)
  {
   m_data[3]+="Succeeded";
   m_data[4]+="Waiting....";
  }
  else
   m_data[4]+="Failed";
   InvalidateRect(NULL);
 }
}

  6.添加一个拨号对话框,名为dial,有一个文本框用来写IP地址.并在clientview.cpp中添加代码:

#include dial.h

  7.在拨号项添加一个判断函数:

void CClientView::OnUpdateDial
(CCmdUI* pCmdUI)
{
 // TODO: Add your command update
 UI handler code here
 pCmdUI->Enable(TRUE);
 if(Isconnect)
  pCmdUI->Enable(FALSE);
}

  8.添加接收与发送消息的线程:

long WINAPI Listen(CClientView *pView)
{
 char msg[2000];
 pView- >m_data[5]="Sending ATTACH command";
 pView- >InvalidateRect(NULL);
 wsprintf(msg,"A: ");
 sendto(pView- >m_sock,msg,1024,0,(PSOCKADDR)&pView- >m_saSrvr,sizeof(pView- >m_saSrvr));
 int saSrvrLen ,nchar;
 while(1)
 {
  saSrvrLen=sizeof(pView->m_saSrvr);
  nchar=recvfrom(pView- >m_sock,msg,1024,0,(PSOCKADDR)&pView- >m_saSrvr,&saSrvrLen);
  if(nchar<0) { pView->m_data[pView- >count++]="Error in recvform";
   pView- >InvalidateRect(NULL);
  }
  else
  {
   pView->m_data[pView- >count++]=msg;
   pView->Isconnect=TRUE;
   pView->flag=TRUE;
   pView->InvalidateRect(NULL);
  }
 }
 return(0);
}

  9.同主程序一样做一个发送消息项,代码如上.

  10.显示程序也与主程序一样,代码如上。

  11.在Project中点击Settings中选择Link项添加wsock32.lib。

  12.编译程序便可得到client.exe程序。

  server.exe 和 client.exe 做完后,就可以在具有TCP/IP协议下的网络中执行。通过上面的例子,你可以很快了解vc++网络编程的优点,你还可以添加其它功能项,在这我就不多加叙述了。希望我的程序能起到抛砖引玉的目的,让我们都能编出好的网络程序。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章