Beej 网络编程指南——使用Internet Sockets

Brian "Beej Jorgensen" Hall

Version 3.0.15
July 3, 2012

Copyright © 2012 Brian "Beej Jorgensen" Hall


http://beej.us/guide/bgnet/output/html/multipage/index.html



目录

1.简介

1.1.读者对象

1.2.平台和编译器

1.3.官方网站

1.4.对使用Solaris/Sun操作系统的程序员的说明

1.5.对使用Windows操作系统的程序员的说明

1.6.Email策略

1.7.镜像

1.8.关于翻译者

1.9.版权和发行

2.什么是socket?

。。。


1.简介

        嗨!Socket编程让你感到沮丧吗?难道这仅仅是man pages所说的那点东西非常难懂吗?你想完成清新高效的网络编程,但是你却没有时间投身于一堆结构体之中去试着理解我为什么必须在调用connect()函数之前首先调用bind()函数,等等。。。

        得啦,你猜怎么着?我已经将这些繁琐的问题搞清楚了,而且我要试着和大家共享我的经验了!你算是来着了。这篇文章将给普通的C程序员以优势——在繁杂的网络编程中他(她)所需要的突破口。

        另外,快来看看吧:我终于赶上了时代的脚步(虽然也是在最后的关头)我已经把IPV6的内容更新到指南中了!开始享受吧!

1.1.读者对象

        这篇文章一个指南,而不是参考书。这篇文章可能对于那些刚刚接触Socket编程并且正在寻找入门书的程序员来说是比较合适的。无论如何这篇文章肯定不是一部完备的Socket编程入门书。

        不过,尽管这样,这篇文章作为让大家对Socket编程有个感性上认识的读物还应该说是足够了:-)

1.2.平台和编译器

        这篇文章里面包含的代码已经用Linux PC的Gnu's gcc编译器编译通过了。这些代码应该也可以在其它使用gcc编译器的平台上编译通过。很显然,这些代码不适用于那些使用Windows操作系统的程序员,请参考1.5.对使用Windows操作系统的程序员的说明

1.3.官方网站和书籍销售

        这篇文章的官方网址是:http://beej.us/guide/bgnet

在这里将找到代码示例和各种语言的译本。

如果想买装订精良的打印副本(某些人称之为书),敬请访问http://beej.us/guide/url/bgbuy. 我将非常感激您的购买,因为那将有助于维系我文档写作的生活!

1.4.对使用Solaris/Sun操作系统的程序员的说明

        如果在Solaris/Sun操作系统上编译,为了能够链接到正确的程序库,你需要指定一些额外的命令行编译程序开关。为了达到这一效果,我们只需要在编译命令的最后添加“-lnsl -lsocket -lresolv”即可。像这样:

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

         如果你仍然有编译错误,请在编译命令的最后追加”-lxnet”选项。我并不清楚为什么要这样做,但是其他人感觉需要这样才行。
        另一个你可能会发现问题的地方是在调用setsockopt()函数的时候。可能是基本类型不同于我的Linux,所以请将:
int yes=1;
替换成
char yes=’1’;
        由于我没有Sun的操作系统,我并没有测试过上述的问题,这些问题只是其他人通过Email的方式告诉我的。

1.5.对使用Windows操作系统的程序员的说明

        对于Windows操作系统,由于历史原因,我只在Windows操作系统上作过一点点儿的工作。其实就是因为我对Windows操作系统不怎么感冒。但是我应该实在地告诉你Windows包含一个巨大的安装基础,显而易地是一个非常棒的操作系统。

俗话说,“别离情更亲”,在Windows这方面,我相信我是这样的。(或者也许这个已经过时了。)但是,我想说的是,自从我不再使用Microsoft的操作系统以后,这十多年我过的更滋润了。或者, 我可以坐下来很有把握地说:“没错,Windows用起来太方便了!”这确实是我咬着后槽牙说的。

所以, 我依然鼓励你去尝试一下Linux,BSD,或者其他口味的Unix。

其实萝卜青菜各有所爱,对于Windows用户来说,你们将很乐意知道一下的信息,而且一般来说是可行的。有可能需要一点点地改动。

一件很酷的事情就是你可以安装Cygwin。一个Windows上用的Unix工具集合。具小道消息称有了它所有的程序源码都可以不作任何改动便已通过。

但是,也许有人想用纯Windows的方式来解决问题。那你太胆大了,首先你必须跑出去来张Unix光盘。不,不,我开玩笑呢。这几天我应该友好的面对Windows。

言归正传,下面的事情是你必须做的(除非你已经安装了Cygwin!):第一,忽略我在这里提到的所有系统头文件。你只需要包含的唯一的头文件是:

#include <winsock.h>

恩,等一下。你还需要在使用sockets库做任何事情之前调用一下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库,通常就是VC++下面的Winsock2.0的库wsock32.lib 或者winsock32.lib或者ws2_32.lib。在Project菜单Properties->Linker->Input->Additional Dependencies里边添加“wsock32.lib”(或者其他你将要使用的库)。

差不多,就这些了。

最后,当你要使用完sockets库之后,你需要调一下WSACleanup()。具体的操作就看看在线帮助吧。

一旦你完成了这些,本文后面所涉及的示例代码就应该可用了,除了一些特殊情况。比如,你不能使用close()函数来关闭一个socket,而是要使用closesocket()函数。还有,select()函数只能用于socket操作,不能用于文件操作。(就像 0 相当于stdin一样)。

还有一个socket类CSocket,你可以使用。具体的操作就看看在线帮助吧。

如还需要更多关于socket的信息,请查看 WinsockFAQ

最后,我听说Windows没有也不支持我在一些示例代码中使用到的fork()系统调用。也许你不得不链接POSIX库或者其他一些库来解决。或者你可以用CreateProcess()函数来代替。fork()系统调用不需要任何参数,CreateProcess()函数需要一大堆参数。如果你不会用,你可以考虑用一下比较简单的CreateThread()函数,不过本文中不涉及多线程调度。我只能告诉你这些了,你懂的!

1.6 电子邮件策略

我一般来说可以通过电子邮件来帮助大家的,可以随意写给我,但我不能保证每一封都能及时地回复。我的生活很忙碌,有时候我不能回答你的问题。在某些情况下,我大多数情况下只是删除该邮件。我不针对任何一个人;只是我没有时间给你所需要的详细的解答。

作为一个原则,越复杂的问题,就越不太可能得到我的回答。如果你能邮寄之前缩小您的问题,一定要包括任何相关的信息(如您收到的平台,编译器,错误信息,和其他任何你认为可能帮我解决问题的信息),你更可能得到我的回复。更多的建议请参考ESR的文章,如何聪明的提问题

如果你没有得到回复,那你就自己试着解决一下吧,如果还是








 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值