科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: VC C/S 消息传送程序

  • 评论
  • 分享微博
  • 分享邮件
网络编程已经成为一种时髦,以TCP/IP协议的网络更为流行.自己编一个服务器与客户机互相传送消息的程序,以便增加自己网络编程的经验。下面我就介绍一下我编的程序。

  首先介绍服务器程序:

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

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

#include "winsock.h"

  添加变量:

CSize sizeTotal;//控制滚动条
intcount;//信息条数
CString m_data[1000];//信息存放
char Hostname[260];
char Hostaddress[20];//主机IP地址
SOCKET m_sock;
HANDLE m_hListenThread;//线程
BOOL m_bInitialized;//是否初始化
WSADATAWSAData;
BOOL flag;
SOCKADDR_IN saClnt;
int saClntLen;
BOOL Isconnect;//是否连接

  3.在serverview.cpp中重载CServerView()构造器,创建并绑定嵌套字:

CServerView::CServerView()
{
 // TODO: add construction code here
 Isconnect=FALSE;
 flag=FALSE;
 sizeTotal.cy=350;
 sizeTotal.cx=300;
 m_hListenThread;
 count=5;
 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(5050);
 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]+="Listening....";
 }
 else
  m_data[4]+="Failed";
}

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

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

  5.定义接收和处理消息的线程:

long WINAPI Listen(CServerView *pView)
{
 char msg[2000]="";
 intnchar;
 SOCKADDR_IN saClnt;
 int saClntLen;
 while(1)
 {
  saClntLen=sizeof(saClnt);
  nchar=recvfrom(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,&saClntLen);
  if(nchar<0) { pView->m_data[pView->count++]+="Error in recvfrom\n";
  pView->InvalidateRect(NULL);
  }
  else
  {
   switch(msg[0])
   {
    case'A':
     wsprintf(msg,"A: Client from %s
     attached\n",inet_ntoa(saClnt.sin_addr));
     pView->m_data[pView->count++]=msg;
     pView->flag=TRUE;
     pView->InvalidateRect(NULL);
     pView->Isconnect=TRUE;
     pView->saClnt=saClnt;
     pView->saClntLen=saClntLen;
     sendto(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,saClntLen);
     break;
    case 'D':
     wsprintf(msg,"D: Client form %s detached\n",inet_ntoa(saClnt.sin_addr));
     pView->m_data[pView->count++]=msg;
     pView->flag=TRUE;
     pView->InvalidateRect(NULL);
     pView->Isconnect=FALSE;
     sendto(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,saClntLen);
     break;
    case 'R':
     saClntLen=sizeof(saClnt);
     pView->m_data[pView->count++]=msg;
     pView->flag=TRUE;
     pView->InvalidateRect(NULL);
     break;
    default:
     break;
   }

  }
 }
 return(0);
}

  6.在程序菜单项中添加"本机IP地址":

void CServerView::OnIp()
{
 int WSAReturn;
 WSAReturn=WSAStartup( 0x0101, &WSAData );
 if( WSAReturn == 0 ){
  gethostname( Hostname, 260 );
  struct hostent *pHostEnt;
  pHostEnt = gethostbyname( Hostname);
  if( pHostEnt != NULL ){
   wsprintf( Hostaddress, "%d.%d.%d.%d", ( pHostEnt->h_addr_list[0][0] & 0x00ff ),
     ( pHostEnt->h_addr_list[0][1] & 0x00ff ),
     ( pHostEnt->h_addr_list[0][2] & 0x00ff ),
     ( pHostEnt->h_addr_list[0][3] & 0x00ff ) );
   CString out;
   out.Format(Hostaddress);
   AfxMessageBox(out);
  }
 }
}

  7.在程序菜单中添加"发送消息":

void CServerView::OnSendmessage()
{
 // TODO: Add your command handler code here
 char msg[2000];
 Csend Sendmessage;
 if(Sendmessage.DoModal() ==IDOK&&!Sendmessage.m_Message.IsEmpty())
 {
  wsprintf(msg,"R: "+Sendmessage.m_Message);
  sendto(m_sock,msg,1024,0,(PSOCKADDR)&saClnt,saClntLen);
  m_data[count++]=Sendmessage.m_Message;
  flag=TRUE;
  InvalidateRect(NULL);
 }
}

  8.为发送消息项添加一个对话框的类,名为send,有一个文本框,用来发送消息.并为文本框添加CString m_Message 变量,并在ServerView.cpp中添加#include "send.h"

  9.为发送消息项添加一个判断函数:

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

  10.再窗口显示消息:

void CServerView::OnDraw(CDC* pDC)
{
 if(flag)
 {
  sizeTotal.cy+=20;
  for(int j=65;jTextOut(10,y,m_data[i]);
   y+=20;
 }

 // TODO: add draw code for native data here
}

  11.在Project中点击Settings中选择Link项添加wsock32.lib. 最后编译程序,就可以得到Server.exe程序.
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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