这些天由于工作需要,需要用到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"涉及的是在Microsoft Foundation Classes (MFC)库中实现基于Socket的通信,特别是创建一个服务器端程序,能够同时处理多个客户端连接。MFC是微软提供的一种C++类库,它封装了...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的Socket编程,特别是如何实现一个TCP服务端与多个客户端之间的通信。MFC是微软提供的一套C++类库,用于简化Windows应用程序开发,其中包括对网络...
本项目使用VC6.0作为开发环境,通过MFC实现了客户端和服务端之间的Socket通信,具有一定的可扩展性。 首先,我们来了解一下MFC中的Socket编程。MFC对Winsock API进行了封装,提供了CSocket、CSocketFile和CArchive...
用socket套接字实现了文件传输,尤其适用于初学者学习socket进行创建,绑定,监听,接收等过程,服务器端和客户端进行通信的整个流程,MFC界面简单。发送端有,create ,listen,accept,send等函数;接收端有create...
在"socket通信MFC编程"这个主题中,我们将关注如何在MFC框架下构建Socket服务端和客户端应用。 MFC中的CSocket类是实现Socket通信的关键,它是CObject的派生类,提供了基本的Socket操作,如连接、监听、发送和接收...
首先,让我们了解一下MFC中的Socket编程。MFC提供了CSocket类,它是对Windows Socket API的封装,简化了Socket的创建、连接、接收和发送数据等操作。在服务器端,我们需要创建一个CSocket对象,绑定到特定的IP地址和...
实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了...
总结,C++结合MFC实现服务端Socket程序,需要理解Socket编程的基本流程,并利用MFC的类库来构建图形界面。这涉及到网络编程、多线程、事件驱动编程等多个技术领域,需要扎实的C++基础和对网络通信的理解。通过这种...
2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到客户端B的Socket,将内容转发给客户端B,实现客户端...
**标题解析:** "简单的基于MFC的Socket点对点对话客户端" 指的是一个使用Microsoft Foundation ...以上就是基于给定信息推断出的相关知识点,涵盖了MFC库和Socket编程的基础,以及可能在项目中遇到的各种技术细节。
MFC将Win32 API中的Socket函数封装成了CAsyncSocket类,使得在MFC环境中进行Socket编程变得更加简洁。CAsyncSocket类继承自CObject,它提供了异步事件驱动的Socket操作,如连接、接收、发送等。用户只需要处理...
本项目涉及的是一个MFC客户端与服务端的交互,实现客户端远程操作服务端的文件功能,如拷贝、复制、粘贴和删除等。这种设计模式常见于分布式系统或网络文件管理系统中,它允许用户在不同设备间便捷地管理文件。 ...
每个线程可以独立地监听和处理来自不同客户端的Socket连接,提高服务端的并发处理能力。使用多线程时,需要注意线程同步问题,如互斥量(CMutex)、事件对象(CEvent)等同步机制,防止数据冲突和资源争用。 压缩包...
在IT领域,网络通信是不可或缺的一部分,而Socket编程则是实现客户端与服务器间通信的重要手段。在本主题中,我们关注的是使用VC++编程语言通过Socket实现文件传输的服务器端代码。"VC++基于socket传输文件服务端...
MFC对Socket编程进行了封装,主要体现在CAsyncSocket类中,它简化了Socket操作,提供了异步事件驱动的编程模型。开发者可以通过继承CAsyncSocket类,重载OnConnect(), OnReceive(), OnSend()等成员函数来处理网络...
在本项目中,"VS2013 C++ MFC, Socket, TCP服务端, 多个客户端通信",我们探讨的是如何使用Microsoft Visual Studio 2013中的MFC(Microsoft Foundation Classes)库,结合Socket编程技术,来实现一个TCP...
在MFC中进行Socket编程,可以让我们构建基于网络的应用程序,实现客户端与服务器之间的通信。Socket编程涉及TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)这两种主要的传输层协议。 1. **...
Socket编程是计算机网络通信的核心技术之一,特别是在Windows环境下,如VC++6.0这样的开发工具中,它提供了强大的网络通信功能。本教程汇集了多个关于VC++6.0中Socket编程的学习资源,包括文档和演示文稿,旨在帮助...
在Windows编程环境中,Microsoft Foundation Classes (MFC) 是一个C++类库,它提供了对Windows API的封装,使得开发者能够更方便地创建Windows应用程序。在MFC中,`CSocket` 类是用于实现网络通信的基础类,它基于...