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

日期:2016-08-07 16:43:27编辑作者:申博亚洲
网络编程已经成为一种时髦,以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);
}

相关文章

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

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

发布日期:2016-08-07 详细>>

大数据挖掘让PE/VC更高效

据国外媒体报道,作为硅谷风投公司Greylock Partners的数据科学家,对于泛滥的数据如何改变风投公司的运营方式,DJ&bull;帕蒂尔(DJ Patil ..

发布日期:2016-08-07 详细>>

用VC++进行MapX二次开发::之二------使用MapX的基石

在开始之前,我假设读者熟悉VC++编程(了解一些可以),且使用的系统安装好了VC++5 0(或以上版本,建议VC++6 0)和MapX4 0(或以上版本)。 ..

发布日期:2016-08-07 详细>>

工业控制研华板卡的VC编程实现

在论坛中经常有人提出关于研华工业用控制板卡的vc编程方法。此类板卡编程方法比较复杂,根据说明书上面说明我们可以采用两种编程方法,一种 ..

发布日期:2016-08-07 详细>>

VC++动态链接库编程之DLL典型实例

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和类定义在库中。这样,在再次 ..

发布日期:2016-08-07 详细>>