使用MFC实现连接服务器的方法 (mfc 连接服务器)

MFC(Microsoft Foundation Classes)是Microsoft公司开发的一套基于C++语言的类库,是开发Windows平台应用程序的重要工具。在网络通信方面,MFC提供了丰富的类库支持,方便开发者进行网络编程。针对MFC开发的网络通信应用,本文介绍了如何。

一、MFC中使用Socket类连接服务器

Socket是MFC中提供的一种与TCP/IP协议相关的网络通信类。通过Socket类,我们可以方便地实现与服务器之间的数据通信。下面是使用Socket类连接服务器的步骤:

1、定义Socket对象

在MFC应用程序中,可以使用如下代码定义Socket对象:

SOCKET m_Socket;

2、初始化Socket对象

在定义Socket对象后,需要对其进行初始化,可以使用如下代码初始化Socket对象:

if(WSAStartup(MAKEWORD(2,0),&wsa)==0)

{

m_Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

}

其中,WSAStartup函数用于初始化MFC中的Socket支持。

3、连接服务器

初始化Socket对象后,需要使用connect函数连接服务器,可以使用如下代码:

if(connect(m_Socket,(SOCKADDR *)&addr,sizeof(SOCKADDR))==0)

{

//连接成功后的处理

}

其中,addr是一个SOCKADDR类型的结构体,用于存储服务器的IP地址和端口号。在连接成功后,可以对Socket对象进行数据通信等操作。

二、使用CAsyncSocket类连接服务器

CAsyncSocket是MFC中提供的一种异步Socket类,与Socket类相比,它使用起来更为简便。下面是使用CAsyncSocket类连接服务器的步骤:

1、定义CAsyncSocket对象

在MFC应用程序中,可以使用如下代码定义CAsyncSocket对象:

CAsyncSocket m_Socket;

2、连接服务器

对于CAsyncSocket对象,可以直接使用Connect函数连接服务器,可以使用如下代码:

if(m_Socket.Connect(_T(“127.0.0.1”),8080))

{

//连接成功后的处理

}

其中,_T(“127.0.0.1”)表示服务器的IP地址,8080表示服务器的端口号。

三、MFC网络库连接服务器

MFC网络库是MFC中提供的一种高级网络通信库,封装了Socket和CAsyncSocket等底层API,使用起来更加方便。下面是使用MFC网络库连接服务器的步骤:

1、定义CInternetSession对象

在使用MFC网络库进行网络通信时,需要定义CInternetSession对象,可以使用如下代码定义:

CInternetSession m_Session;

2、连接服务器

通过CInternetSession对象,可以使用如下代码连接服务器:

CInternetConnection* pConnection=m_Session.GetHttpConnection(_T(“127.0.0.1”),8080);

if(pConnection)

{

//连接成功后的处理

}

其中,_T(“127.0.0.1”)表示服务器的IP地址,8080表示服务器的端口号。在连接成功后,可以使用pConnection对象进行数据传输等操作。

四、

通过以上三种方法,我们可以在MFC应用程序中使用Socket、CAsyncSocket和MFC网络库等方式连接服务器,实现数据通信等操作。具体选择哪种方式,则需要根据实际开发需要进行考虑。无论使用哪种方式,都需要注意安全规范,防止网络攻击等安全问题。

相关问题拓展阅读:

MFC是如何接收用套接字传来的数据的?

一、接收与发送过程:

服务器端

  1、创建服务器套接字(CREATE)。

  2、服务器套接字进行信息绑定(BIND),并开始监听连接(LISTEN)。

  3、接受来自客户端的连接请求(ACCEPT),并创建接收进程。

  4、开始数据传输(SEND、RECEIVE)。

  5、关闭套接字(CLOSESOCKET)。

客户机端

  1、创建客户机套接字(CREATE)。

  2、与远程服务器进行连接(CONNECT),如被接受则创建接收进程。

  3、开始数据传输(SEND、RECEIVE)。

  4、关闭套接字(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;  int lenc=sizeof(sockaddr);  int alreadycon=0;  //sercon为前面所创建服务器套接字  while(1)  {if (alreadycon0)

  buf=0;//截断缓冲区

  //buf中存储已接受数据。}

  }

  ③发送数据

  //conn为用于接受连接的套接字, sendstr为所发送数据。

  send(conn,LPCTSTR(sendstr),sendstr.GetLength(),0);

  ④关闭套接字。

  //conn为用于接受连接的套接字

  closesocket(conn);

  客户程序端:

  客户端程序的编程有很多与服务器端相同或相近,甚至相同的代码。

  一、建立支持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);

mfc 多线程问题

使用SuspendThread()和ResumeThread()函数,可以挂起和唤醒一个线程,调用这铅陵两个函数的可以是其他线程,也可以是本身。

睡眠也就是楼上说的Sleep()函槐枝戚数或SleepEx函数,这个只是暂时挂起线程一段指定的事件,用于线程和用户交互。当然,休眠也就是挂起了,这个挂起时间是不确定的,是需要ResumeThread()的。

说到底,休眠和睡眠都是挂起搭慎,只是时间确不确定和需不需要唤醒的问题。休眠是需要有线程唤醒的,睡眠自己的时间到了就自己醒了,这就是区别!

在windows下做服务器更好的方案是IOCP(I/O Complete port),中文名I/O完成端口

性能很不错。涉及windows高级编程,难学指数比较高

你的的感觉很不错,这个方案不可行:

1.会浪费大量CPU时间。一台计算机CPU个数有限,如果你的计算机只有2个CPU,却开了200线程。这个时候在同一时间,最多有2个线程在运行(因为你只有2个CPU),但是线程的不断切换让你感觉好像200个都在运行,只不过速度很慢。(此时线程切换会耗掉大量CPU时间,得不偿失)。

2.浪费内存。线程在windows中需要用数据表示,200个线程,开销有点浪费(虽然现在内存都很大,但是我们不能浪费)

3.线程同步问题会让你晕掉的,200个线程并发处理是很麻烦的早源,要进行线程同步,以及线程通信,同步和通信是多线程芦饥必须深思熟虑的。

4.有一个很不错的陪睁返解决方案—IOCP

关于IOCP的学习,网上资料很多在此不多言。

enjoy coding

问题描述不明确,二楼不错,长知识了。

关于mfc 连接服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 使用MFC实现连接服务器的方法 (mfc 连接服务器)