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

MFC之Socket服务端编程

    博客分类:
  • C++
阅读更多

       这些天由于工作需要,需要用到MFC的Socket编程,于是和这个许久未见的老朋友C++又有了接触,虽然彼此有些生疏,但还算顺利,哈哈。。。。,经过百度谷歌一番,着实发现资料很多,但是有些会将我们带入误区,特别如果你是个初学者。所以就自己这次的经验总结下吧,闲着也是闲着。

       一、假如你是个初学者,那就让我们先了解了解Socket的一些基本知识

       1、什么是TCP/IP、UDP?

       TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

  UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

       2 、TCP/IP、UDP之间的区别

       A、TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;
       B、TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
       C、也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;
       D、UDP段结构比TCP的段结构简单,因此网络开销也小。

       3、Socket是什么?

       Socket熟称“套接字”,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面(Facade)模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。     

       4、Socket编程有哪些类型?

       常用的Socket类型有:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。这里主要讲下SOCK_STREAM和SOCK_DGRAM,其中SOCK_STREAM是基于TCP/IP协议传输的,SOCK_DGRAM就是基于UDP的,两张协议不可相互通信,所以在创建Socket的时候要注意,服务端和客户端要采用同一种协议。

       二、Socket服务端,启动Socket和监听客户端的连接

BOOL CPostClientDlg::InitSocket()
{
	//m_socket=socket(AF_INET,SOCK_DGRAM,0); //基于udp
	m_socket=socket(AF_INET,SOCK_STREAM,0);//基于tcp
	
	if(INVALID_SOCKET==m_socket)
	{
		MessageBox("套接字创建失败!");
		return FALSE;
	}
	SOCKADDR_IN addrSock;
	addrSock.sin_family=AF_INET;
	addrSock.sin_port=htons(6000);
	addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

	int retval;
	retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
	
	if(SOCKET_ERROR==retval)
	{
		closesocket(m_socket);
		MessageBox("绑定失败!");
		return FALSE;
	}

	//创建一线程监听
	RECVPARAM *pRecvParam=new RECVPARAM;
	pRecvParam->sock=m_socket;
	pRecvParam->hwnd=m_hWnd;
	HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
	CloseHandle(hThread);
	
	return TRUE;
}

 

DWORD WINAPI CPostClientDlg::RecvProc(LPVOID lpParameter)
{
	SOCKET sock=((RECVPARAM*)lpParameter)->sock;
	HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
	delete lpParameter;	//释放内存的操作
	
	if(listen(sock,5) == SOCKET_ERROR)
    	{
    	    //监听客户端,如果是基于UDP的,则不需要listen
	    return 0;
    	} 

	SOCKADDR_IN addrFrom;
	int len=sizeof(SOCKADDR);

	char recvBuf[200]={0};//获取客户端发送的消息
	int retval;
	while(TRUE)
	{
		SOCKET ConnectSocket = accept(sock,(sockaddr*)&addrFrom,&len); //得到客户端的IP地址。 
		retval=recv(ConnectSocket,recvBuf,200,0); 
		if(SOCKET_ERROR==retval)
			break;

	}
	return 0;
}

 其中结构体RECVPARAM定义如下:

struct RECVPARAM
{
 SOCKET sock;
 HWND hwnd;
};

 

 就这么简单,服务端就ok了。

 之前在网上看到的大部门创建服务端的Socket的基本上都是在主线程里加监听,犹如

BOOL CPostClientDlg::InitSocket()
{
	//m_socket=socket(AF_INET,SOCK_DGRAM,0); //基于udp
	m_socket=socket(AF_INET,SOCK_STREAM,0);//基于tcp
	
	if(INVALID_SOCKET==m_socket)
	{
		MessageBox("套接字创建失败!");
		return FALSE;
	}
	SOCKADDR_IN addrSock;
	addrSock.sin_family=AF_INET;
	addrSock.sin_port=htons(6000);
	addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

	int retval;
	retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
	
	if(SOCKET_ERROR==retval)
	{
		closesocket(m_socket);
		MessageBox("绑定失败!");
		return FALSE;
	}

	//监听
	if(listen(m_socket,5) == SOCKET_ERROR)
    	{
    	    //监听客户端,如果是基于UDP的,则不需要listen
	    return FALSE;
    	} 
	while(TRUE)
	{
		SOCKET ConnectSocket = accept(m_socket,(sockaddr*)&addrFrom,&len); //得到客户端的IP地址。 
		.....

	}
	
	return TRUE;
}

 

这样会导致主线程得不到释放程序会假死现象。

当然这是比较原始的Socket编程了,现在对Socket封装的类也有很多,编程起来也很方便,比如用的比较多的是CAsyncSocket,CSocket等等,但是如果要学习的话还是原始的好,毕竟被包装过的,看不到他的真面目,哈哈!

       服务端创建Socket就这么简单,希望对你有所帮助!

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MFC socket客户端服务端一对多.rar

    标题"MFC socket客户端服务端一对多.rar"涉及的是在Microsoft Foundation Classes (MFC)库中实现基于Socket的通信,特别是创建一个服务器端程序,能够同时处理多个客户端连接。MFC是微软提供的一种C++类库,它封装了...

    MFC:Socket编程—TCP服务端和多个客户端通信 示例代码

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的Socket编程,特别是如何实现一个TCP服务端与多个客户端之间的通信。MFC是微软提供的一套C++类库,用于简化Windows应用程序开发,其中包括对网络...

    MFC实现的Socket编程

    本项目使用VC6.0作为开发环境,通过MFC实现了客户端和服务端之间的Socket通信,具有一定的可扩展性。 首先,我们来了解一下MFC中的Socket编程。MFC对Winsock API进行了封装,提供了CSocket、CSocketFile和CArchive...

    MFC socket编程,网络传输(服务器端,客户端)

    用socket套接字实现了文件传输,尤其适用于初学者学习socket进行创建,绑定,监听,接收等过程,服务器端和客户端进行通信的整个流程,MFC界面简单。发送端有,create ,listen,accept,send等函数;接收端有create...

    socket通信MFC编程

    在"socket通信MFC编程"这个主题中,我们将关注如何在MFC框架下构建Socket服务端和客户端应用。 MFC中的CSocket类是实现Socket通信的关键,它是CObject的派生类,提供了基本的Socket操作,如连接、监听、发送和接收...

    MFC 基于Socket的服务器和客户端

    首先,让我们了解一下MFC中的Socket编程。MFC提供了CSocket类,它是对Windows Socket API的封装,简化了Socket的创建、连接、接收和发送数据等操作。在服务器端,我们需要创建一个CSocket对象,绑定到特定的IP地址和...

    一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)

    实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了...

    socket(服务端)

    总结,C++结合MFC实现服务端Socket程序,需要理解Socket编程的基本流程,并利用MFC的类库来构建图形界面。这涉及到网络编程、多线程、事件驱动编程等多个技术领域,需要扎实的C++基础和对网络通信的理解。通过这种...

    MFC实现多个客户端通过服务器进行通信的Socket多线程编程

    2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到客户端B的Socket,将内容转发给客户端B,实现客户端...

    简单的基于MFC的Socket点对点对话客户端

    **标题解析:** "简单的基于MFC的Socket点对点对话客户端" 指的是一个使用Microsoft Foundation ...以上就是基于给定信息推断出的相关知识点,涵盖了MFC库和Socket编程的基础,以及可能在项目中遇到的各种技术细节。

    mfc socket的例子

    MFC将Win32 API中的Socket函数封装成了CAsyncSocket类,使得在MFC环境中进行Socket编程变得更加简洁。CAsyncSocket类继承自CObject,它提供了异步事件驱动的Socket操作,如连接、接收、发送等。用户只需要处理...

    MFC客户端操作服务端文件

    本项目涉及的是一个MFC客户端与服务端的交互,实现客户端远程操作服务端的文件功能,如拷贝、复制、粘贴和删除等。这种设计模式常见于分布式系统或网络文件管理系统中,它允许用户在不同设备间便捷地管理文件。 ...

    MFC实现Socket连接

    每个线程可以独立地监听和处理来自不同客户端的Socket连接,提高服务端的并发处理能力。使用多线程时,需要注意线程同步问题,如互斥量(CMutex)、事件对象(CEvent)等同步机制,防止数据冲突和资源争用。 压缩包...

    VC++基于socket传输文件服务端代码

    在IT领域,网络通信是不可或缺的一部分,而Socket编程则是实现客户端与服务器间通信的重要手段。在本主题中,我们关注的是使用VC++编程语言通过Socket实现文件传输的服务器端代码。"VC++基于socket传输文件服务端...

    MFC Socket通信_客户端、服务器

    MFC对Socket编程进行了封装,主要体现在CAsyncSocket类中,它简化了Socket操作,提供了异步事件驱动的编程模型。开发者可以通过继承CAsyncSocket类,重载OnConnect(), OnReceive(), OnSend()等成员函数来处理网络...

    VS2013 C++ MFC,Socket,TCP服务端,多个客户端通信

    在本项目中,"VS2013 C++ MFC, Socket, TCP服务端, 多个客户端通信",我们探讨的是如何使用Microsoft Visual Studio 2013中的MFC(Microsoft Foundation Classes)库,结合Socket编程技术,来实现一个TCP...

    MFC socket编程

    在MFC中进行Socket编程,可以让我们构建基于网络的应用程序,实现客户端与服务器之间的通信。Socket编程涉及TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)这两种主要的传输层协议。 1. **...

    VC++6.0中socket编程学习教程汇集

    Socket编程是计算机网络通信的核心技术之一,特别是在Windows环境下,如VC++6.0这样的开发工具中,它提供了强大的网络通信功能。本教程汇集了多个关于VC++6.0中Socket编程的学习资源,包括文档和演示文稿,旨在帮助...

    MFC下CSocket服务端

    在Windows编程环境中,Microsoft Foundation Classes (MFC) 是一个C++类库,它提供了对Windows API的封装,使得开发者能够更方便地创建Windows应用程序。在MFC中,`CSocket` 类是用于实现网络通信的基础类,它基于...

Global site tag (gtag.js) - Google Analytics