Windows下C语言网络编程快速入门
C语言的学习,一般的方式是,先学C,然后是C++,最好还要有汇编语言和微机原理基础,然后才是Visual C++。这样的方式,对学习者来说,要花费很多时间和耐力。而在学校教学中,也没有时间深入学习Windows编程的实用技术了。 其实,具有了C语言基础后,再有一些基本的C++类的概念,就可以直接学习Windows C编程了。 一、走近Windows C语言 很多语言都把显示一个“Hello,World!”做为第一个入门程序, C语言的第一个程序是这样的:
如果把main函数写成带参数的main函数,应该是:
Windows C的第一个程序和这个程序在形式和原理上都是一致的,只是有两点不同: 1. 主函数接收的形参不只是命令行中的字符串的个数和字符串的首地址。 2. C语言的很多函数在Windows C中都可以继续使用,但象printf()屏幕显示等函数就不能继续使用了。因为Windows是多任务操作系统,屏幕已不再为某一个应用程序所独有,Windows C应用程序要显示字符串,需要使用Windows提供的API函数,开自己的窗口 下面是一个最简单的,显示“Hello,World!”的Windows C程序:
主函数的形参有四个: 1) Hinstance:接收程序运行时当前实例的句柄; 2) HprivInstance:前一个实例的句柄; 3) LpCmdLine:程序命令行指针; 4) NcmdShow:一个用来指定窗口显示方式的整数。 这几个参数的使用我们会在深入的学习中介绍的。 显示Hello,Word!字符串,我们使用了一个MessageBox函数,这个函数会在屏幕上显示一个对话框,它的原型是:
四个参数分别是: 1) HWnd:父窗口的句柄; 2) LpText:要显示字符串的指针; 3) LpCaption:对话框标题字符串的指针; 4) UType:显示在对话框上的小图标的类型。 使用这个函数要包含windows.h头文件。 调试一下,怎么样?窗口上弹出了一个“第一个Windows C程序”对话框,上面有一行字:“Hello,World!”。 世界真的很美好啊!! 深入编程: 在C语言中,函数的声明,如果没有指明返回值类型,缺省值为void,这个程序的主函数就没有返回值。不过,在Windows编程时,我们最好养成个好习惯,指明函数的返回值类型,因为在C++中,函数返回值类型是不可以缺省的。而我们在Windows C编程时,还是会用到C++的一些概念,这样做,有利于以后深入地学习。 规范一点的程序应该是这样的:
二、 获取本地计算机的主机名和IP地址
【使用说明】 每一个使用winsock的应用程序,都必须进行WSAStart函数调用,并且只有在调用成功之后才能使用其它的winsock网络操作函数。 WVersionRequired:<输入>表示欲使用的Winsock版本,这是一个WORD类型的整数,它的高位字节定义的是次版本号,低位字节定义的是主版本号。 LpWSAData:<输出>是一个指向WSADATA资料的指针。这个资料我们一般不使用。 返回值:调用成功返回0;否则,返回出错信息。 2. WSAClenaup(): 【函数原型】
【使用说明】 winsock使用后,要调用WSACleanup函数关闭网络设备,以便释放其占用的资源。 3.gethostname() 【函数原型】
【使用说明】 该函数可以获取本地主机的主机名,其中: name:<输出>用于指向所获取的主机名的缓冲区的指针。 Namelen:<输入>缓冲区的大小,以字节为单位。 返回值:若无错误,返回0;否则,返回错误代吗。 4.gethostbyname() 【函数原型】
【使用说明】 该函数可以从主机名数据库中得到对应的“主机”。 该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。若无错误,刚返回一个指向hostent结构的批针,它可以标识一个“主机”列表。 Hostent结构定义如下:
其中: h_name:<输入>主机名地址(PC)。 h_aliases:一个由主机备用名组成的空中止数组。 H_addrtype:返回地址的类型,对于Winsock,这个域总是PF_INET。 H_lenth:每个地址的长度(字节数),对应于PF_INET域应该为4。 H_addr_list:应该以空指针结尾的主机地址的列表,返回的地址是以网络顺序排列的。 其中,h_addr_list[0]存放的就是本地主机的4个字节的IP地址,即: h_addr_list[0][0].h_addr_list[0][1].h_addr_list[0][2].h_addr_list[0][3] 一个简单的用消息框显示主机名和IP地址的源程序如下:
深入编程: 前面显示IP地址的时候,我们使用的是消息框,规范一点的编程应该使用对话框,如何编辑一个对话框,很多书中都有介绍,编辑的对话框可参考图5的运行界面。 头文件Get_IP.h如下:
这个程序只使用了一个对话框过程,一般把这个过程的声明放在头文件中。 源程序Get_IP.c:
三、利用VisualC++6.0编译Windows C程序 2.在【新建】对话框中,系统打开的是默认的【工程】选项卡,【工程】选项卡左侧的列表框中有多种建立工程的方式,我们选中“Win32 Application”选项。 3. 在【位置】文本框中输入新建工程的路径(例如:F:/),在【工程】文本框中输入工程名称(例如:Get_IP)。 4. 选中【平台】列表框中的Win32复选框,然后单击【确定】按钮。 5. 在随后的对话框中,都选择默认设置,完成后,进入图2示界面: (二) 添加代码 在VisualC++6.0中,源代码一般存放在源代码文件和头文件中,往项目中添加源代码是非常方便的,为项目新建一个源代码文件一般要按下述方法操作: 1. 选择【工程】|【添加工程】|【新建】选项,弹出图3所示【新建】对话框: 2. 在对话框的【文件】选项卡中,左侧的列表框选中“C++ Source File”选项,右侧选中【添加工程】复选框,并在【文件】文本框中输入源文件名(例如:Get_IP.c)。 3. 单击【确定】按钮,【新建】对话框将被闭,用户就可以在新建的Get_IP.c中输入程序的源代码了。 4. 添加头文件Get_IP.h的方法和上面所述过程一样,只是在【文件】选项卡中,左侧的列表框要先中“C/C++ Header File”选项。在【文件】文本框中输入头文件名(例如:Get_IP.h)。 (三) 添加资源 在添加资源前,必须在项目中先添加一个资源文件,然后可利用Visual C++6.0提供的资源编辑器为项目新建一个资源,具体步骤如下: 1. 选择【工程】|【添加工程】|【新建】选项,弹出图3所示【新建】对话框。 2. 在对话框的【文件】选项卡中,左侧的列表框选中“Rsource Script”选项,右侧选中【添加工程】复选框,并在【文件】文本框中输入资源文件名(例如:Get_IP.rc)。 3. 单击确定,回到主窗口后,选择【插入】|【资源】选项,打开【插入资源】对话框,如图4所示, 在【资源类型】列表框中选中“Dialog”选项,单击【新建】按钮,返回主窗口后,即可利用对话框编辑器进行编辑了。编辑后的对话框如图 (四) 编译链接 在添加了源代码与资源文件后,就可以对程序编译连接了,可按Ctrl+F7键编译,按F7键连接,按Ctrl+F5键运行程序。在连接前是要注意,资源文件Get_IP.rc也要进行编译。 由于这个程序引用了Winsock API函数,在编译连接前,还要添加wsock32.dll,具体方法前面已经介绍过,这里就不再赘述了。 一点看法: 利用C语言编写Windows应用程序有两种方式:一种是Windows C编程方式,另一种是Visual C++编程方式。在一般情况下,Visual C++编程方式编写的程序源代码量小、开发时的工作量小、工作难度也较小,但编译后的代码量较大,运行速度略低;而Windows C编程方式编写的程序源代码量虽然较大,但可执行代码效率高。随着技术的进步,Visual C++编程方式已被广泛采用,但象网络编程等一些对速度要求高、对硬件操作较多的程序,大多数还是用Windows C编程方式开发的。另外,学习Windows C程序设计,还有助于更深入地了解Windows的内幕和Windows API。 从教学角度讲,在学生具备了C语言和其它一些前导课程基础后,直接进入Windows C网络编程等实用编程技术课程,不仅可以让学生尽早地接触到前沿的实用编程技术,而且还可以极大地调动学生的学习积极性,在有限的时间里,学到更多的知识和技术。 |
- 上一篇:水滴石穿C语言之指针综合谈
- 下一篇:水滴石穿C语言之static辨析