您的位置:首页 > 理论基础 > 计算机网络

Beej的网络编程入门教程 第二篇 平台与编译器

2010-02-15 22:39 561 查看
看了目录你可能觉得很有意思(或者很奇怪)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()才能使用套接字进行工作,代码如下:

#include <winsock.h>
...... //省略了一些代码
{
WSADATA wsaData; //如果这句有错
//WSAData wsaData; //试试这句
//MAKEWORD(1,1) 使用winsock 1.1 MAKEWORD(2.0) 使用winsock 2.0

if(WSAStartup(MAKEWORD(1.1), &wsaData) != 0)
{
fprintf(stder, "WSAStartup failed./n");
exit(1);
}
......
}


你还必需通知编译器连接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()是一个不错的选择,它更容易些。不幸的是关于多线程的话题超出了本文的范围,你知道我只能说到这里了。

第二篇结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: