Windows下C语言网络编程快速入门
副标题#e#
C语言的进修,一般的方法是,先学C,然后是C++,最好还要有汇编语言和微机道理基本,然后才是Visual C++。这样的方法,对进修者来说,要耗费许多时间和耐力。而在学校解说中,也没有时间深入进修Windows编程的实用技能了。
其实,具有了C语言基本后,再有一些根基的C++类的观念,就可以直接进修Windows C编程了。
一、走近Windows C语言
许多语言都把显示一个“Hello,World!”做为第一个入门措施, C语言的第一个措施是这样的:
#include<stdio.h>
main()
{
printf(“Hello,World!”);
}
假如把main函数写成带参数的main函数,应该是:
#include<stdio.h>
main(int arge,char *argv[])
{
printf(“Hello,World!”);
}
Windows C的第一个措施和这个措施在形式和道理上都是一致的,只是有两点差异:
1. 主函数吸收的形参不可是呼吁行中的字符串的个数和字符串的首地点。
2. C语言的许多函数在Windows C中都可以继承利用,但象printf()屏幕显示等函数就不能继承利用了。因为Windows是多任务操纵系统,屏幕已不再为某一个应用措施所独占,Windows C应用措施要显示字符串,需要利用Windows提供的API函数,开本身的窗口
下面是一个最简朴的,显示“Hello,World!”的Windows C措施:
#include<windows.h>
APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello,World!","第一个Windows C措施",MB_OK|MB_ICONASTERISK);
}
主函数的形参有四个:
1) Hinstance:吸收措施运行时当前实例的句柄;
2) HprivInstance:前一个实例的句柄;
3) LpCmdLine:措施呼吁行指针;
4) NcmdShow:一个用来指定窗口显示方法的整数。
这几个参数的利用我们会在深入的进修中先容的。
显示Hello,Word!字符串,我们利用了一个MessageBox函数,这个函数会在屏幕上显示一个对话框,它的原型是:
int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UNIT uType)
四个参数别离是:
1) HWnd:父窗口的句柄;
2) LpText:要显示字符串的指针;
3) LpCaption:对话框标题字符串的指针;
4) UType:显示在对话框上的小图标的范例。
利用这个函数要包括windows.h头文件。
调试一下,怎么样?窗口上弹出了一个“第一个Windows C措施”对话框,上面有一行字:“Hello,World!”。
世界真的很优美啊!!
#p#副标题#e#
深入编程:
在C语言中,函数的声明,假如没有指明返回值范例,缺省值为void,这个措施的主函数就没有返回值。不外,在Windows编程时,我们最好养成个好习惯,指明函数的返回值范例,因为在C++中,函数返回值范例是不行以缺省的。而我们在Windows C编程时,照旧会用到C++的一些观念,这样做,有利于今后深入地进修。
类型一点的措施应该是这样的:
#include<windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL,"Hello,World!","第一个Windows C措施",MB_OK|MB_ICONASTERISK);
return 0;
}
这里,我们声明的范例为int型,而且返回一个值0,这样的函数就可以利用在巨大一点的函数挪用中了。
在这一节中,我们有几处都提到了句柄的观念,句柄和指针的观念差异,它是作为操纵系统内部索引表中的一个值来利用的,这样可以防备应用措施直接会见名工具的内部布局,浮现了Windows资源打点的优越性。譬如说,一个窗口找开之后,好对应内存中的一个内存块,这个窗口地址的内存快地点往往会由操纵系统做动态的调解,但其却不会随之变革。不外,通过它可以会见这个窗口,所以在利用的时候,可以把它当做指针一样对待。
二、 获取当地计较机的主机名和IP地点
和C语言一样,函数是Windows C编程的最根基的单元。不外,Windows C主要利用API函数,而网络编程则主要利用Winsock提供的API函数。
Winsock是90年月初,为了利便网络编程,由Microsoft连系了其他几家公司配合拟定的一套WINDOWS下的网络编程接口,它是通过C语言的动态链接库方法提供应用户及软件开拓者的,主要由winsock.h头文件和动态链接库winsock.dll构成,今朝有两个版本:Winsock1.1和Winsock2.0。
在Win32平台上,会见浩瀚的下层网络协议,Winsock是首选接口。
用Visual C++6.0编译Windows C措施,利用Winsock API函数时,首先要把wsock32.lib添加到它的库模块中,否刚在链接的时候,会呈现“error LNK2001”错误。添加wsock32.lib的详细步调是:打开工程菜单,选择配置,在弹出的Project settings对话框中,点击link选项卡,然后在工具/库模块文本框中添加wsock32.lib。
#p#分页标题#e#
最简朴的网络编程是获取本机的主机名和IP地点,这个措施利用了WSAStart()、WSAClenaup()、gethostname()、gethostbyname()四个winsock API函数,这四个函数的成果和利用要领先容如下:
1. WSAStartup():
【函数原型】
int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
【利用说明】
每一个利用winsock的应用措施,都必需举办WSAStart函数挪用,而且只有在挪用乐成之后才气利用其它的winsock网络操纵函数。
WVersionRequired:<输入>暗示欲利用的Winsock版本,这是一个WORD范例的整数,它的高位字节界说的是次版本号,低位字节界说的是主版本号。
LpWSAData:<输出>是一个指向WSADATA资料的指针。这个资料我们一般不利用。
返回值:挪用乐成返回0;不然,返回堕落信息。
2. WSAClenaup():
【函数原型】
int PASCAL FAR WSACleanup(void);
【利用说明】
winsock利用后,要挪用WSACleanup函数封锁网络设备,以便释放其占用的资源。
3.gethostname()
【函数原型】
int PASCAL FAR gethostname (char FAR * name, int namelen);
【利用说明】
该函数可以获取当田主机的主机名,个中:
name:<输出>用于指向所获取的主机名的缓冲区的指针。
Namelen:<输入>缓冲区的巨细,以字节为单元。
返回值:若无错误,返回0;不然,返回错误代吗。
4.gethostbyname()
【函数原型】
struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);
【利用说明】
该函数可以从主机名数据库中获得对应的“主机”。
该函数独一的参数name就是前面挪用函数gethostname()获得的主机名。若无错误,刚返回一个指向hostent布局的批针,它可以标识一个“主机”列表。
Hostent布局界说如下:
Struct hostent
{
char FAR * h_name;
char FAR FAR ** h_aliases;
short h_addrtype;
char FAR FAR ** h_addr_list;
}
个中:
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地点的源措施如下:
#include<winsock.h>
int WSA_return;
WSADATA WSAData;
HOSTENT *host_entry;
char host_name[256];
char host_address[256];
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
WSA_return=WSAStartup(0x0101,&WSAData);
if(WSA_return==0)
{
gethostname(host_name,256);
host_entry=gethostbyname(host_name);
if(host_entry!=0)
{
wsprintf(host_address,"%d.%d.%d.%d",
(host_entry->h_addr_list[0][0]&0x00ff),
(host_entry->h_addr_list[0][1]&0x00ff),
(host_entry->h_addr_list[0][2]&0x00ff),
(host_entry->h_addr_list[0][3]&0x00ff));
MessageBox(NULL,host_address,host_name,MB_OK);
}
}
WSACleanup();
return 0;
}
深入编程:
前面显示IP地点的时候,我们利用的是动静框,类型一点的编程应该利用对话框,如何编辑一个对话框,许多书中都有先容,编辑的对话框可参考图5的运行界面。
头文件Get_IP.h如下:
BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
这个措施只利用了一个对话框进程,一般把这个进程的声明放在头文件中。
源措施Get_IP.c:
#include<winsock2.h>
#include"Get_IP.h"
#include"resource.h" //这个头文件在建设资源的时候会自动生成,
//并会在插入资源时自动生成控件标识号.
int WSA_return;
WSADATA WSAData;
HOSTENT *host_entry;
char host_name[256];
char host_address[256];
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
WSA_return=WSAStartup(0x0101,&WSAData);
if(WSA_return==0)
{
gethostname(host_name,256);
host_entry=gethostbyname(host_name);
if(host_entry!=0)
{
wsprintf(host_address,"%d.%d.%d.%d",
(host_entry->h_addr_list[0][0]&0x00ff),
(host_entry->h_addr_list[0][1]&0x00ff),
(host_entry->h_addr_list[0][2]&0x00ff),
(host_entry->h_addr_list[0][3]&0x00ff));
}
}
WSACleanup();
DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)Hostname_ipDlgPro);
return 0;
}
BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,
WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return(TRUE);
case WM_COMMAND:
if(LOWORD(wParam)==IDOK)
{
SetDlgItemText(hDlg,IDC_EDIT1,host_name);
SetDlgItemText(hDlg,IDC_EDIT2,host_address);
SetDlgItemText(hDlg,IDCANCEL,"确定");
}
if(LOWORD(wParam)==IDCANCEL)
EndDialog(hDlg,TRUE);
return(TRUE);
break;
}
return(FALSE);
}
三、操作VisualC++6.0编译Windows C措施
#p#分页标题#e#
操作Visual C++6.0编译Windows C措施一般要颠末以下四个步调:新建项目、添加代码、添加资源和编译链接。下面我们简朴地先容一下措施上面先容的类型的获取本机的主机名和IP地点措施的编译进程:
(一) 新建项目
1.启动MicrosoftVisualC++,然后在【文件】菜单中先择【新建】呼吁,弹出如图1所示的【新建】对话框:
图1
2.在【新建】对话框中,系统打开的是默认的【工程】选项卡,【工程】选项卡左侧的列表框中有多种成立工程的方法,我们选中“Win32 Application”选项。
3. 在【位置】文本框中输入新建工程的路径(譬喻:F:\),在【工程】文本框中输入工程名称(譬喻:Get_IP)。
4. 选中【平台】列表框中的Win32复选框,然后单击【确定】按钮。
5. 在随后的对话框中,都选择默认配置,完成后,进入图2示界面:
图2
(二) 添加代码
在VisualC++6.0中,源代码一般存放在源代码文件和头文件中,往项目中添加源代码长短常利便的,为项目新建一个源代码文件一般要按下述要领操纵:
1. 选择【工程】|【添加工程】|【新建】选项,弹出图3所示【新建】对话框:
图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”选项,单击【新建】按钮,返回主窗口后,即可操作对话框编辑器举办编辑了。编辑后的对话框如图
图4
图5
(四) 编译链接
在添加了源代码与资源文件后,就可以对措施编译毗连了,可按Ctrl+F7键编译,按F7键毗连,按Ctrl+F5键运行措施。在毗连前是要留意,资源文件Get_IP.rc也要举办编译。
由于这个措施引用了Winsock API函数,在编译毗连前,还要添加wsock32.dll,详细要领前面已经先容过,这里就不再赘述了。
一点观点:
#p#分页标题#e#
操作C语言编写Windows应用措施有两种方法:一种是Windows C编程方法,另一种是Visual C++编程方法。在一般环境下,Visual C++编程方法编写的措施源代码量小、开拓时的事情量小、事情难度也较小,但编译后的代码量较大,运行速度略低;而Windows C编程方法编写的措施源代码量固然较大,但可执行代码效率高。跟着技能的进步,Visual C++编程方法已被遍及回收,但象网络编程等一些对速度要求高、对硬件操纵较多的措施,大大都照旧用Windows C编程方法开拓的。别的,进修Windows C措施设计,尚有助于更深入地相识Windows的黑幕和Windows API。
从解说角度讲,在学生具备了C语言和其它一些前导课程基本后,直接进入Windows C网络编程等实用编程技能课程,不只可以让学生尽早地打仗到前沿的实用编程技能,并且还可以极大地更换学生的进修努力性,在有限的时间里,学到更多的常识和技能。