沉寂好多天,总算有了进展。
上回说了,要加入网络对战功能。猪哥在这方面是一窍不通,首先肯定是要去找些资料来学习。搜搜关键词socket、winsock、windows网络编程,入门文章还是一大把的,但这些小文章都讲得不清不楚的,懂的不用看,不懂的还是看不懂。这里推荐两本书:
1、《Windows网络编程(第二版)》 Network Programming For Microsoft Windows 中英文都有电子版
就像directx是多媒体API,所谓winsock也就是一个网络API。最了解自己孩子的肯定是父母,两位作者本身都在微软干这个,所以看他们写的书没错啦。
2、《PC游戏编程(网络游戏篇)》 03年中国人写的,讲了很多实战经验。有了技术基础后把这本作为补充很不错。
至于其他小文章,只能用于回顾。
各种资料大致翻了一遍之后,肯定是一头雾水,不亲手编几行代码必然还是一无所获。
大致计划了一下,我只要实现一个目的:能够让两个人通过TCP/IP互联对战。至于能不能有一个网络服务器或是局域网对战,暂时抛在一边。
具体的第一个目标设置得更简单,就是显示本机IP地址。
结果一进入实际操作就发现好多基本问题没弄明白,这里一一记录下来理出个头绪,争取接下来把这些头疼的小问题都搞清楚,帮助一定很大。
如何显示本机IP小文章有很多,我随便参考一篇来研究http://blog.csdn.net/kingliujian/article/details/795972
直接将它的代码拷进编译器,作一些必要的添加修补,比如加winmain()等,编译!
出现错误若干。
我看了下,发现CString这个词很陌生,百度之,原来属于MFC里头的一个什么类之类的,MFC我也不懂啊,木办法,试着添加#include ''afx.h''。(知识盲点一:MFC)
关于MFC这里插着说几句,其实我在学winsock过程中就想到这个问题,至少要提供一个输入框给游戏者输入试图连接的主机IP啊!不过不想分散精力学一个东西到一半时又去学另一个重量级相同的玩意,总有替代方法的,所以MFC计划留到整个网络功能实现得差不多后再研究。
再编译错误就只剩一个了:fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
之前搞动态静态编译的时候涉及到过这个选项,但是实在搞得不是很清。(知识盲点二:VS2008的一些设置细节)
我又试着添加#define _AFXDLL
这次原来的错误没了,不过出来个新的,提示windows.h重复出现。我有点没辙了,打算想其他路子。(知识盲点三:如何查看头文件)
于是我考虑,能否对CString来个替换?大致能理解就是定义一个字符串数组盛放获取到的IP地址,我尝试用char *来替换,因为我之前知道函数传递字符串时实际传递的是首字符的指针。也不搞多个地址那么麻烦,我只需要得到一个就行。
ip赋值的那句话是不需要修改的,再次编译提示MessageBox()参数不能只有1个。于是我百度了下,并参考之前我的那个游戏代码中MessageBox的用法,将参数补到4个。这时提示第二个参数不是LPCTSTR型,于是我很虎比的来了个LPCTSTR()强制转换,就算我完全不知道LPCTSTR是个什么概念...这次通过了,不过还报错第三个参数类型有误。很奇怪的是同样的用法原来好好地现在就不行。我怀疑是缺乏某个宏定义,所以索性将整个程序直接添加进了游戏项目中。(知识盲点四:MessageBox()的用法)
还是不行,错误又变了,这次提示n多个“error LNK2019: 无法解析的外部符号”,我大概猜出是没有包含ws2_32.lib,于是试着在编译器设置中添加lib路径,还是不行。最终还是百度出的解决办法http://blog.sina.com.cn/s/blog_51890fea0100l41i.html(同知识盲点二)
之后终于神奇的编译成功了,然后我运行程序,如愿得到了一个显示本机IP的提示窗,地址同在cmd里用ipconfig查看的结果相符。
就这样,终于东撞西撞的迈出了网络编程的第一小步。
万事开头难,我想耐心把这些问题弄懂,再往后的工作不说势如破竹至少坡度也不会像一开始这么陡了。
附:
VC中release和debug版本的区别?
http://zhidao.baidu.com/question/292315594.html
Multi-Byte Character Set & Use Unicode Character Set
http://blog.csdn.net/Jackiezhw/article/details/3901685
VC运行时库(/MD、/MT等)
http://www.cnblogs.com/xiongjiaji/archive/2011/06/01/2476508.html
msdn(据说很有用,我怎么死活找不到想要的东西。。)
http://msdn.microsoft.com/zh-cn/library/aa468084.aspx
#pragma comment(lib, "ws2_32.lib") 意义
http://blog.csdn.net/jungzhang/article/details/4558464
(注:仅仅是在编译器设置了各种文件的路径是不够的,还要将文件添加进项目来)
VS编译错误:mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file
http://blog.csdn.net/chenyujing1234/article/details/7789597