正文

TCP/IP网络通信程序设计2007-08-20 17:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/28713.html

分享到:

http://www.moon-soft.com/doc/1821.htm

 

TCP/IP网络通信程序设计
    湖北大学数学与计算机科学学院(430062) 党德鹏
    本文介绍了TCP/IP网络应用程序的面向对象设计方法,并给出了
用Visual C++4.2中MFC在Windows 95环境下开发的程序实例。
    1 Sockets与Winsock 95
    Winsock 95是在Unix Sockets及Windows Sockets基础上发展起
来的。Sockets原是BSD为了Unix支持互联网通信而设计的4.3BSD Uni
x版本中的API,它采用客户-服务器模式的通信机制,使网络客户方和
服务器方通过Sockets实现网络之间的联接和数据交换;Win dows Soc
kets描述定义了一个Microsoft Windows的网络编程界面,它为Window
s TCP/IP 提供了一个BSD型套接字,除与4.3BSD Unix Sockets完全兼
容外,还包括一个扩充文件,通过一组附加的API实现Windows式(即事
件驱动)的编程风格;而Winsock 95则是在Microso ft Windows 95中
进行网络应用程序设计的接口。Windows 95在Internet支配域中的TC
P /IP协议定义了Winsock 95网络编程规范,溶入了许多新特点。MFC
中提供了相应的CSock et类来实现网络通信。
    2 Sockets编程原理
    Sockets同时支持数据流Sockets和数据报Sockets。
    下面是利用Socket进行通信连接的过程框图。其中图1是面向连
接的时序图,图2是无连接的时序图。
图1
图2
    由图可以看出,客户与服务器的关系是不对称的。对于TCP C/S,
服务器首先启动,然后在某一时刻启动客户与服务器建立连接。服务
器与客户开始都必须调用socket()建立一个套接字socket,然后服务
器调用bind()将套接字与一个本地网络地址捆扎在一起,再调用liste
n()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长
度,之后服务器就可以调用accept()来接收客户连接。客户打开套接
字之后,便可通过调用conne ct()和服务器建立连接。连接建立之后,
客户和服务器之间就可以通过连接发送和接收数据。最后,待数据传
送结束,双方调用closesocket()关闭套接字。对于UDP C/S,客户并不
与服务器建立一个连接,而仅仅给服务器发送一张包含服务器地址的
数据报。相似地,服务器也不从客户端接收一个连接,只是调用函数re
cvfrom,等待从客户端来的数据。依照recvfrom返回的协议地址以及
数据报,服务器就可以给客户送一个应答。
    3 Winsock 95编程方法
    用Visual C++4.2以MFC在Windows 95中实现网络编程,主要就是
利用CSocket类及其如下相关成员函数:
    (1)BOOL Create (UINT nSocketPort=0,int nSocketType=SOCK_
STREAM,long lEve nt=FD_READ|FD_WRITE|FD_OOD|FD_ACCEPT|FD_CON
NECT|FD_CLOSE|,LPCTSTR|lpszSocket Address=NULL
    该函数用来建立Socket。
    (2)BOOL Bind(UINT nSocketPort,LPCTSTR lpszSocketAddess=N
ULL)
    该函数的作用是将Socket端口与网络地址连接起来。
    (3)BOOL Listen(int nConnectionBacklog=5)
    该函数的作用是等待Socket请求。
    (4)Virtual BOOL Accept(CAsyncSocket & rConnected Socket,
Socket,SOCKADDR*  lpSock Addr=NULL,int * lpSock AddrLen=NULL
)
    该函数的作用是取得队列上第一个连接请求并建立一个具有与So
cket相同特性的套接字。
    (5)BOOL Connect (LPCTSTR lpszHostAddress,UINT nHostPort)
    该函数的作用是提出请求。其中,lpszHostAddress和nHostPort
为接受请求进程的网络地址和Socket端口号。
    (6)virtual void Close()该函数的作用是关闭Socket。
    使用以上类及成员函数,按照以下步骤,就可以设计出合适的通信
程序:
    Server:Construct→Creat→Bind→Listen→Accept→Send→Clo
se;
    Client:Constuct→Creat→Connect→Receive→Close。
    4 程序实例
    我们用Visual C++4.2中MFC在Windows 95环境下设计了一个dayt
ime cliont程序,清单如下:
    头文件HEAD.H内容:
    #define IDM_STRAT 200
    #define IDM_EDIT 200
    class Mainwnd:public CFrame Wnd
    {public:Mainwnd();
    afx_msg int OnCreat(LPCREATESTRUCT);
    afx_msg void OnStart(void);
    DECLARE_MESSAGE_MAP();
    private:Cstatic CSStatic;
    CEdit LineEdit;
    CButten StartButton;};
    class PengApp:public CWinApp
    {public:BOOL InitInstance();}
    源程序Client.CPP清单:
    #include<afxwin.h>
    #include<winsock.h>
    #include "head.h"
    const int nPort=13;
    PengApp theApp;
    Main Wnd:Main Wnd()
    {if(!Create (NULL,"Communication Program",WS_OVERLAPPEDW
INDOW,rectDefaul t)) AfxAbort();}
    int Mainwnd:OnCreate(LPCREATESTRUCT)
    {Rect rect;SetRect(& rect,80,50,160,70);
    Create("Host Name:",WS_CHILD|WS_VISIBLE|SS_LEFT,rect,thi
s);
    SetRect(& rect,60,80,180,100);
    LineEdit.Create(WS_CHILD|WS_VISIBLE|WS_DLGFRAME|ES_LEFT,
rect,this,IDM_ED IT);
    SetRect(&rect,100,120,140,140);
    StartButton,Create("start",WS_CHILD|VS_VISIBLE|BS_PUSHBU
TTON,rect,this,I DM_START);
    return 0;}
    BEGIN_MESSAGE_MAP(Main Wnd,CFrameWnd)
    ON_WM_CREATE()
    ON_BN_CLICKED(IDM_START,OnStart)
    END_MESSAGE_MAP()
    BOOL ControlApp:InitInstance()
    {m_pMainWnd=new Main Wnd();
    m_pMainWnd→ShowWindow (m_nCmdShow);
    m_pMainWnd→UpdateWindow();
    return;}
    Void Main Wnd:Onstart(void)
    {CSocket TimeClient;
    if(! AfxSocketInit()) MessageBox("WindowsSocket initial 
failed!","Receiv e",MB_ICONSTOP);
    if(! TimeClient.Create()) MessageBox("ReceiveSocket crea
te failed","Rece ive",MB_I(ON)STOP);
    else TimeClient.connect(strAddr,nPort);
    TimeClient.ReceiveFrom(csReceiveText,csCounts,LineEdit.G
etWinText,nPort)
    MessageBox(TimeClient.csReceiveText);
    TimeClient.Close();}
  

阅读(2540) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册