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

时间: 2024-10-22 15:24:42

VC++6.0网络编程Socket编程(转)的相关文章

Linux网络之socket编程 (1)

在谈到socket编程之前,首先我们要知道一点预备知识. 预备知识: 1.网路字节序全部采用大端字节序. 关于字节序的详解,戳链接 查看,这里不做解释. 2.在编程之前,我们有必要了解,什么是socket? socket,又叫做套接字.我们都应该知道,在网络中,IP地址+ 端口号,可以唯一表示互联网中的一个进程,因此,我们将  IP地址+端口号 称为socket. socket API是一套抽象的网络编程接口,适用于各种底层网络协议,包括IPv4,IPv6以及UNIX Domain Socket

网络编程——socket编程

一.客户端/服务端架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网企业处处是C/S架构 C/S架构与socket的关系:学习socket就是为了完成C/S架构的开发 二.OSI七层 一个完整的计算系统是由硬件.操作系统.应用软件三者组成.(这样就可以自己和自己玩了) 若想和别人一起玩,那就需要联网了. 互联网的核心就是一堆协议组成,协议就是标准.例如:全世界官网通信的标准是英语. 一.人们按照分工不同将互联网协议从逻辑上划分了层次 详见网络通信原理:http://www.cnblo

Python的网络编程 Socket编程

Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯一标识该进程,在TCP/IP网络协议中,就是通过(IP地址,协议,端口号)三元组来标识进程的,解决了进程标识问题,就有了通信的基础了 TCP是一种面向连接的传输层协议,TCP Socket是基于一种Client-Server的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据,那么

网络编程----------SOCKET编程实现简单的TCP协议

首先我们需要大致了解TCP的几点知识: 1.TCP的特点:面向连接的可靠性传输 2.TCP的三次握手建立连接和四次挥手释放连接,但为什么TCP要三次握手建立连接呢? 答:因为两次握手无法保证可靠性,若最后一次失败,则客户端又会重新发起建立连接的请求,那么必然会消耗资源,而三次握手明显能够达到这个目的. 3.TCP为何是面向连接的? 答:因为TCP是传输层的协议,传输层的下层是网络层,IP协议就是网络层的协议,但是IP只提供尽力而为的的传输机制:而传输层的上层为应用层,它负责将下层的数据拿出来,所

iOS开发网络篇—Socket编程

转自http://www.mamicode.com/info-detail-877996.html 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议对应于应用层 tcp协议对应于传输层 ip协议对应于网络层 三者本质上没有可比性.  何况HTT

Python之网络编程 Socket编程

本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电

java 网络编程Socket编程

Server.java import java.io.*; import java.net.*; public class Server { public static void main(String args[]) { String [] answer ={"南非","进入世界杯了","哈哈...问题真逗!"}; ServerSocket serverForClient=null; Socket socketOnServer=null; Da

七.Python网络编程 Socket编程

python 编写server的步骤: 1第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket(family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信. type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字). 2.第二步是将socket绑定到指定地址.这是通过s

python网络编程-socket编程

socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行"三次握手",即交换三个分组. 流程如下: 客户端向服务器发送一个SYN J 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1 客户端再想服务器发一个确认ACK K+1 只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图: 图1.socket中发送的TCP三次握手 从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时con