看了目录你可能觉得很有意思(或者很奇怪)5.1.getaddrinfo()---我要准备开始了! getaddrinfo()系统调用后加一个"我要准备开始了"是怎么回事?这是原作者为了方便读者而加上去的,通讯(这里是套接字通讯)嘛当然有双方才可以,所以就做了一点拟人化描述。请正确理解。下面我们就进入正文了。
1.基础知识
1.1.平台与编译器
后面出现的代码在linux下使用gcc编译完全没有问题,并且这些代码可以使用gcc为各平台产生可执行程序。可以确定的是不能直接在windows系统下使用,有关详细信息请看后面一节"注意事项"。
1.2.注意事项
1.2.1.solaris/sunos程序员注意事项
在solaris或sunos上编译时,你需要修改一些参数以便加载相关的库文件。就像下面这样:
$cc -o server server.c -lnsl - lsocket - lresdv
如果还有错误,你可以试试加入参数"-lxnet",我不太清楚这个参数的作用,也许一些人员需要用到。
另外一个需要注意的地方是在使用setsocketopt()函数时,此函数的原型与linux上不同。如下:
替换
int yes= 1;
为
char yes= '1';
我没有sun的工作环境,所以上面说的这些没有测试;这些信息均是大家通过邮件告知的。
1.2.2.windows程序员注意事项
之前我在windows上做过一些工作,我并不喜欢它,但是我不得不说windows是一个非常好的操作系统。
有人说失落让人成长,确实这样;我很高兴自己已经有十多年没有用windows进行个人工作了。我觉得使用windows非常轻松,是的我很肯定这一点。
我还是要鼓励你去试试linux、BSD或一些unix系统。大家都有自己喜欢的,windows一族一定也愿意了解这些信息。
一件很cool的事是安装cygwin,这是一个unix在windows中的工具,我听说这样做的程序不用修改就可以进行编译了。
也许你想在纯windows下编程,你可真勇敢。也许你听我我的话想马上换个unix回来!不,不我只是开个玩笑。我现在渐渐觉得windows挺友好的。
你要做的事:首先不要忘记加入系统头文件如下:
#include <winsock.h>
等一下!在开始之前还需要调用WSAStartup()才能使用套接字进行工作,代码如下:
你还必需通知编译器连接winsock库,通常是wsock32.lib或winsock32.lib或ws2_32.lib(2.0版本使用)。使用vc++时,选择项目(project)菜单,选择设置(setting)连接选项卡,有一项对象/模块,键入"wsock32.lib"(或你需要的库文件)。
我还听说:当你使用完套接字后需要调用WSACleanup(),查看在线帮助可获得详细信息。在windows系统下使用本文档中的例子时,大多数是没有问题的有一部分可能有异常发生。一个要注意的是close(),使用它不能关闭套接字而要使用closesocket()。还有select()只能在声明的套接字上使用,不能在文件上使用。
windows上还有一个csocket类可以使用。查看你的编译器帮助得到更详细的信息。
最后,我听说windows系统中没有fork()调用,在我的例子中有使用过。你可以使用CreateProcess()代替fork()。fork()没有参数,CreateProcess()有一大堆的参数。如果你不想使用它,那么CreateThread()是一个不错的选择,它更容易些。不幸的是关于多线程的话题超出了本文的范围,你知道我只能说到这里了。
第二篇结束。