分享
 
 
 

TCP/IP网络通信程序设计

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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();}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有