《计算机网络》
课程实验指导书
廖志芳 编写
课程编号 320143X1 总 学 时 48 实验学时 6 课外学时 15
中南大学软件学院 2012年11月
实验1《Windows Socket编程》
实验学时: 2 每组人数: 1
实验类型: 2 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 2 (1:必修 2:选修 3:其它)
实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它)
一、实验目的
通过实验,使学生熟悉并掌握计算机Windows 编程的基本知识,进一步加深学生对课堂所学基本内容的理解,掌握基本的Windows编程技巧,通过实验使得学生能够进行一些简单的网络程序设计。
二、实验内容
1.介绍基本的Windows Socket编程技巧;
2.基于Windows Socket编程,设计并实现一个简单的聊天系统,包括客户端及服务器端。
三、实验要求:
1.按照实验内容和步骤完成各个实验; 2.在实验报告中要有详细地实验步骤以及结果; 3. 按时上交实验报告。
四、实验步骤
1.工程创建
在VC6中新建一个新工程,选择:Win32 Console Application,输入工程名。具体方法:启动VC6.0,单击【File】->【New】,如图1所示;
1
图1
(1)服务器端创建:然后在【新建工程】的对话框中的【Projects】选项卡中选择:Win32 Console Application,输入一个工程名及保存路径,点击【确定】,如图2所示;
图2
(2)客户端创建:在【新建工程】的对话框中的【Projects】选项卡中选择:MFC AppWizard[exe],输入一个工程名及保存路径,点击【确定】,选择“单文档模式”,完后确定完成,如图3所示,完成后新建一个主界面窗体,如图4所示。
图3
2
图4
2.Winsock初始化
在Windows环境下进行网络程序设计时,所有的Winsock函数都是从ws2_32.dll导出的,我们可以通过#pragma comment(lib, \语句链接到该库文件。但在使用Winsock函数之前还必须调用WSAStartup函数对库资源进行初始化工作,使用完毕后,在退出程序之前,我们还必须调用WSACleanup函数来释放库资源。为了便于程序的设计,我们先设计一个CInitSock类来管理WinSock库。在工程中添加新类的过程步骤如下:
1)在VC6.0环境中点击【insert】->【new a class】菜单;
2)在弹出的对话框中,选定class type为Generic Class,在Name输入框中输入类的名称CInitSock,然后点击确定即可。
在InitSock.h和InitSock.cpp添加代码,详细代码如下所示。 ////////////////////////////////////////////////////////////////////////////
// initSock.h // ////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_) #define AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_
#if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000
#pragma comment(lib, \#include \
class CInitSock {
public: CInitSock();
3
virtual ~CInitSock(); }; #endif
// !defined(AFX_INITSOCK_H__70EFFE09_9598_4C98_A067_29100702ACE8__INCLUDED_)
//////////////////////////////////////////////////////////////////////
// InitSock.cpp: implementation of the CInitSock class. // //////////////////////////////////////////////////////////////////////
#include \
////////////////////////////////////////////////////////////////////// // Construction/Destruction
//////////////////////////////////////////////////////////////////////
CInitSock::CInitSock() { WSADATA wsaData; WORD sockVersion = MAKEWORD(2, 2); if(::WSAStartup(sockVersion, &wsaData) != 0) exit(0); }
CInitSock::~CInitSock() { ::WSACleanup(); }
然后在工程中新建一个.cpp的源文件,在这个源文件中填写主函数代码,并且在这个.cpp源文件的开始部分包含如下头文件:”initSock.h”和”stdio.h”,还申明一个CInitSock类对象,具体代码可如下所示: #include \#include \CInitSock initSock;
// 初始化Winsock库,对库资源进行初始化工作,释放资源
3.编程模式
(1)服务器端:
函数具体说明请参考MSDN或者讲义或者教材。 1)创建socket
Socket函数的原型为:
SOCKET socket(int family, int type, int protocol); 创建一个流式套接字可以如下所示:
SOCKET _socket=socket(AF_INET,SOCK_STREAM,0);
4