最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的...
简单的第一次尝试,就大致梳理一下看书+自己理解的东西。
1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信。需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络通讯协议)或IPX(互联网数据包交换协议)协议建立通信。
2.然后是VC++6.0下网络编程的工程项目的基本创建,先贴一段代码:
#include <winsock2.h> #include <stdio.h> void main(void) { WSADATA wsaData;//注释1 int Ret; //初始化winsock版本2.2 if((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) { //如果winsock没有加载,调用WSAStartup()函数将会返回一个SOCKET_ERROR的错误代码 printf("WSAStartup failed with error %d\n", Ret); return ; } if(WSACleanup() == SOCKET_ERROR) { //WSACleanup()函数可以释放所有由winsock分配的资源,并取消这个应用程序挂起的winsock调用 printf("WSACleanup failed with error %d\n", WSAGetLastError()); } }
因为该程序的主函数入口是main(),所以建立工程时应选择win32 Console Application,然后我们编写的是winsock2.h的应用程序,需要链接到WS2_32.LIB库;如果是winsock.h时,需要使用WSOCK32.LIB;如果是MSWSOCK.H(这个是用于微软专用编程扩展的)时,还需链接MSWSOCK.DLL。(以上除DLL文件外都在VC++6.0 中的 project -> setting -> link 中的 Object/library modules:栏中添加即可)
上面代码中有个注释1,稍微解释一下:
初始化winsock时(也就是调用函数WSAStartup()加载winsock)用与加载的版本有关的信息和一个指向WSADATA结构的指针来填充该结构:
typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN + 1]; char szSystemStatus[WSASYS_STATUS_LEN + 1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; }WSADATA, * LPWSADATA;
我们不用太在意这个结构的具体细节,但至少应该知道怎么调用函数来填充它。如果想知道WSAData结构体中各个成员的含义和作用可以去看这本书《windows网络编程》第一章前面有很详细的解释。
最后,第一次的网络编程学习就先总结成这样了,我主要就是用一段错误处理的代码来测试头文件和了解如何开始编写网络编程的程序,有了简单的入门会清晰很多。个人感觉这篇总结还是有些许收获的。(吐槽一下个人学前端和windows编程时的感觉,学了几天,进步是很快,但一段时间不碰,都不想去碰了...导致html好多标签的属性和参数都忘了,windows编程中部分函数的使用细节也可能忘了...浅尝辄止)