zoukankan      html  css  js  c++  java
  • VC++6.0网络编程Socket编程(转)

    从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]='';
        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++网络编程》----主编  正阿奇;

    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    PAT 甲级 1115 Counting Nodes in a BST (30 分)
    PAT 甲级 1114 Family Property (25 分)
    PAT 甲级 1114 Family Property (25 分)
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
  • 原文地址:https://www.cnblogs.com/rechen/p/5132102.html
Copyright © 2011-2022 走看看