Beej的网络编程指南–简介

发布时间:2009/05/14      类别:网络 | 所属专题:

原文:http://www.beej.us/guide/bgnet/
翻译:学与思linux编程网

1. 简介

嗨,您是否觉得socket编程很难入门?您是否觉得很难在man page中找到有用的socket编程信息?虽然您很想进入美妙的网络编程领域,但您是否知道在您调用connect()之前是否应该先调用bind()函数…

好了,您来对地方了,我已经做了这些枯燥的事情并打算向大家共享我所了解到的知识。只要您有c语言编程经验,本文会帮助您快速的进入网络编程世界。

注意哦,本文最近已经跟上了IPv6时代的步伐。慢慢享用吧!

1.1. 本指南适合哪些人阅读

本文档是一篇socket编程指南,本非一本完整的参考书。如果您刚刚接触到网络编程,那么本文可以很好的起到一个入门指南的作用。但无论怎么讲,这都不是一本全面的socket网络编程大全。

当然,本文档作为man page的辅助材料应该是足够啦:-)

1.2. 编程平台与编译器

本文的所有代码都在一台装有Linux的PC上用GNU gcc成功编译过,当然它们应该也能够在其它使用gcc的机器上顺利完成编译。自然,如果您的编程环境是Windows,那么这些例子代码不能完全都能够通过编译,祥见下文。

1.3. 本文档官方网站及在售图书

本文档官网地址为http://beej.us/guide/bgnet/. 在这个网站上您可以找到本文的所有例子代码和多种语言的译本。

如果您想购买本文的纸版图书,您可以访问http://beej.us/guide/url/bgbuy. 我很高兴能够把书卖给您,因为这样我会得到收入进而让我我可以更好的维护这份文档,谢谢!

1.4. Solaris/SunOS 程序员注意事项

如果您想在Solaris or SunOS编译本文中的例子,为了能够链接到代码需要的程序库,您需要指定一些命令行开关选项:In 您可以简单的在编译指令的最后加上”-lnsl -lsocket -lresolv”,如:

$ cc -o server server.c -lnsl -lsocket -lresolv

如果您还是看到了编译错误,也许您还需要添加 “-lxnet” 开关,虽然我不知道为什么要加这个库,但确实有人添加后就成功编译了。

另外一个可能出现错误的地方就是调用setsockopt()这个函数的地方。因为这个函数的原型在linux上不同于SunOS,您需要把源代码中的

int yes=1;

更改为:

char yes=’1′;

因为我没有Sun的机器,所以我没有测试过上面的建议是否行得通,不过有朋友来信告诉我这样做确实可以。

1.5. Windows 程序员注意事项

由于曾经我不太喜欢Windows系统,所以本指南中的代码可能对windows不太友好。不过我现在可以告诉您,windows是一个非常不错的操作系统,同时也有很多使用者。

人们常说距离产生美,这点我也很占同。十多年没有在工作上使用过Windows系统了,但我更加快乐。不过,我很乐告诉您“放心使用Windows吧,它很不错!”,虽然我说这句话的时候可能会咬紧牙关。

所以我还是强烈推荐大家使用Linux, BSD,或则其它的类unix系统。

但萝卜白菜各有所爱,对于喜欢Windows的程序员来说,如有必要您只需做少量变动就可以使用本文档中的代码了。

最简单的变动就是安装Cygwin, 它是专为windows准备的Unix工具集合。听说用它的话,一行代码也不需改变就能编译过去。如果您想用windows上的原生编程工具,您需要:扔掉windows,立刻使用unix,嗯哼,开玩笑的啦。最近我可变成了windows的朋友了。你可以这样做: 首先用#include <winsock.h>替换掉那些只有在unix系统上才有的头文件。然后在做其它任何事情之前先调用WSAStartup()这个函数,如:

#include <winsock.h>
{

WSADATA wsaData;   // if this doesn’t work
//WSAData wsaData; // then try this instead
// MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0:
if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {

fprintf(stderr, “WSAStartup failed.n”);
exit(1);

}

你还必须告诉您的编译器去链接Winsock库,通常就是wsock32.lib,winsock32.lib或ws2_32.lib。在VC++环境您可以选择Project菜单,然后点击Settings,然后选择Link tab标签, 这时您会看到”Object/library modules”. 填入您需要链接的库”wsock32.lib” (或上面提到的其它的库)即可。

最后,当您不再需要socket库时您还得调用WSACleanup(),详细情况请参考在线文档。

做好这些事情之后,本文中的代码几乎都可以用了,不过还是有些例外,比如,您不能调用close()函数来关闭一个socket,您需要调用closesocket(), 还有select()这个函数在Windows上只能用在socket上,不能用于其它文件(如标准c库中的stdin).

在windows上,您还可以使用socket类, 即CSocket。详情您可以参阅VC的帮助文档。

为了了解更多关于Winsock的知识请参阅Winsock FAQ。

最后,Windows上没有fork()这个系统调用,但是我的代码中却有,这时您可能需要调用CreateProcess()来代替fork(), 当然您也可以使用更简单一点的CreateThread()函数。

1.6. 用Email联系我吧

一般来说我很乐意回复Email过来的各种socket编程问题,所以如果有问题,请发email,但我不保证我一定可以回复您哦。我的生活还是比较忙的,所以不可能每次都能回复大家的疑问,还请海涵!

一般说来,问题越复杂,我越容易不回复,因为这要花费大量的时间来研究您的问题。如果您在提问之前能够尽可能降低问题所涉及的范围并提供良好的辅助说明(如编程平台,编译器,错误信息等等所有的能够帮我帮您搞定问题的信息)的话,我会尽量帮助您,为了更好的提问请参阅ESR的文档《提问的智慧》

如果您没有收到我的回复,请您再仔细研究研究看能否解决,如果还是不能解决,写信给我吧,不过要附上详尽的信息哦。

您是否觉得我很烦啊,跟您说这么多提问的事情。在过去的这些年里,本文档有这么多的反馈,我非常的高兴,这也是我坚持更新本文档的动力,非常感谢你们!

1.7. 镜像

无论是公开的还是私下的,都非常欢迎您能够为本文档提供镜像,如果您想公开的发布本文档镜像,请写信给我beej@beej.us,我会在首页上添加您的链接。

1.8. 翻译指南

如果你想把本指南翻译成其它语言,email给我吧beej@beej.us我会给您在首页上添加链接。您可以自由的添加您的大名!

不过请注意许可约束和版权信息哦,详见下面。

如果您想让我帮你把翻译档保存在官方网站上,告诉我吧。如果您想把翻译档放在自己的网站上,也可以,我会给您添加链接的。

1.9. 版权信息

Beej’s Guide to Network Programming is Copyright © 2009 Brian “Beej Jorgensen” Hall.
Beej网络编程指南 © 2009 Brian “Beej Jorgensen” Hall.

除了源代码, 本作品采用Creative Commons Attribution- 非商业使用- 非演绎作品 3.0 许可。给了更好的理解该许可,请访问http://creativecommons.org/licenses/by-nc-nd/3.0/ 或则写信给Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
不可演绎许可有个例外: 本指南可以自由翻译成其他任何语言但需翻译准确, 并且需要完整翻译。译本可以附带翻译者的姓名及其联系方式。

本文中的代码您可以完全自由的使用,没有任何限制。

教师可以自由的把本文档推荐或分发拷贝档给学生。

联系beej@beej.us 获取更多信息。

发表评论