`
kmplayer
  • 浏览: 509907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于MFC下的网络编程基本知识

阅读更多
1,通信
(1)身份:IP
(2)规则:协议
(3)分机:端口号

2,UDP,无需确认,实时性高.例如:视频会议,视频点播.

3,网络字节顺序: 网络高位先存.
intel:低位先存.

4,网间进程通信完全是异步的.

给出两个实例:(注意工程设置,需要加载库文件ws2_32.lib)
(1)基于TCP可靠连接的SOCKET.
服务器端:
#include <stdio.h>
#include <WINSOCK2.H>

int main()
{
	WORD wVersionRequested;//版本号
	WSADATA wsaData; //记录套接字的详细信息
	int err;
	
	wVersionRequested = MAKEWORD( 1, 1 );//宏,返回版本号
	
	err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
	//initiates use of the Winsock DLL by a process.
	//成功返回0.
	if ( err != 0 ) //表示有错误发生.
	{
		return 1;
	}
	
	if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 
	{                     
		WSACleanup( );//有加载,就要有对应的释放.
		return 1; 
	}

	SOCKET sockSvrver=socket(AF_INET,SOCK_STREAM,0);//创建套接字
	if(sockSvrver==INVALID_SOCKET)
	{
		printf("套接字创建失败.");
		return 1;
	}
	SOCKADDR_IN addServer; //定义地址结构体变量
	addServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//u_long类型转换为网络字节序  htons u_short类型
	addServer.sin_family=AF_INET;
	addServer.sin_port=htons(6000);
	
	int re_bind;
	re_bind=bind(sockSvrver,(SOCKADDR*)&addServer,sizeof(SOCKADDR)); //绑定
	if(re_bind==SOCKET_ERROR)
	{
		closesocket(sockSvrver);
		printf("套接字绑定失败.");
		return 1;		
	}
	listen(sockSvrver,5);//等待队列的最大成员数
	SOCKADDR_IN addrClient; //接受变量
	int len=sizeof(SOCKADDR);//接收变量的长度

	char recvBuf[100];
	char sendBuf[100];
	char tempBuf[100];
	SOCKET sockConnect=accept(sockSvrver,(SOCKADDR*)&addrClient,&len);
	while(1)
	{		
		recv(sockConnect,recvBuf,100,0);
		sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);
		printf("%s\n",tempBuf);
		if('q'==recvBuf[0])//表示客户端想要退出
		{
			send(sockConnect,"q",strlen("q")+1,0);
			printf("Chat end!\n");
			break;
		}
	
		printf("Please input data:\n");	
		gets(sendBuf);//可以得到一行数据
		send(sockConnect,sendBuf,strlen(sendBuf)+1,0);		
	}
	closesocket(sockConnect); //关闭套接字
	WSACleanup();
	//如果不是死循环,需要关闭监听套接字
	//并调用WSACleanup()关闭套接字库
	return 0;
}

客户端:
#include <stdio.h>
#include <WINSOCK2.H>

int main()
{
	WORD wVersionRequested;//版本号
	WSADATA wsaData; //记录套接字的详细信息
	int err;
	
	wVersionRequested = MAKEWORD( 1, 1 );//宏,返回版本号
	
	err = WSAStartup( wVersionRequested, &wsaData );//加载套接字库
	//initiates use of the Winsock DLL by a process.
	//成功返回0.
	if ( err != 0 ) //表示有错误发生.
	{
		return 1;
	}
	
	if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 
	{                     
		WSACleanup( );//有加载,就要有对应的释放.
		return 1; 
	}
	
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字
	SOCKADDR_IN addrServer;
	addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//本地环路地址
	addrServer.sin_port=htons(6000);
	addrServer.sin_family=AF_INET;
	connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));


	char recvBuf[100];
	char sendBuf[100];
	char tempBuf[100];
	while(1)
	{	
		printf("Please input data:\n");	
		gets(sendBuf);//可以得到一行数据
		send(sockClient,sendBuf,strlen(sendBuf)+1,0);

		recv(sockClient,recvBuf,100,0);
		sprintf(tempBuf,"server say: %s",recvBuf);
		printf("%s\n",tempBuf);
		if('q'==recvBuf[0])//表示客户端想要退出
		{
			send(sockClient,"q",strlen("q")+1,0);
			printf("Chat end!\n");
			break;
		}
		
	}
	//5.终止对套接字库的使用
	closesocket(sockClient); //关闭套接字
	WSACleanup();
	return 0;
}


(2)基于UDP连接的SOCKET.
服务器端:
//编写一个基于UDP的聊天工具
//发送端代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库	
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return;	
	}
	//判断是否我们请求的winsocket版本,如果不是
	//则调用WSACleanup终止winsocket的使用并返回
	if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
	{
		WSACleanup( );
		return; 	
	}
//2.创建套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	bind (sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	char recvBuf[100];
	char sendBuf[100];
	char tempBuf[100];
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	while(1)
	{
		recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
		if('q'==recvBuf[0])//表示客户端想要退出
		{
			sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
			printf("Chat end!\n");
			break;
		}
		sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);
		printf("%s\n",tempBuf);
		printf("Please input data:\n");
		
		gets(sendBuf);//可以得到一行数据
		sendto (sockSrv,sendBuf,strlen(sendBuf)+1,0,
			(SOCKADDR*)&addrClient,len);//发送数据
	}
	closesocket(sockSrv);
	WSACleanup();
}

客户端:
//发送端代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库	
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return;	
	}
	//判断是否我们请求的winsocket版本,如果不是
	//则调用WSACleanup终止winsocket的使用并返回
	if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
	{
		WSACleanup( );
		return; 	
	}
//2.创建套接字
	SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
//3.发送消息
	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);

	char recvBuf[100];
	char sendBuf[100];
	char tempBuf[200];
	int len = sizeof(SOCKADDR);
	while (1)
	{
		printf("Please input data:\n");
		gets(sendBuf);
		sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
		recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*) &addrSrv,&len);
		if('q' ==recvBuf[0])
		{
			sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*) &addrSrv,len);
			printf("chat end!\n");
			break;
		}
		sprintf(tempBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
		printf("%s\n",tempBuf);

	}	

	closesocket(sockClient);
	WSACleanup();
}

分享到:
评论

相关推荐

    基于MFC的UDP网络编程

    【基于MFC的UDP网络编程】是针对Visual Studio 2010环境下,利用Microsoft Foundation Classes(MFC)库进行的用户数据报协议(UDP)的网络编程实践。MFC是微软提供的一种C++类库,它封装了Windows API,使得开发者...

    MFC socket网络编程

    而Socket编程是网络通信的基础,MFC对Socket编程提供了封装,使得开发者能够在MFC环境下更方便地进行网络通信程序的开发。本知识点将详细解析如何使用MFC进行Socket网络编程,以创建一个服务器/客户端应用程序。 ##...

    基于mfc的opengl编程

    在这个"基于MFC的OpenGL编程"主题中,我们将探讨如何在MFC应用中集成OpenGL,以及如何解决拖动时产生的图像抖动问题。 首先,我们需要理解MFC中的单文档视图框架(SDI,Single Document Interface)。SDI允许用户...

    基于MFC的Socket编程

    在IT领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。MFC封装了许多Windows API,使得...理解并熟练掌握这些知识点,对于提升在C++环境下进行网络编程的能力非常有帮助。

    基于MFC的网络聊天室

    【基于MFC的网络聊天室】是一个利用C++编程语言,并基于Microsoft Foundation Classes (MFC)库构建的网络通信应用。MFC是微软提供的一套面向对象的C++类库,它封装了Windows API,使得开发者能更方便地创建Windows...

    基于MFC 界面编程的五子棋程序

    基于MFC界面编程的五子棋程序 本资源是一个使用MFC(Microsoft Foundation Classes)编写的简易五子棋程序,代码不复杂,简单容易执行。下面是从代码中提取的相关知识点: MFC编程 MFC(Microsoft Foundation ...

    基于MFC的游戏编程

    总的来说,基于MFC的游戏编程结合了面向对象编程、Windows API调用和图形用户界面设计,需要对C++、Windows编程以及MFC框架有深入的理解。通过学习和实践,你可以掌握如何利用MFC开发出功能丰富的棋类游戏,例如象棋...

    基于MFC编程,邮件收发软件

    【标题】:“基于MFC编程,邮件收发软件” 在计算机科学领域,MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的类库,它为Windows应用程序开发提供了丰富的功能和接口。MFC编程主要是利用C++语言...

    基于MFC的OpenGL编程Part10源码

    本教程"基于MFC的OpenGL编程Part10源码"显然是一个系列教程的一部分,旨在帮助程序员理解如何在MFC应用程序中嵌入和使用OpenGL进行3D图形渲染。 MFC是微软提供的一套面向对象的C++类库,用于构建Windows应用程序。...

    基于MFC的 sql编程全例

    以下是对"基于MFC的SQL编程全例"这一主题的详细讲解: 1. MFC与数据库连接: MFC提供了CDaoDatabase和CDaoRecordset类来支持数据库操作。CDaoDatabase用于建立和管理数据库连接,而CDaoRecordset则用于执行查询并...

    MFC编程基础知识详解

    在MFC编程基础知识中,以下几个关键知识点是初学者必须掌握的: 1. **基础类结构**:MFC的核心类包括CWinApp、CWinThread、CWnd、CDocument和CView。CWinApp是应用程序的入口点,负责初始化和管理应用程序;...

    MFC.zip_MFC 五子棋_MFC网络五子棋_mfc网络编程_网络五子棋_网络编程

    在这个项目中,“MFC.zip_MFC 五子棋_MFC网络五子棋_mfc网络编程_网络五子棋_网络编程”显然是一款基于MFC技术开发的网络五子棋游戏。本文将深入探讨如何利用MFC进行网络编程,以及在设计网络五子棋游戏时所涉及的...

    VC网络五子棋一个很好MFC的网络编程

    通过以上这些知识点的学习和实践,开发者可以掌握利用MFC进行网络编程的基本方法,并能成功地构建一个网络五子棋游戏。这个过程不仅锻炼了编程技巧,也深化了对网络通信和多线程编程的理解。在实际开发中,不断优化...

    基于MFC的DirectX编程框架

    在"基于MFC的DirectX编程框架"中,通常会包含以下几个关键知识点: 1. **MFC与DirectX的集成**: - MFC的CWnd派生类:DirectX的初始化工作被封装在一个CWnd的派生类中。这是因为CWnd是MFC中的基本窗口类,它代表...

    基于MFC的OpenGL编程

    ### 基于MFC的OpenGL编程:详细解析与实践指南 #### 一、概述 在计算机图形学领域,OpenGL(Open Graphics Library)是一种广泛使用的跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。而...

    基于MFC的OpenGL编程part6源码

    基于MFC的OpenGL编程结合了这两种技术,使得开发者可以在Windows环境下方便地利用OpenGL的强大功能。 在"基于MFC的OpenGL编程part6源码"中,我们可以期待学习以下几个关键知识点: 1. **OpenGL窗口创建**:MFC提供...

    基于mfc的简单编程(包含姓名和年龄信息俩个数据项)

    以上就是基于MFC的简单编程实现,通过对话框收集姓名和年龄信息,然后利用ADO存入数据库的基本步骤。对于初学者来说,这是一个很好的起点,可以帮助理解和掌握MFC及数据库操作的基础知识。随着对MFC和ADO的深入学习...

    MFC下的socket编程

    在Microsoft Foundation Classes (MFC) 中进行Socket编程,主要是为了构建基于Windows的网络应用程序,使得它们能够通过Internet或局域网进行通信。MFC提供了一种面向对象的方式来封装Windows的Socket API,使得...

    Socket编写的一个基于MFC的聊天程序源代码。

    在这个基于MFC(Microsoft Foundation Classes)的聊天程序源代码中,我们可以深入学习到如何利用Socket接口在Windows环境下进行网络聊天应用的开发。MFC是微软提供的一个C++类库,它封装了Windows API,使得开发者...

    基于MFC的简单网络聊天室

    总结起来,"基于MFC的简单网络聊天室"是一个很好的实践项目,它涵盖了MFC的基础知识、网络编程的基本概念以及面向对象编程的实践。对于想要学习MFC和网络编程的初学者,这是一个很好的起点,通过分析和运行这个项目...

Global site tag (gtag.js) - Google Analytics