学习MFC下的TCP编程

合集下载

TCPIP协议分析与应用编程 MFC套接字编程

TCPIP协议分析与应用编程 MFC套接字编程

模式” 模式”或“非阻塞模式”。 非阻塞模式” • 当一个套接字处于“阻塞模式”(即同步操作模 当一个套接字处于“阻塞模式” 它的阻塞函数(主要包括函数accept accept、 式)时,它的阻塞函数(主要包括函数accept、 connect、send、recv) connect、send、recv)直到操作完成才会返回 控制权。 控制权。 • 如果一个套接字处于“非阻塞模式”(即异步操 如果一个套接字处于“非阻塞模式” 作模式),则阻塞函数被调用后会立即返回, ),则阻塞函数被调用后会立即返回 作模式),则阻塞函数被调用后会立即返回,不 需要等待所需事件的发生。 需要等待所需事件的发生。
第 8 MFC MFC MFC MFC
CAsyncSocket类 CAsyncSocket类
10
• CAsyncSocket类的成员函数 CAsyncSocket类的成员函数
Connect函数 Connect函数 格式: 格式: BOOL Connect ( //地址串型的 LPCTSTR lpszHostAddress, //地址串型的 地址参数,可以是IP IP地址或主机名 地址参数,可以是IP地址或主机名 //端口号 UINT nHostPort //端口号 ); 或者 BOOL Connect ( const SOCKADDR* lpSockAddr, // SOCKADDR类型的地址参数 SOCKADDR类型的地址参数 //地址参数长度 int nSockAddrLen //地址参数长度 );
第 8 MFC MFC MFC MFC
CAsyncSocket类 CAsyncSocket类
些函数的功能和格式与WinSock API函数类似 函数类似。 些函数的功能和格式与WinSock API函数类似。

MFC网络编程

MFC网络编程

网络程序设计教材一、TCP/IP体系结构、特点及相关术语1、TCP/IP体系结构TCP/IP协议实际上就是在物理网上的一组完整的网络协议。

其中TCP是提供传输层服务,而IP则是提供网络层服务。

TCP/IP包括以下协议:(结构如图1.1)IP:网间协议(Internet Protocol) 负责主机间数据的路由和网络上数据的存储。

同时为ICMP,TCP,UDP提供分组发送服务。

用户进程通常不需要涉及这一层。

ARP:地址解析协议(Address Resolution Protocol)此协议将网络地址映射到硬件地址。

RARP:反向地址解析协议(Reverse Address Resolution Protocol)此协议将硬件地址映射到网络地址ICMP:网间报文控制协议(Internet Control Message Protocol) 此协议处理信关和主机的差错和传送控制。

TCP:传送控制协议(Transmission Control Protocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。

它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。

(注:大多数网络用户程序使用TCP)UDP:用户数据报协议(User Datagram Protocol)这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

FTP:文件传输协议(File Transfer Protocol)允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。

SMTP:简单邮件传送协议(Simple Mail Transfer Protocol)SMTP协议为系统之间传送电子邮件。

TELNET:终端协议(Telnet Terminal Procotol)允许用户以虚终端方式访问远程主机HTTP:超文本传输协议(Hypertext Transfer Procotol)TFTP: 简单文件传输协议(Trivial File Transfer Protocol)2、IP地址和子网掩码要学习TCP/IP协议,首先要提到的是IP地址。

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。

在此基础上,我们可以利用MFC来实现简单的网络聊天程序。

首先,我们需要创建一个MFC应用程序项目。

使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。

然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。

接下来,我们需要使用Socket编程来实现网络通信功能。

MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。

在对话框类中添加成员变量m_socket,类型为CSocket。

在OnInitDialog函数中,我们需要创建Socket,并进行连接。

可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。

例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。

然后,我们需要添加事件处理函数来处理发送和接收消息。

当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。

可以使用CString类来处理字符串数据。

当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。

为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。

当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。

在程序结束时,我们需要断开连接并销毁Socket对象。

在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。

除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。

这些可以根据实际需求进行扩展。

总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。

MFC课程设计(Socket通信)

MFC课程设计(Socket通信)

《VS2010-MFC课程设计》报告基于TCP的C/S设计专业:计算机科学与技术班级:计算机11303姓名:游承峰学号:1304240122指导教师:杜小勤服务器的建立1.创建一个MFC项目,修改名称为MyyouchengfengServer以及存放路径2.应用程序类型选择基于对话框3.项目配置,在向导过程中选择“基于对话框”模式,并选择“windows”套接字。

4.设计服务器界面,控件有:5个静态文本(Static Text),最后一个用于指示用户连接个数;2个按钮(Button),一个用于打开或关闭服务器,一个发送聊天内容;4个编辑框(Edit Control),一个用于输入端口号,一个只读的用于显示事件日志,另一个用于输入聊天内容。

5.编辑框2和3还要把Multiline和Vertical Scroll属性选为true,以实现多行显示并自带滚动条6.双击两个按钮自动生成函数,后面添加相关代码即可7.在类视图中添加一个新的MFC类CMyyouchengfengSocket,派生于CSocket类,8.对该类进行类向导添加三个重写的虚函数:OnAccept()、OnClose()、OnReceive() 9.修改CMyyouchengfengSocket.h#pragma once// CMyyouchengfengSocket 命令目标#include "MyyouchengfengServerDlg.h"classCMyyouchengfengServerDlg;classCMyyouchengfengSocket : public CSocket{public:CMyyouchengfengServerDlg* m_pDlg;CMyyouchengfengSocket();virtual ~CMyyouchengfengSocket();virtual void OnAccept(intnErrorCode);virtual void OnClose(intnErrorCode);virtual void OnReceive(intnErrorCode);};10.修改源文件CMyyouchengfengSocket.cppvoidCMyyouchengfengSocket::OnAccept(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->AddClient(); //添加上线用户CSocket::OnAccept(nErrorCode);}voidCMyyouchengfengSocket::OnClose(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->RemoveClient(this); // 删除下线用户CSocket::OnClose(nErrorCode);}voidCMyyouchengfengSocket::OnReceive(intnErrorCode){// TODO: 在此添加专用代码和/或调用基类m_pDlg->RecvData(this); // 接收数据CSocket::OnReceive(nErrorCode);}11.修改头文件MyyouchengfengServerDlg.h开头加上#include"MyyouchengfengSocket.h"class CMyyouchengfengSocket;12. 添加函数声明和变量定义CMyyouchengfengSocket* listenSocket; // 用于打开服务器CPtrListm_clientList; //链表用于存储用户boolm_connect; //用于标记服务器状态void AddClient(); //增加用户,响应用户请求void RemoveClient(CMyyouchengfengSocket* pSocket); //移除下线的用户void RecvData(CMyyouchengfengSocket* pSocket); //获取数据void UpdateEvent(CStringstr); //更新事件日志virtual BOOL PreTranslateMessage(MSG* pMsg); //防止ESC键意外退出void UpdateChatRecord(CStringstr); // 更新聊天记录13. 修改CMyyouchengfengServerDlg.cpp中实现的函数voidCMyyouchengfengServerDlg::OnBnClickedStartserver(){// TODO: 在此添加控件通知处理程序代码if (m_connect){deletelistenSocket;listenSocket = NULL;m_connect = false;SetDlgItemText(IDC_StartServer, _T("打开服务器"));UpdateEvent(_T("系统关闭服务器."));return;}listenSocket = new CMyyouchengfengSocket();listenSocket->m_pDlg = this;UpdateData(true);if (!listenSocket->Create(m_Port)){AfxMessageBox(_T("创建套接字错误!"));listenSocket->Close();return;}if (!listenSocket->Listen()){AfxMessageBox(_T("监听失败!"));listenSocket->Close();return;}m_connect = true;SetDlgItemText(IDC_StartServer, _T("关闭服务器"));UpdateEvent(_T("系统打开服务器."));}本函数用于打开或关闭服务器,主要用到Create函数和Listen函数用于创建服务器和监听客户端。

利用MFC的Csocket类实现网络通信

利用MFC的Csocket类实现网络通信
8
服务器端的创建(6)
编辑界面,对界面上的控件点击右键,选择属性选项,可 以修改ID(把ID改为有意义的名字)和标题
界面上没有控件的地方点击右键,弹出菜单,单击“建立 类向导”(或者英文版叫Class Wizard),为每个控件添加 变量。注意控件ID、变量类型、变量名(参看下页“建立类 向导”)
s_ip=CString(“127.0.0.1”); //默认的目的ip地址
UpdateData(FALSE);
//变量的值传到界面上
c_BTNSend.EnableWindow(FALSE);//发送按钮失效
19
客户端的创建(6) “连接”按钮代码
void CLXClientDlg::OnBtnConnect()//连接按钮相关代码 {
修改控件ID,通过“新建类向导”为控件添加变量
16
客户端的创建(3)程序关闭时关闭端口
通过“建立类向导”,添加WM_DESTROY消息响应函数 1单击
2单击确定
17
客户端创建(4)关闭端口代码
添加关闭端口代码
18
客户端创建(5)
初始化时添加代码,即在 BOOL CLXClientDlg::OnInitDialog()的末尾添加下面代码
2
服务器端的创建(1)
新建工程LXServer
3
服务器端的创建(2)
创建的程序类型为“基本对话”
4
服务器端的创建(3)
选择Windows Sockts支持
5
服务器端的创建(4)
接下来几步直接点击“下一步”,直到下面对话框单击 “完成”
6
服务器端的创建(5)
界面制作7ຫໍສະໝຸດ 添加控件(以客户端界面为例)

MFC网络编程TCPIP的服务器与客户端代码

MFC网络编程TCPIP的服务器与客户端代码

MFC⽹络编程TCPIP的服务器与客户端代码⼀.1 TCP/IP服务器代码:#pragma comment(lib, "ws2_32.lib")//使⽤WinSock库中的函数需要加载这个动态链接库。

#include<WinSock2.h> //因为要使⽤WinSock库中的函数#include<stdio.h> //输⼊输出流#include<iostream>using namespace std;void main(){cout<<"服务器";//------加载套接字库----------WORD wVersionRequested;//保存WinSock库版本号。

不是C++标准的类型,是微软SDK中的类型,WORD的意思为字,是2byte(16位)的⽆符号整数,表⽰范围0~65535.WSADATA wsaData;//存放windows socket初始化信息int err;wVersionRequested = MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);//加载套接字库,成功返回0if(err!=0)return;if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//判断wsaData.wVersion低字节和⾼字节是否都为1,若版本不对应,调⽤WSACleanup函数终⽌对Socket的使⽤ {WSACleanup();return;}//-------创建⽤于监听的套接字-----------SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//参数:AF_INET地址族(这⾥只能是AF_INET或PF_INET,两者在windows没区别),SOCK_STREAM基于TCP/IP需要创建的是流式套接字(所以这⾥只能是SOCK_STREAM), //0(根据地址格式和套接字类别,⾃动选择⼀个合适的协议)//--------绑定套接字------------SOCKADDR_IN addrSrv;//struct sockaddr_in//{// short sin_family;//地址族AF_INET// unsigned short sin_port;//将要分配给套接字的端⼝// struct in_addr sin_addr;//套接字的主机IP地址(32位的IPv4地址)// char sin_zero[8];//填充数,使sockaddr_in结构和sockaddr结构的长度⼀样,成功返回0//};addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//S_addr需要u_long类型。

学习MFC下的TCP编程

学习MFC下的TCP编程

目录1、得到本机IP和主机名 (2)<1>得到本地主机名 (2)<2>主机名和IP地址 (3)2、设置某个按钮不可用: (4)3、控制台下socket通信 (4)<1>、服务器端 (4)<2>、客户端端 (6)4、MFC下TCP编程(只能服务器发,客户端收) (7)<1>、服务器端 (8)<2>、客户端 (10)5、MFC下TCP编程(可以互发) (11)<1>服务器端 (12)1、在*Dlg*.h中添加: (12)2、在protected:下添加 (12)3、在Dlg.cpp中添加内容 (12)4、添加自定义消息响应函数 (13)5、添加变量 (14)6、启动服务器按钮对应的响应函数内容为: (14)7、关闭服务器按钮对应的消息响应函数内容为: (15)8、发送按钮对应的消息响应函数内容为: (16)<2>、客户端 (17)1、在*Dlg*.h中添加: (17)2、在protected:下添加 (18)3、在Dlg.cpp中添加内容 (18)4、添加自定义消息响应函数 (18)文档:wln Email--- jlu.wln@very glad you read my document,hope it can help you ,my friend!1、得到本机IP和主机名首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h>程序:UpdateData(true);char hostname[128] = "";WSADATA wsaData;CString ip;WSAStartup(MAKEWORD(2, 2), &wsaData);gethostname(hostname, sizeof(hostname));//printf("%s", hostname);SetDlgItemText(IDC_STATIC1,hostname);//name里是本机名hostent* host = gethostbyname(hostname);sockaddr_in addre;for (int i = 0;host->h_addr_list[i];i++){CString ip;memcpy(&addre.sin_addr.s_addr,host->h_addr_list[0],host->h_length);ip = inet_ntoa(addre.sin_addr);SetDlgItemText(IDC_STATIC2,ip);}WSACleanup();UpdateData(false);<1>得到本地主机名#include<stdio.h>#include<Winsock2.h>#pragma comment(lib, "Ws2_32.lib")int main(){char hostname [128] = "";WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);gethostname(hostname, sizeof(hostname));printf("%s", hostname);WSACleanup();return 0;}<2>主机名和IP地址//连接ws2_32.libWORD wVersionRequested;WSADATA wsaData;char name[255];CString ip;int err;PHOSTENT hostinfo;wVersionRequested = MAKEWORD( 2, 2 );//版本号2.2//1.加载套接字库err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return;}//判断是否我们请求的winsocket版本,如果不是//则调用WSACleanup终止winsocket的使用并返回if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ){WSACleanup( );return;}///...ifif ( err == 0 ){if( gethostname ( name, sizeof(name)) == 0){if((hostinfo = gethostbyname(name)) != NULL){ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);}}}WSACleanup( );SetDlgItemText(IDC_STATIC1,name);//name里是本机名SetDlgItemText(IDC_STATIC2,ip); //ip中是本机IPUpdateData(false);2、设置某个按钮不可用:m_StartBtn.EnableWindow(TRUE); //可用m_StopBtn.EnableWindow(FALSE); //不可用3、控制台下socket通信首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h><1>、服务器端// TCPConsolSer2.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h>#include <winsock2.h>int main(int argc, char* argv[]){WORD wVersionRequested;//版本号wVersionRequested = MAKEWORD(1, 1);//1.1版本的套接字SOCKET sersock,clisock;struct sockaddr_in seraddr,cliaddr;int serport=5556;char buf[256];WSADATA wsaData;int len,err;//初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0){printf("加载套接字库失败!\n");return -1;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){return -1;}//判断高低字节是不是1,如果不是1.1的版本则退出//创建套接字printf("创建套接字.\n");sersock = socket(AF_INET, SOCK_STREAM, 0);//Socket地址结构体的创建memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family=AF_INET;seraddr.sin_port=htons(serport);//seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //等价于seraddr.S_un.sin_addr=inet_addr("127.0.0.1");seraddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//绑定套接字到服务器地址结构printf("Binding...\n");err=bind(sersock, (SOCKADDR*)&seraddr, sizeof(SOCKADDR));if(err!=0){printf("listen failed:%d\n",WSAGetLastError());exit(-3);}//监听套接字printf("listening...\n");err=listen(sersock,5);if(err!=0){printf("listen failed:%d\n",WSAGetLastError());exit(-2);}//等待连接请求printf("waitting request....\n");len = sizeof(cliaddr);//初始化参数,这个参数必须进行初始化clisock=accept(sersock,(SOCKADDR*)&cliaddr, &len);printf("Accept client: %s: port: %d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));sprintf(buf,"welcome %s",inet_ntoa(cliaddr.sin_addr));send(clisock,buf,strlen(buf),0);//关闭连接closesocket(clisock);closesocket(sersock);WSACleanup();return 0;}<2>、客户端端// TCPConsoleClient2.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h>#include <winsock2.h>int main(int argc, char* argv[]){WORD wVersionRequested;//版本号wVersionRequested = MAKEWORD(1, 1);//1.1版本的套接字SOCKET sock;struct sockaddr_in sockaddr;int serport=5556 ;char buf[256];WSADATA wsaData;int len,err;//初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0){printf("加载套接字库失败!\n");return -1;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){return -1;}//判断高低字节是不是1,如果不是1.1的版本则退出//创建套接字printf("创建套接字.\n");sock = socket(AF_INET, SOCK_STREAM, 0);//Socket地址结构体的创建memset(&sockaddr,0,sizeof(sockaddr));sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(serport);//seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //等价于seraddr.S_un.sin_addr=inet_addr("127.0.0.1");sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//连接服务器err=connect(sock,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//接收欢迎词memset(buf,0,sizeof(buf));len=recv(sock,buf,sizeof(buf),0);printf("%s\n",buf);//关闭连接closesocket(sock);WSACleanup();return 0;}4、MFC下TCP编程(只能服务器发,客户端收) 首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h>点击服务器“发送”按钮,将数据发送过去;点击客户端”接收”按钮,接收服务器发送来的数据,并显示。

MFC网络编程

MFC网络编程

2.MFC框架对于六个网络事件的处理 当上述的网络事件发生时,MFC框架作何处理 呢?按照Windows的消息驱动机制,MFC框 架应当把消息发送给相应的套接字对象,并调 用作为该对象成员函数的事件处理函数。事件 与处理函数是一一映射的。
在afxSock.h文件中的CAsyncSocket类的声明中, 定义了与这六个网络事件对应的事件处理函数。
关闭套接字 1.使用CAsyncSocket类的Close成员函 数 格式:virtual void Close( );
2.使用CAsyncSocket类的ShutDown() 成员函数 使用CAsyncSocket类的ShutDown()成员 函数,可以选择关闭套接字的方式。将套接字 置为不能发送数据,或不能接收数据,或二者 均不能的状态。
CSocket类,从CAsyncSocket类派生,是对 Windows Sockets API 的 高 级 封 装 。 CSocket类继承了CAsyncSocket类的许多成 员函数,用法一致。CSocket类的高级表现在 三个方面: (1)CSocket结合archive类来使用套接字。
(2)CSocket管理了通信的许多方面,如字 节顺序问题和字符串转换问题。 (3)CSocket类为Windows消息的后台处理 提供了阻塞的工作模式。
发送与接收流式数据 当服务器和客户机建立了连接以后,就可以 在服务器端的连接套接字对象和客户端的套 接字对象之间传输数据了。对于流式套接字 对象,使用CAsyncSocket类的Send成员函 数向流式套接字发送数据,使用Receive成 员函数从流式套接字接收数据。
1.用Send成员函数发送数据
virtual void OnConnect(int 对应 FD_CONNECT事件

MFC网络编程学习

MFC网络编程学习

MFC网络编程学习这两天学习了MFC网络编程,发现其实网络编程好像也没有想象中的那么难,做个梳理如下:网络编程人员可以调用windows操作系统套接字访问通信协议,套接字存在与通信区域中,windows套接字只支持一个通信区域即网际域(AF_INET)套接字的类型有三类:流式套接字(SOCK_STREAM)和数据报式套接字(SOCK_DGRAM)和原始套接字流式套接字基于TCP协议,数据报式套接字基于UDP协议实现基于TCP的socket编程的服务器端程序流程如下:1、创建套接字2、将套接字绑定到一个本地地址和端口号上(bind)3、将套接字设为监听模式,准备接受客户请求(listen)4、等待客户请求,请求到来时接受请求,建立链接,并返回一个新的基于此次通信的套接字(accept)5、用返回的套接字和客户端进行通信(send、recv)6、返回,等待另一客户请求7、关闭套接字基于TCP的socket编程的客户端程序流程如下:1、创建套接字2、向服务器端发送请求(connect)3、和服务器端进行通信(send、recv)4、关闭套接字基于UDP的socket编程的服务器端程序流程如下:1、创建套接字2、将套接字绑定到本地地址和端口号上(bind)3、等待接收数据(recvfrom)4、关闭套接字基于UDP的socket编程的客户端程序流程如下:1、创建套接字2、和服务器端进行通信(sendto)3、关闭套接字编写自定义消息处理函数假如说要在Cdlg类中定义消息处理函数则步骤如下:1、在Cdlg类头文件中定义消息#define WM_RECVDATA WM_USER+12、在Cdlg类的头文件中编写该消息响应函数原型的声明// Generated message map functions//{{AFX_MSG(CChatDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBtnSend();//}}AFX_MSGafx_msg void OnRecvData(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP()3、在Cdlg类的实现文件中添加WM_RECVDATA 消息映射BEGIN_MESSAGE_MAP(CChatDlg, CDialog)//{{AFX_MSG_MAP(CChatDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)//}}AFX_MSG_MAPON_MESSAGE(WM_RECVDATA,OnRecvData)END_MESSAGE_MAP()4、在Cdlg类的实现文件中实现OnRecvData函数。

MFC+Winsock类c_s聊天程序开发

MFC+Winsock类c_s聊天程序开发

案例开发与分析——聊天程序的开发一、客户端任务1:创建客户端框架程序,设计用户界面,并实现与服务器的连接。

1.创建一个空白工作区,并命名为Chat。

2.在Chat工作区,用MFC AppWizard创建基于对话框的项目ChatClient,并在Step2中选中Windows Socket选项。

3.在对话框中添加控件,如下图所示:4.对话框中的控件属性如下表:表1 控件属性控件类型控件ID Caption 其他List Box IDC_LIST_MESSAGE 不选SortList Box IDC_LIST_ONLINE_USERS 不选SortEdit Box IDC_EDIT_MESSAGE 选中Multiline和VerticalScroll Radio Button IDC_RADIO_GROUP 群聊Radio Button IDC_RADIO_PRIV A TE 私聊Button IDC_BUTTON_LOGIN 登录Button IDC_BUTTON_LOGOUT 退出5.用ClassWizard为控件对象定义相应的成员变量,如下表所示:表2 控件对应成员变量控件ID 控件类型成员变量名IDC_EDIT_MESSAGE CString m_strMessageIDC_LIST_MESSAGE CListBox m_listMessageIDC_LIST_ONLINE_USERS CListBox m_listUsers6.添加对话框,ID为IDD_DIALOG_LOGIN,Caption为“登录”。

7.在对话框中添加控件,如下图所示:8.对话框中的控件属性如下:Edit Box IDC_EDIT_IPEdit Box IDC_EDIT_PORTEdit Box IDC_EDIT_USERNAMEEdit Box IDC_EDIT_PASSWORD 选Styles->Password Button IDOK 连接选Styles->Default Button Button IDCANCEL 取消9.添加一个新类,类名为CLoginDlg,基类为CDialog,Dialog ID为IDD_DIALOG_LOGIN。

使用MFC快速实现网络编程

使用MFC快速实现网络编程

随着计算机信息技术的飞速发展,互联网与人类社会的工作、生活越来越紧密相关,它已经成为人类获取、交流信息的重要途径和手段。

所以当前对于开发人员来说,网络编程已是必备的技能。

本实例详细介绍了如何利用Winsock API编写网络应用程序。

一、实现方法在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。

在这种方案中客户应用程序向服务器程序请求服务。

一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。

在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。

为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。

现在的Winsock 已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。

Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。

应用程序在网络上传输,接收的信息都通过这个Socket 接口来实现。

微软为Visual C++定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,读者朋友当然可以使用这些类来实现自己的网络程序,但是为了更好的了解Winsock API编程技术,我们这里探讨怎样使用底层的API函数实现简单的Winsock 网络应用程式设计,分别说明如何在Server端和Client端操作Socket,实现基于TCP/IP的数据传送,最后给出相关的源代码。

在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误。

mfcsocket编程

mfcsocket编程

mfcsocket编程一、MFCSocket编程简介MFC(Microsoft Foundation Class)是一种基于Windows平台的C++应用程序框架,用于简化Windows应用程序的开发。

MFCSocket是对MFC 库的扩展,提供了用于创建网络应用程序的类和函数。

通过MFCSocket,开发人员可以轻松地创建基于TCP/IP、UDP等协议的网络应用程序。

二、创建MFCSocket应用程序的步骤1.安装MFC库:在使用MFCSocket编程之前,首先需要安装Microsoft Visual Studio,其中包含了MFC库。

2.创建MFC项目:打开Visual Studio,选择“文件”->“新建”->“项目”,在“创建新项目”对话框中选择“MFC应用程序”,并根据需求设置项目名称、位置等。

3.添加MFCSocket库:在项目属性中,选择“配置属性”->“VC++目录”,将“包含目录”中的MFCSocket库路径添加到项目中。

4.编写代码:在项目中添加源文件(.cpp),编写实现网络通信的代码。

5.编译运行:在Visual Studio中编译项目,运行应用程序,检查功能是否实现。

三、MFCSocket编程的关键概念和API1.CSocket类:CSocket是MFCSocket库的核心类,用于实现socket操作。

通过CSocket类,可以创建、连接、接收和发送数据的socket。

2.CArchive类:CArchive类用于在socket之间传输数据,支持二进制和文本模式。

3.CString类:CString类提供了字符串操作的功能,方便在socket通信中处理字符串数据。

4.其他常用MFC类:如CList、CMap、CSocketAddress等,用于管理socket地址、数据缓冲区等。

四、实际应用案例分析1.案例一:TCP客户端/服务器通信服务器端:监听客户端连接,接收客户端发送的数据,并发送响应数据到客户端。

MFC网络编程技巧

MFC网络编程技巧

MFC网络编程技巧MFC(Microsoft Foundation Classes)是一套用于Windows操作系统上的C++编程框架,它提供了一系列的类和函数,简化了Windows程序的开发。

MFC网络编程则是在MFC框架下进行网络通信的技巧,下面将介绍一些MFC网络编程的重要技巧。

1. 理解TCP/IP和Socket编程:网络编程的核心是理解TCP/IP协议和Socket编程。

TCP/IP协议是Internet上最常用的通信协议,Socket 是对TCP/IP协议的封装,提供了一些类和函数来实现网络通信。

学习TCP/IP协议的基本原理和Socket编程的相关知识是进行MFC网络编程的基础。

2. 使用CAsyncSocket类:MFC框架提供了CAsyncSocket类来简化Socket编程。

CAsyncSocket类封装了Socket编程的各种方法,提供了一些异步操作的函数,比如异步连接、异步发送和异步接收等。

通过使用CAsyncSocket类,可以方便地实现网络通信功能。

3. 处理Socket消息:在MFC应用程序中,Socket的消息处理是通过重载CAsyncSocket类的多个虚函数来实现的。

比如,通过重载OnAccept、OnConnect、OnReceive和OnClose等函数,可以处理Socket 的连接、接收和关闭等事件。

在处理Socket消息时,需要注意及时释放资源,防止内存泄漏。

4. 使用CAsyncSocket的派生类:在实际的网络编程中,通常会创建一个继承自CAsyncSocket的派生类来处理具体的网络通信任务。

通过继承CAsyncSocket类,可以在派生类中实现一些特定的功能,比如客户端的连接、服务器端的接收等。

通过派生类来管理Socket对象,可以更好地组织代码和处理逻辑。

5. 异步发送和接收数据:MFC框架的CAsyncSocket类提供了异步发送和接收数据的函数。

MFC网络编程技巧

MFC网络编程技巧

MFC网络编程技巧MFC(Microsoft Foundation Classes)是一种应用程序框架,用于开发Windows图形用户界面(GUI)应用程序。

网络编程指的是在MFC应用程序中实现与网络通信相关的功能,例如网络套接字的创建和管理、数据的传输、与服务器进行通信等。

在进行MFC网络编程时,有一些技巧可以帮助我们更好地实现所需的功能,并提高程序的性能和稳定性。

以下是一些关键技巧:1. 充分利用MFC提供的网络类:MFC提供了一些用于网络编程的类,例如CSocket、CAsyncSocket、CSocketFile等。

这些类封装了底层的套接字操作,简化了网络编程的实现。

我们可以充分利用这些类来加快开发速度和减少错误。

2. 使用非阻塞的套接字:默认情况下,使用MFC的CSocket类创建的套接字是阻塞的,也就是说,当套接字执行一些操作时,程序会一直等待直到该操作完成。

这可能导致程序的响应性变差。

为了避免这个问题,我们可以将套接字设置为非阻塞模式,这样套接字操作将不再阻塞程序的执行。

3. 使用消息机制进行异步处理:当我们需要在网络编程中执行一些耗时的操作时,例如等待服务器响应、等待数据传输等,使用异步处理可以避免阻塞用户界面,提高程序的响应性。

可以使用MFC的消息机制(例如PostMessage和SendMessage)来实现异步处理。

4. 错误处理和异常处理:在网络编程中,可能会出现各种错误,例如连接超时、网络中断等。

为了保证程序的健壮性,我们需要进行合适的错误处理和异常处理。

可以使用try-catch语句来捕捉和处理异常,确保程序能够正常处理错误情况。

5. 使用多线程进行并发处理:当需要同时处理多个连接或实现并发功能时,可以使用多线程来提高程序的并发能力。

可以使用MFC提供的CWinThread类来创建和管理线程,实现多线程编程。

6.优化性能:在进行网络编程时,性能是一个非常重要的因素。

可以通过一些优化措施来提高程序的性能,例如减少网络传输的数据量、使用缓冲区减少网络读写的次数、使用合适的数据结构等。

MFC实现TCP2COM数据转发

MFC实现TCP2COM数据转发

MFC实现TCP2COM数据转发本文档主要介绍基于MFC对话框实现TCP网络与串口之间的数据互相转发的过程,包括该工具的使用说明,软件开发的主要流程,最后附带该软件的相关代码,给有兴趣的MFC 初学者提供一个简单的模板,帮助初学者快速入门。

目录MFC实现TCP2COM数据转发 (1)一.TCP2COM使用简单介绍 (1)1. TCP服务端与串口互相转发 (2)1.1TCP服务端配置 (2)1.2 TCP客户端配置 (2)1.3TCP2COM串口配置 (3)1.4虚拟终端串口配置 (3)1.5 TCP Server与终端串口之间互相发送数据验证 (3)2. TCP客户端与串口互相转发 (4)2.1 启用工具的TCP服务器 (4)2.2 TCP客户端连接配置 (4)2.3串口与TCP客户端互发数据验证 (4)3. UDP服务器与串口互相转发 (5)3.1启用UDP服务器 (5)3.2连接UDP服务器 (5)3.3串口与UDP服务器互相发数据验证 (5)4. UDP与TCP互相转发 (6)4.1UDP与TCP转发配置 (6)4.2 UDP服务端与TCP服务器互相发数据验证 (6)4.3 UDP服务器与TCP client互相发数据验证 (7)二.TCP2COM工具开发步骤 (7)1. 新建开发项目 (7)1.1创建MFC对话框 (7)1.2输入项目名称 (7)1.3应用程序类型配置 (8)1.4在资源视图添加各种控件 (8)1.5给各种控件新增成员变量 (10)1.6在资源视图下新增定时事件 (10)2. 代码实现 (10)2.1依次在各个按钮下新增触发事件的函数 (10)2.2添加初始化代码 (11)2.3编译生成exe文件 (12)2.4运行exe文件 (12)三.附加相关代码 (13)一.TCP2COM使用简单介绍该软件的主要功能包括:TCP服务端、客户端与串口之间互相转发数据;UDP与串口之间互相转发数据;TCP客户端之间互相转发数据;UDP与TCP互相转发数据。

MFC网络编程技巧

MFC网络编程技巧

Socket编程技巧(一)Socket编程的重要数据结构1、网络字节顺序与主机字节顺序两种主机字节顺序:低位先存,高位先存(根据机器的不同和有区别,目前的INTER主机为低位先存方式)网络字节顺序:对于16位或32位整数TCP/IP要求高位先存相关转换函数:htons()--"Host to Network Short";htonl()--"Host to Network Long";ntohs()--"Network to Host Short";ntohl()--"Network to Host Long";2、地址结构(1)struct sockaddr //套接字地址结构{unsigned short sa_family; //internet协议族AF_INETchar sa_data[14]; //14字节的协议地址,包括IP地址和端口};(2)struct sockaddr_in //in 代表internet{short int sin_family; //internet协议族=AF_INET,IPV4; =AF_INET6, IPV6unsigned short int sin_port; //端口号,必须是网络字节顺序调用htons()函数struct in_addr sin_addr; //internet地址,必须是网络字节顺序调用htonl()函数unsigned char sin_zero[8] //填0};(3)struct in_addr //IPv4地址,4个字节{unsigned long s_addr;};(二)Socket编程中几个重要的函数(1)socket():套接字创建—指定协议一元int socket(int domain,int type,int protocal)int domain, //通信域AF_INET—internet域;AF_UNIX—UNIX域int type, //指定socket的类型:SOCK_STREAM(流式套接字,TCP),SOCK_DGRAM(数据报套接字,UDP),SOCK_RAW(原始数据报套接字)int protocol //指定网络协议,0表示由系统选择合适协议,默认TCP/IP协议返回值:成功---整型socket号sockfd ,失败--- -1例子:socket(AF_INET, SOCK_STREAM,0)socket(AF_INET, SOCK_ DGRAM ,0)(2)bind():命名套接字---指定本地二元,绑定套接字号int bind(int sockfd,struct sockaddr *my_addr,int addrlen)int sockfd, //socket描述符struct sockaddr *my_addr, //指向包含有本机IP地址及端口号等信息的sockaddr类型的指针int addrlen, //sizeof(struct sockaddr)返回值:成功----0; 失败---- <0,SOCKET_ERROR错误作用:将套接字地址与套接字号关联----指点了三元组套接字标识例子:bind(18, my_addr, sizeof(struct sockaddr))my_addr.sin_port= htonl (2222); // =0,系统随机设定1024~5000;自己设定,应选>1024my_addr.sin_addr.s_addr=htonl(INADDR_ANY);//允许服务器应用进程侦听每个网络接口上的客户机请求.(3)listen():监听连接---服务程序监听连接请求,并进行排队,供accept进行后续处理.int listen(int sockfd,int backlog)int sockfd, //服务器通过该套接字侦听客户请求int backlog //请求队列长度,超过长度,服务器拒绝连接请求返回值:0--成功,-1--失败(4)accept()允许服务器通过套接字接收一个连接请求—服务程序使用作用:从listen队列取出第一个连接请求,创建一新的套接字,准备提供并发服务.int accept(ing sockfd,struct sockaddr *addr,int *addrlen)int sockfd, //被监听的socket号,服务器从该套接字接收connect请求struct sockaddr * addr, //存放提出连接请求服务的客户机套接字地址int *addrlen //客户机套接字地址addr长度,sizeof(sockaddr)返回值:若成功建立一个连接,返回的是一个新的socekt号,供新的连接使用;父进程则通过以前的套接字继续接收客户请求. -1--失败(5)connect():请求与远程套接字连接---客户程序使用int connect(int sockfd,struct sockaddr *serv_addr,int addrlen)int sockfd, //本地套接字号struct sockaddr *serv_addr, //serv_addr包含服务器IP地址和端口号地址结构的指针int addrlen //serv_addr的长度,sizeof(sockaddr)返回:0---成功,-1---失败connect()与accept()建立一个全相关五元组(6)send():发送数据int send(int sockfd,const void *msg,int len,int flags)int sockfd, //已连接的用来传输数据的套接字号const void *msg, //指向要发送数据缓冲区的指针int len, //以字节为单位的数据的长度int flags //指定传输控制方式,一般情况下置为0,MSG_OOB,(发送TCP紧急带外数据)返回值:实际发送的数据长度,可能少于len(7)接收数据(7)recv():接受数据int recv(int sockfd,void *buf,int len,unsigned int flags)int sockfd, //接受数据的套接字号void *buf, //存放接收数据的缓冲区指针int len, //缓冲区的长度unsigned int flags //调用方式.一般情况下置为0,MSG_OOB:读取套接字上的紧急带外数据,MSG_PEEK:仅查看数据,不取出返回:0----连接被关闭,>0接收的总字节数,<0 SOCKET_ERROR(8)sendto():UDP—发送数据int sendto(int sockfd,const void *msg,int len,unsigned int flags,const struct sockaddr *to,int tolen)int sockfd,const void * msg, //指向要发送数据的指针int len, //以字节为单位的数据的长度unsigned int flags, //flags一般情况下置为0const struct sockaddr * to, //存放目的机套接字地址int tolen // sizeof(sockaddr)返回值:实际发送的数据长度,可能少于len(9)recvfrom():UDP—接收数据int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen)int sockfd,void * buf, //存放接收数据的缓冲区指针int len, //缓冲区的长度unsigned int flags //flags一般情况下置为0struct sockaddr *from, //存保发送来数据的源机的套接字地址int *fromlen //sizeof(formlen)返回值:收到的数据长度,如果=-1 出错(10)关闭套接字int close(int sockfd); //关闭指定的socket。

用MFC WinSock类进行网络通信设计

用MFC WinSock类进行网络通信设计

VC++程序设计基础
1.4 读和写数据
Receive()函数从远端终点读取数据,Send()函数 发送数据到远端终点。
例10.1 Receive()函数的应用。
例10.2 Send()函数的应用。
ቤተ መጻሕፍቲ ባይዱ
Receive()函数的第三个可选参数指明调用建立的方式。它的值可以是 下表中的标志的并集。
Send()函数的第三个可选参数指明调用建立的方式。它的值可 以是下表中的标志的并集。
VC++程序设计基础
用MFC WinSock类进行网络通信设计
套接字(Socket)是互连网的终点。 。底层的套接字函数是 WinInet API的一部分,CSocket的基类如下图所示。
CSocket类的常用的函数如下表所示。
1.1 创建套接字
用两步来创建一个套接字。首先,必须创建一个CSocket 对象。然后,利用Create()函数创建一个基本的套接字 句柄。下面是创建连接到端口4500的套接字的例子:
使用Create()函数之后,需要调用Listen()函数监听在端口上新来 的连接,只有当Listen()函数响应了一个调用或有一个套接字错误发 生时才会有返回。下面的代码就是监听一个连接:
可以用Accept()函数创建第二个套接字。它将CSocket对象的第一个 参数作为建立连接的必选项,第二、第三个参数是可选的。下面的代码 表示接收一个连接:
在呼叫另一个套接字之前还有最后一个步骤。很多时候是知道一 个主机的名称,但不知道确切的IP地址。为了得到确定的IP,必须 使 用 WinSock 的 gethostbypass() 和 inet_ntoa() 函 数 。 下 面 的 代 码将找出的IP地址:

基于MFC的TCP局域网聊天程序设计

基于MFC的TCP局域网聊天程序设计

第一章系统分析1.1 系统设计要求:1.2.3.1.2 系统原理框图本次课程设计的原理框图如图1.1所示:图1.1系统原理框图1.3 系统设计原理局域网聊天程序的实现主要为局域网内的计算机提供交流的平台。

完成一个基于服务器和客户端的局域网通讯软件,类似于聊天室,可进行注册、登录、系统信息记录、聊天等功能。

用户容易使用,便于管理。

第二章系统设计理论基础2.1 TCP/IP协议TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。

因此用户一般不涉及。

TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP 是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。

编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。

前者为核内设计,后者为核外设计。

用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。

2.2 客户机/服务器模式C/S结构(Client/Server结构)是大家熟知的客户机和服务器结构。

它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。

这也就是目前应用系统的发展方向。

首先服务器方要启动,并根据请求提供相应服务:(1)打开一通信通道并告知本地主机,它在某一公认地址端口上(如http为80)接受客户请求。

用MFC类编写TCP/IP网络通信程序

用MFC类编写TCP/IP网络通信程序

用MFC类编写TCP/IP网络通信程序
徐凡;汤怀礼
【期刊名称】《今日电子》
【年(卷),期】1998(000)001
【摘要】TCP/IP是广为应用的互连网络协议。

现在的网络几乎全部支持TCP/IP 协议,因而无论从可移植性、可使用性还是发展前景来看,采用TCP/IP协议开发网络通信软件都是一个最佳选择。

目前,套接口(Socket API)已逐渐成为网络通信软件开发的标准和规范,使用套接口能在网络上方便地开发通信软件。

MFC(微软基础类库)4.0是一个稳健的C++应用程序框架,用于用C++编写Microsoft Windows 操作系统的应用程序。

MFC 4.0为TCP/IP网络编程提供了新的WinSock类,本文将介绍如何用MFC的新类编写TCP/IP网络通信程序。

【总页数】4页(P40-43)
【作者】徐凡;汤怀礼
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP393
【相关文献】
1.用VB5编写TCP/IP通信程序 [J], 韩玉国
2.TCP/IP网络面向对象通信程序设计及应用 [J], 党德鹏
3.TCP/IP网络技术与金融网全国互联讲座(五) 采用TCP/IP网络技术实现金融网
全国互联 [J], 胡好良
4.TCP/IP网络技术和金融网全国互联讲座(一) TCP/IP网络核心技术简介 [J], 胡好良
5.TCP/IP网络面向对象通信程序设计及应用 [J], 党德鹏
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1、得到本机IP和主机名 (2)<1>得到本地主机名 (2)<2>主机名和IP地址 (3)2、设置某个按钮不可用: (4)3、控制台下socket通信 (4)<1>、服务器端 (4)<2>、客户端端 (6)4、MFC下TCP编程(只能服务器发,客户端收) (7)<1>、服务器端 (8)<2>、客户端 (10)5、MFC下TCP编程(可以互发) (11)<1>服务器端 (12)1、在*Dlg*.h中添加: (12)2、在protected:下添加 (12)3、在Dlg.cpp中添加内容 (12)4、添加自定义消息响应函数 (13)5、添加变量 (14)6、启动服务器按钮对应的响应函数内容为: (14)7、关闭服务器按钮对应的消息响应函数内容为: (15)8、发送按钮对应的消息响应函数内容为: (16)<2>、客户端 (17)1、在*Dlg*.h中添加: (17)2、在protected:下添加 (18)3、在Dlg.cpp中添加内容 (18)4、添加自定义消息响应函数 (18)文档:wln Email--- jlu.wln@very glad you read my document,hope it can help you ,my friend!1、得到本机IP和主机名首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h>程序:UpdateData(true);char hostname[128] = "";WSADATA wsaData;CString ip;WSAStartup(MAKEWORD(2, 2), &wsaData);gethostname(hostname, sizeof(hostname));//printf("%s", hostname);SetDlgItemText(IDC_STATIC1,hostname);//name里是本机名hostent* host = gethostbyname(hostname);sockaddr_in addre;for (int i = 0;host->h_addr_list[i];i++){CString ip;memcpy(&addre.sin_addr.s_addr,host->h_addr_list[0],host->h_length);ip = inet_ntoa(addre.sin_addr);SetDlgItemText(IDC_STATIC2,ip);}WSACleanup();UpdateData(false);<1>得到本地主机名#include<stdio.h>#include<Winsock2.h>#pragma comment(lib, "Ws2_32.lib")int main(){char hostname [128] = "";WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);gethostname(hostname, sizeof(hostname));printf("%s", hostname);WSACleanup();return 0;}<2>主机名和IP地址//连接ws2_32.libWORD wVersionRequested;WSADATA wsaData;char name[255];CString ip;int err;PHOSTENT hostinfo;wVersionRequested = MAKEWORD( 2, 2 );//版本号2.2//1.加载套接字库err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return;}//判断是否我们请求的winsocket版本,如果不是//则调用WSACleanup终止winsocket的使用并返回if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ){WSACleanup( );return;}///...ifif ( err == 0 ){if( gethostname ( name, sizeof(name)) == 0){if((hostinfo = gethostbyname(name)) != NULL){ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);}}}WSACleanup( );SetDlgItemText(IDC_STATIC1,name);//name里是本机名SetDlgItemText(IDC_STATIC2,ip); //ip中是本机IPUpdateData(false);2、设置某个按钮不可用:m_StartBtn.EnableWindow(TRUE); //可用m_StopBtn.EnableWindow(FALSE); //不可用3、控制台下socket通信首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h><1>、服务器端// TCPConsolSer2.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h>#include <winsock2.h>int main(int argc, char* argv[]){WORD wVersionRequested;//版本号wVersionRequested = MAKEWORD(1, 1);//1.1版本的套接字SOCKET sersock,clisock;struct sockaddr_in seraddr,cliaddr;int serport=5556;char buf[256];WSADATA wsaData;int len,err;//初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0){printf("加载套接字库失败!\n");return -1;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){return -1;}//判断高低字节是不是1,如果不是1.1的版本则退出//创建套接字printf("创建套接字.\n");sersock = socket(AF_INET, SOCK_STREAM, 0);//Socket地址结构体的创建memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family=AF_INET;seraddr.sin_port=htons(serport);//seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //等价于seraddr.S_un.sin_addr=inet_addr("127.0.0.1");seraddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//绑定套接字到服务器地址结构printf("Binding...\n");err=bind(sersock, (SOCKADDR*)&seraddr, sizeof(SOCKADDR));if(err!=0){printf("listen failed:%d\n",WSAGetLastError());exit(-3);}//监听套接字printf("listening...\n");err=listen(sersock,5);if(err!=0){printf("listen failed:%d\n",WSAGetLastError());exit(-2);}//等待连接请求printf("waitting request....\n");len = sizeof(cliaddr);//初始化参数,这个参数必须进行初始化clisock=accept(sersock,(SOCKADDR*)&cliaddr, &len);printf("Accept client: %s: port: %d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));sprintf(buf,"welcome %s",inet_ntoa(cliaddr.sin_addr));send(clisock,buf,strlen(buf),0);//关闭连接closesocket(clisock);closesocket(sersock);WSACleanup();return 0;}<2>、客户端端// TCPConsoleClient2.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <stdio.h>#include <winsock2.h>int main(int argc, char* argv[]){WORD wVersionRequested;//版本号wVersionRequested = MAKEWORD(1, 1);//1.1版本的套接字SOCKET sock;struct sockaddr_in sockaddr;int serport=5556 ;char buf[256];WSADATA wsaData;int len,err;//初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0){printf("加载套接字库失败!\n");return -1;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){return -1;}//判断高低字节是不是1,如果不是1.1的版本则退出//创建套接字printf("创建套接字.\n");sock = socket(AF_INET, SOCK_STREAM, 0);//Socket地址结构体的创建memset(&sockaddr,0,sizeof(sockaddr));sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(serport);//seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //等价于seraddr.S_un.sin_addr=inet_addr("127.0.0.1");sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//连接服务器err=connect(sock,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//接收欢迎词memset(buf,0,sizeof(buf));len=recv(sock,buf,sizeof(buf),0);printf("%s\n",buf);//关闭连接closesocket(sock);WSACleanup();return 0;}4、MFC下TCP编程(只能服务器发,客户端收) 首先添加ws2_32.lib库文件;再添加头文件#include<winsock2.h>点击服务器“发送”按钮,将数据发送过去;点击客户端”接收”按钮,接收服务器发送来的数据,并显示。

相关文档
最新文档