VC实现客户端服务器端的网络编程

上传人:h****9 文档编号:208763661 上传时间:2023-05-11 格式:DOCX 页数:13 大小:13.58KB
收藏 版权申诉 举报 下载
VC实现客户端服务器端的网络编程_第1页
第1页 / 共13页
VC实现客户端服务器端的网络编程_第2页
第2页 / 共13页
VC实现客户端服务器端的网络编程_第3页
第3页 / 共13页
资源描述:

《VC实现客户端服务器端的网络编程》由会员分享,可在线阅读,更多相关《VC实现客户端服务器端的网络编程(13页珍藏版)》请在装配图网上搜索。

1、细心整理vc 网络编程socket 在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并供应一个效劳器客户端详细的实例。盼望对您有所帮助一、原理局部 (个人觉得这篇写的可以,所以转和此,原文地址:)在网络编程中最常用的方案便是Client/Server (客户机/效劳器)模型。在这种方案中客户应用程序向效劳器程序请求效劳。一个效劳程序通常在一个众所周知的地址监听对效劳的请求,也就是说,效劳进程始终处于休眠状态,直到一个客户向这个效劳的地址提出了连接请求。在这个时刻,效劳程序被惊醒并且为客户供应效劳对客户的请求作出适当的反响。为了便利这种Client/Server

2、模型的网络编程,90年头初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets标准,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。此时此刻的Winsock已经根本上实现了和协议无关,你可以运用Winsock来调用多种协议的功能,但较常运用的是TCP/IP协议。Socket实际在计算机中供应了一个通信端口,可以通过这个端口和任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。微软为 Visual C+定义了Winsock类如CAsyncSo

3、cket类和派生于CAsyncSocket 的CSocket类,它们简洁易用,读者挚友当然可以运用这些类来实现自己的网络程序,但是为了更好的了解Winsock API编程技术,我们这里探讨怎样运用底层的API函数实现简洁的 Winsock 网络应用程式设计,分别说明如何在Server端和Client端操作Socket,实现基于TCP/IP的数据传送,最终给出相关的源代码。在VC中进展WINSOCK的API编程开发的时候,须要在工程中运用下面的三个文件,否那么会出现编译错误。1WINSOCK.H: 这是WINSOCK API的头文件,须要包含在工程中。2WSOCK32.LIB: WINSOCK

4、API连接库文件。在运用中,必需要把它作为工程的非缺省的连接库包含到工程文件中去。 3WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装书目下。效劳器端操作 socket套接字1在初始化阶段调用WSAStartup()此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程式中调用该函数的形式如下:WSAStartup(WORD)(18|1),LPWSADATA&WSAData),其中(18|1)表示我们用的是WinSocket1.1版本,WSAata用

5、来存储系统传回的关于WinSocket的资料。2、建立Socket初始化WinSock的动态连接库后,须要在效劳器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所运用的通信协议。此函数调用成功返回Socket对象,失败那么返回INVALID_SOCKET(调用WSAGetLastError()可得知缘由,全部WinSocket 的API函数都可以运用这个函数来获得失败的缘由)。SOCKET PASCAL FAR socket( int af, int type, int protocol )参数: af:目前只供应 PF_IN

6、ET(AF_INET);type:Socket 的类型 (SOCK_STREAM、SOCK_DGRAM);protocol:通讯协定(假如运用者不指定那么设为0);假如要建立的是遵从TCP/IP协议的socket,其次个参数type应为SOCK_STREAM,如为UDP数据报的socket,应为SOCK_DGRAM。3、绑定端口接下来要为效劳器端定义的这个监听的Socket指定一个地址及端口Port,这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否那么返回SOCKET_ERROR。int PASCAL FAR bind( SOCKET s

7、, const struct sockaddr FAR *name,int namelen );参 数: s:Socket对象名;name:Socket的地址值,这个地址必需是执行这个程式所在机器的IP地址;namelen:name的长度; 假如运用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。4、监听当效劳器端的Socket对象绑定完成之后,效劳器端必需建立一个监听的队列来接收客户端的连接请求。

8、listen()函数使效劳器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。该函数调用成功返回0,否那么返回SOCKET_ERROR。int PASCAL FAR listen( SOCKET s, int backlog );参 数: s:须要建立监听的Socket;backlog:最大连接个数;效劳器端的Socket调用完listen后,假如此时客户端调用connect函数提出连接申请的话,Server 端必需再调用accept() 函数,这样效劳器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而效劳器端的

9、Socket在恰当的时候调用 accept()函数完成连接的建立,我们就要运用WSAAsyncSelect函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否那么返回SOCKET_ERROR。int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );参数: s:Socket 对象;hWnd :接收消息的窗口句柄;wMsg:传给窗口的消息;lEvent:被注册的网络事务,也即是应用程序向窗口发送消息的网路事务,该值为以下值FD_READ、FD_WRITE、FD_OO

10、B、 FD_ACCEPT、FD_CONNECT、FD_CLOSE的组合,各个值的详细含意为FD_READ:盼望在套接字S收到数据时收到消息;FD_WRITE:盼望在套接字S上可以发送数据时收到消息;FD_ACCEPT:盼望在套接字S上收到连接请求时收到消息;FD_CONNECT:盼望在套接字S上连接成功时收到消息;FD_CLOSE:盼望在套接字S上连接关闭时收到消息;FD_OOB:盼望在套接字S上收到带外数据时收到消息。详细应用时,wMsg应是在应用程序中定义的消息名称,而消息构造中的lParam那么为以上各种网络事务名称。所以,可以在窗口处理自定义消息函数中运用以下构造来响应Socket的不

11、同事务:switch(lParam)case FD_READ: break;case FD_WRITE: break;5、效劳器端承受客户端的连接请求当Client提出连接请求时,Server 端hwnd视窗会收到Winsock Stack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事务。为了使效劳器端承受客户端的连接请求,就要运用 accept() 函数,该函数新建一Socket和客户端的Socket相通,原先监听之Socket接着进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否那么返回INVALID_SOCKET。

12、SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );参数:s:Socket的识别码;addr:存放来连接的客户端的地址;addrlen:addr的长度6、完毕 socket 连接完毕效劳器和客户端的通信连接是很简洁的,这一过程可以由效劳器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭 Server端监听状态的socket,同样也是利用此函数。另外,和程序启动时调用WSAStartup()憨数相对应,程式完毕前,须要调用 WSACleanup() 来通知Win

13、sock Dll释放Socket所占用的资源。这两个函数都是调用成功返回0,否那么返回SOCKET_ERROR。int PASCAL FAR closesocket( SOCKET s );参数:s:Socket 的识别码;int PASCAL FAR WSACleanup( void );参数: 无二实现例子效劳器端:#include #include #pragma comment(lib, ws2_32.lib)void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWOR

14、D( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrS

15、rv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);/ 绑定端口 listen(sockSrv,5); SOCKADDR_IN addrClient;/ 连接上的客户端ip地址 int len=sizeof(SOCKADDR); while(1) SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/ 承受客户端连接,获得客户端的ip地址 char sendBuf50; sp

16、rintf(sendBuf,Welcome %s to here!,inet_ntoa(addrClient.sin_addr);/ 组合消息发送出去 send(sockConn,sendBuf,strlen(sendBuf)+1,0);/ 发送消息到客户端 char recvBuf50; recv(sockConn,recvBuf,50,0);/ 承受客户端消息 printf(%sn,recvBuf); /closesocket(sockConn);/断开连接 客户端代码#include #include #pragma comment(lib, ws2_32.lib)void main()

17、 WORD wVersionRequested; WSADATA wsaData;/WSAata用来存储系统传回的关于WinSocket的资料。 int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockC

18、lient=socket(AF_INET,SOCK_STREAM,0);/ AF_INET .tcp连接 /初始化连接和端口号 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/本机地址,效劳器在本机开启 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);/ 设置端口号 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);/连接效劳器 char recvBuf50; recv(sockClient,recvBuf,50,0);/承受数据 printf(%sn,recvBuf); send(sockClient,hello,strlen(hello)+1,0);/发送数据 closesocket(sockClient);/关闭连接 WSACleanup();

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!