VC6.0编写C/S消息传送程序

2016-02-19 19:02 50 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享VC6.0编写C/S消息传送程序教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

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

  首先介绍服务器程序:

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

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

#include "winsock.h"

 添加变量:

CSize sizeTotal;//控制滚动条
int count;//信息条数
CString m_data[1000];//信息存放
char  Hostname[260];
char Hostaddress[20];//主机IP地址
SOCKET m_sock;
HANDLE m_hListenThread;//线程
BOOL m_bInitialized;//是否初始化
WSADATA WSAData;
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]="";
int nchar;
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
";
pView- >InvalidateRect(NULL);
}
else
{

switch(msg[0])
{
case ’A’:
  wsprintf(msg,"A:Client from %s attached
",
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
",
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;
HostEnt = 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;j m_data[count-1].GetLength();j++)
sizeTotal.cx+=15;
OnInitialUpdate();
flag=FALSE;
}
CServerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int y=10;
for(int i=0;i count;i++)
{ pDC- >TextOut(10,y,m_data);
y+=20;
}
// TODO: add draw code for native data here
}

  11.在Project中点击Settings中选择Link项添加wsock32.lib.最后编译程序,就可以得到Server.exe程序.

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  现在介绍客户机程序:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

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

#include "winsock.h"

  添加变量:

CString m_data[1000];
HANDLE m_hListenThread;
SOCKET m_sock;
SOCKADDR_IN m_saSrvr;
BOOL Isconnect;
int count;
CSize sizeTotal;
BOOL flag;

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

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

  4.在析构函数中完成清除操作,代码如上:

  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";
}

来源:https://www.tulaoshi.com/n/20160219/1619882.html

延伸阅读
BO又称“特洛伊木马”,是在美国一次黑客技术讨论会上由一个黑客组织推出的。它其实是一种客户机/服务器程序,其利用的原理就是:在本机直接启动运行的程序拥有与使用者相同的权限。因此如果能够启动服务器端(即被攻击的计算机)的服务器程序,就可以使用相应的客户端工具客户程序直接控制它了。下面来谈谈如何用VB来实现它。 ----使用VB建...
标准C++规定new一个对象时如果分配内存失败就应抛出一个std::bad_alloc异常,如果不希望抛出异常而仅仅传回一个NULL指针,可以用new的无异常版本:new(nothrow)。 VC6.0在new头文件中声明了这两种operator new操作符: void *__cdecl operator new(size_t) _THROW1(std::bad_alloc); void *__cdecl operator new(size_t, const std::no...
最近做开发碰到了长字符串匹配、搜索的问题,最先想到的是使用正则表达式,简单、高效。 但是我用的开发工具是VC6.0,不支持正则表达式。 上网baidu一下,发现支持正则的库还真不少,大概有以下几种:boost,GNU,VC7带的ATL中的和微软发布的greta。 网上的朋友对boost评价不错,决定就使用是它了! 1、接下来的就是下载boost库,网上很好...
VC6.0可谓是微软的王牌产品,它以强大的功能而赢得了广大程序员的爱好。而用VC的AppWizard、ClassWizard和其中的各种控件可以方便地建立应用程序。 本文就介绍用VC6.0自带的一个ActiveX控件----ActiveMovieControl Object,来建立自己的多媒体播放器。此多媒体具有一般的播放功能,能播放*.mp3,*.wma,*.mdi,*.wav,*.avi,*.dat等文件,还有R...
GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化...

经验教程

814

收藏

99
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部