博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++6.0网络编程Socket编程(转)
阅读量:6910 次
发布时间:2019-06-27

本文共 4679 字,大约阅读时间需要 15 分钟。

从csdn上下载的该软件的教程:

作为一个初学者,深感Socket编程入门的困难,但当把一些问题弄懂之后,回过头来看以前遇到的一些问题,才发现 Socket编程其实并没有那么复杂。接下来我就把我遇到的一些困难讲述下,并补上解决的办法。

首先我们要想实现一个简单的点对点网络通信,就应该有一个客户和一个服务器

我们先来做客户端。先按照如下图所示建立好客户对话框模块:

首先创建一个基于MFC AppWizard[EXE] 工程,工程名为Socket__002 (这里是以我的工程名为准,你们也可以自己命名工程。)点击确定只收选择基本对话框,如图:

 

点击下一步,在Windows Sockets[W]处钩上之后就点击【完成】。

 

建立如图所示的客户端对话框:

控件属性:

说明:IDC_EDIT1 端口号编辑框,IDC_EDIT3 发送文本框,  IDC_IPADDRESS1   IPd地址框,IDC_LIST1  列表框。

 

现在模块已经建好了,接下来就是写代码了,不过写代码之前我们要先理清思路。

客户端与服务器是怎样来实现通信的呢,其实就是由数据的发送者客户端将要发送的信息写入一个套接字,在通过中间环节传输到接收端服务器的套接字中,就可以由接收端的应用程序将套接字从中取出。因此,两个应用程序间的数据传输要通过套接字来完成,至于两个套接字间是怎么传输的我们就不要管了,我们只要把信息装入套接字中就可以了。

作为一个客户端,应该具备以下功能:

 

1,、向指定地址的服务器发送连接请求;

2、向已经连接成功的服务器发送信息;

3、主动断开与服务器的连接;

当我们已经知道客户端的功能时就应该想到,我们该怎样用代码实现这些功能呢;当然对于初学者来说编写这些代码还有点困难,我们可以先参考网络上的资料把原理弄懂,这才是我写这篇文章的本意。

 

VC6.0界面中的工作区点击ClassView 选项卡,右击【Socket_002 classes】-----【NewClass】添加新类 “Client_Socket” 基类为  generic CWnd。

右击 CSocket_002Dlg 为CSocket_002Dlg 类添加共有成员变量 m_StartC;

为了使新建的类与对话框类有关联需要在Socket_002Dlg.h头文件中加入

#include”ClientSocket.h”记住一定要放在第一行。在类定义的public中加入 CClientSocket m_CClientSocket;  同样的道理,在”ClientSocket.h”头文件里加入#include” Socket_002Dlg.h”

为新添加的类Client_Socket 添加成员函数OnConnect(),函数原型void OnConnect(int nErrorCode)。在OnConnect()函数中添加如下代码:

void CClientSocket::OnConnect(int nErrorCode)//CAsyncSocket::OnConnect{    if(nErrorCode)    {        AfxMessageBox("连接失败,请你重试!");        return ;    }    ((CSocket_002Dlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("连接服务器成功!");    ((CSocket_002Dlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(    ((CSocket_002Dlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1);}

接下来就是对对话框连接按钮创建单击函数,函数内容如下:

void CChat_ClientDlg::OnButton1() {    // TODO: Add your control notification handler code here    if(!m_StartC)    {        BYTE nFild[4];        CString sIP;        UpdateData();        m_ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);        sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);        m_CClientSocket.Create();//创建socket        m_CClientSocket.Connect(sIP,m_sPort);//连接        m_StartC=~FALSE;//开始连接    }}断开按钮程序:void CSocket_002Dlg::OnButton2() {    // TODO: Add your control notification handler code here    m_CClientSocket.Close();//关闭soket连接    m_ListWords.AddString("从服务器断开");    m_StartC=FALSE;//断开连接} 发送按钮程序:void CSocket_002Dlg::OnButton3() {    // TODO: Add your control notification handler code here    UpdateData();    m_CClientSocket.Send(m_sWords,m_sWords.GetLength());//发送字符串    m_ListWords.AddString("发送:"+m_sWords);    m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);//滚动条}同时在CSocket_002Dlg::OnInitDialog()中加入如下所示代码BOOL CSocket_002Dlg::OnInitDialog(){    ……    m_StartC=FALSE;//初始化窗体时,还没有建立连接……}

服务器对话框Char_Server模块

同客户端模块一样创建一个Char_Server的工程,

服务器的功能:

1、  监听;

2、  接受客户端请求;

3、  停止监听;

4、  接收信息;

原理同客户端设置基本类似创建两个类 一个用来监听的类CListenSocket,一个用来接收信息的类CServerSocket,同样是以generic CWnd类为基类。在”Chat_ServerDlg.h”中添加

#include"ServerSocket.h"

#include"ListenSocket.h"

再添加两个public成员变量

CServerSocket m_ServerSocket;

CListenSocket m_ListenSocket;

接着分别在"ServerSocket.h","ListenSocket.h"头文件中加入include”Chat_ServerDlg.h”,注意include”Chat_ServerDlg.h”放置的位置,放在预编译之前,以防出错。

 

服务器对话框

接下来就开始在创建好的CListenSocket类中添加成员函数void OnAccept(int nErrorCode)  具体怎么添加我就不做详细说了。成员函数代码如下:

void CListenSocket::OnAccept(int nErrorCode){Accept(((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ServerSocket);((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ServerSocket.AsyncSelect(FD_READ|FD_CLOSE);((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("接受了一个客户端的连接请求");//接受连接请求((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-    }紧接着在CServerSocket类中添加两个成员函数:void OnReceive(int nErrorCode),void OnClose(int nErrorCode),代码如下:void CServerSocket::OnReceive(int nErrorCode){    char SzTemp[200];//字符数组    int n=Receive(SzTemp,200);//接收到的字符串保存到SzTemp[]中。    SzTemp[n]='\0';    CString sTemp;    sTemp.Format("收到:%s",SzTemp);//接收到的字符数组内容,格式化为字符串    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString(sTemp);//将接收到的内容显示到主对话框上    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1);}void CServerSocket::OnClose(int nErrorCode){    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("客户端断开");    ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex(        ((CCSock_ChatServerDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1);    Close();//断开连接}

接下来就可以运行了,运行结果如下:

 

 

任务完成,若是有不明白的地方可以参考《Visual C++网络编程》----主编  正阿奇;

 

转载于:https://www.cnblogs.com/rechen/p/5132102.html

你可能感兴趣的文章
Linux查看文件总的数据行数,并按行拆分
查看>>
ReactNative WebView组件详解
查看>>
武汉大学数学专业考研试题参考解答
查看>>
【jquery的setTimeOut定时器使用】
查看>>
HTML5 Video P2P技术研究(转)
查看>>
CAS 单点登录【2】自定义用户验证
查看>>
SQL Server 大数据搬迁之文件组备份还原实战
查看>>
区块链核心技术:拜占庭共识算法之PBFT
查看>>
数据挖掘中的 10 大算法
查看>>
iOS开发系列- 视频MPMoviePlayerController
查看>>
iOS -- 拨打电话
查看>>
模仿CyclicBarrier,自定义自己屏障类
查看>>
Vue+Vue-router微信分享功能
查看>>
1.数码相框-相框框架分析(1)
查看>>
Javascript中的原型继承具体解释
查看>>
Python基础之(三)----PyGame安装步骤
查看>>
MYSQL SHOW VARIABLES简介
查看>>
Win8Metro(C#)数字图像处理--2.8图像线性变换
查看>>
解决eclipse不识别Android手机的问题
查看>>
axel命令 文件下载
查看>>