VC语言:在VC6.0中编写网络应用程序
首页
网站制作
软件工程
VC语言
Delphi
VB
Asp
Java
数据库
编程语言
.NET
热点排行
VxD
走进Windows 2000 内部(二)
VC常见问题与解决方案
WTL for MFC Programmers, Part II - WTL GUI Base Classes
Policy Tool — 策略文件创建和管理工具
两个动态链接库(MFC扩展库)及其测试程序的例子(含源代码)
【原创】轻松实现一个操作ini文件的类
多步Undo/Redo的实现
用VC++编写CGI程序
JXTA, P2P编程技术例程(1)
通过ini实现多语言菜单
VC++ ADO开发实践之三
轻松开发多语言程序
WINSOCK编程
模板初学者指南1
在VC6.0中编写网络应用程序
类别:
VC语言
点击:
0
评论:
0
推荐:
{在VC6.0中编写网络应用程序} 》
{ 在网络技术日益发展的今天,如果自己也能够编写一个实用的网络应用程序,那么,不仅能够激发对网络的兴趣,促使自己对网络知识的追求,同时开发过程本身也是一个很好的学习过程。
在VC6.0中MFC对网络编程有着很好的支持,针对不同用途的网络应用程序,VC有不同的封装类进行支持,如FTP、HTTP等等,使用户能够很快的开发出相应的程序,但同时,也使用户失去了一些了解网络程序运行的底层机制的机会,更重要的是也失去了一定程度上的灵活性。在此我们介绍利用SOCKET套接字进行开发的一般步骤,供读者参考。
在Windows和UNIX下编写网络应用程序,基本上都是利用SOCKET套接字进行数据通讯,SOCKET套接字是从UNIX环境下承袭而来,它在程序中的作用可以理解为网络数据通讯的一个代理,其在Windows中的设计思路与UNIX下相比基本没有多大变化,分为服务器套接字和客户机套接字两个设计部分,设计思路如下:
第一部分 服务器端
一、创建服务器套接字(CREATE)。
二、服务器套接字进行信息绑定(BIND),并开始监听连接(LISTEN)。
三、接受来自客户端的连接请求(ACCEPT),并创建接收进程。
四、开始数据传输(SEND、RECEIVE)。
五、关闭套接字(CLOSESOCKET)。
第二部分 客户机端
一、创建客户机套接字(CREATE)。
二、与远程服务器进行连接(CONNECT),如被接受则创建接收进程。
三、开始数据传输(SEND、RECEIVE)。
四、关闭套接字(CLOSESOCKET)。
以上的设计思路是我们开发的基本步骤,同时也是大多数网络应用程序运行的基本方式,下面我们具体说明它在VC中的实现。
服务器端:
一、建立支持SOCKET项目。
利用APP WIZARD创建MFC EXE项目,进行到WIZARD的第四步时,在“What features would you like include?”中,选中“Windows Sockets”项。其它各步骤各选项根据实际应用进行选择即可。这样创建的项目就已经支持SOCKET,并已经初始化了。
如果要在已有的项目中添加SOCKET支持,只须进行两项工作:
1在stdafx.h文件中包含头文件WINSOCK.H (#include “winsock.h” )。
2初始化套接字,在应用程序类的成员函数:“::InitInstance()”中添加如下初始化套接字代码。
if (!AfxSocketInit())
{AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;}
二、创建服务套接字并创建监听线程。
//创建服务套接字
SOCKET sercon=socket(PF_INET,SOCK_STREAM,0);
//判断是否成功创建
if (sercon==INVALID_SOCKET)
{AfxMessageBox(“Server WRONG !”);
return -1;}
//配置套接字地址等信息
SOCKADDR_IN sin;
sin.sin_family=AF_INET;
//指定本地地址
sin.sin_addr.s_addr=htonl(INADDR_ANY);
//指定服务器端口号nPort,可自设
int nPort=5080;
sin.sin_port=htons(nPort);
//地址信息与套接字进行绑定。
if (bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{AfxMessageBox(“bind wrong!”);
return -1;}
//建立监听队列(大小为3),开始监听
if (listen(sercon,3)==SOCKET_ERROR)
{AfxMessageBox(“listen wrong!”);
return -1;};
①实现监听线程,并创建数据接收线程。
//在程序需要开始监听连接的地方创建监听线程,并实现。
//创建监听线程(在程序开始或按钮事件实现中)
AfxBeginThread(waitconnect,NULL);
//实现监听线程
UINT waitconnect(LPVOID lpParm)
{SOCKET conn[3];
int lenc=sizeof(sockaddr);
int alreadycon=0;
//sercon为前面所创建服务器套接字
while(1)
{if (alreadycon<=3)
{//接受连接请求
conn[alreadycon]=accept(sercon,&cin,&lenc);
if (conn[alreadycon]==INVALID_SOCKET)
{AfxMessageBox(“accept WRONG !”);}
else
{//创建数据接收线程
AfxBeginThread(readdata,&connn[alreadycon]);
Alreadycon= alreadycon+1;
return 0;}}
else
{//避免影响主线程运行
Sleep(200);}
}
}
②实现数据接收线程。
UINT waitconnect(LPVOID ss)
{ SOCKET *readsock;
readsock=(SOCKET *)ss;
char buf[2000];
int revnum=0;
//开始循环接受数据
while (revnum!=-1)
{//revnum<=0则表示连接已断!
revnum=recv(*readsock,buf,2000,0);
if (revnum>0)
buf[revnum]=0;//截断缓冲区
//buf中存储已接受数据。}
}
③发送数据
//conn[1]为用于接受连接的套接字, sendstr为所发送数据。
send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);
④关闭套接字。
//conn[1]为用于接受连接的套接字
closesocket(conn[1]);
客户程序端:
客户端程序的编程有很多与服务器端相同或相近,甚至相同的代码。
一、建立支持SOCKET项目。
方法同服务器端。
二、创建客户套接字、对服务器进行连接。
//nHost 须用户指定的远程服务机,IP或域名。
CString nHost;
//h为地址信息
struct hostent *h;
h=gethostbyname(nHost);
//nHost 须用户指定的远程服务端口号
int nPort;
SOCKET con_client;
SOCKADDR_IN csin;
if (h!=NULL)
{//创建套接字
con_client =socket(AF_INET,SOCK_STREAM,0);
csin.sin_family=AF_INET;
memcpy(&(csin.sin_addr.s_addr),h->h_addr,sizeof(int));
csin.sin_port=htons(nPort);
//开始连接
if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)))
{//AfxMessageBox(“connect wrong!”);
return -1;}
else
{//连接成功,创建数据接收线程
AfxBeginThread(readdata,&con_client);}
}
三、实现数据接收线程。
代码与服务器端完全相同。
四、发送数据。
//con_client 为与服务器进行连接的套接字。
send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);
五、关闭套接字。
// con_client 为与服务器进行连接的套接字。
closesocket(conn[1]);
在实际应用中,应当根据需要调整并改变一些变量的作用域。
以上程序在VC6.0 、WIN NT4.0 及Windows 98中调试通过。
最后说一点,在VC6.0 MFC中的CSOCKET类是对SOCKET的一个MFC封装,并且它支持文档序列化,可以方便地实现不同数据类型的传输。本文前面之所以没有介绍CSOCKET,是因为用CSOCKET的实现方法与上面所讲述的思路相同,并且更为简单。另外一个更重要的原因是便于向UNIX编程时移植,因为UNIX支持SOCKET。}
本文地址:http://com.8s8s.com/it/it3080.htm
白羊
金牛
双子
巨蟹
狮子
处女
天秤
天蝎
射手
摩羯
水瓶
双鱼
今日
本周
本月
白羊
金牛
双子
巨蟹
狮子
处女
天秤
天蝎
射手
摩羯
水瓶
双鱼
A型
B型
O型
AB型
子鼠
丑牛
寅虎
卯兔
辰龙
巳蛇
午马
未羊
申猴
酉鸡
戌狗
亥猪
A型
B型
AB型
O型
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
1日
2日
3日
4日
5日
6日
7日
8日
9日
10日
11日
12日
13日
14日
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30日
31日
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
1日
2日
3日
4日
5日
6日
7日
8日
9日
10日
11日
12日
13日
14日
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30日
31日