V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wind3110991
V2EX  ›  Linux

请问有人看过《Unix 网络编程 卷 1:套接字联网 API》吗, MacOS 下如何编译通过里面的源码啊?

  •  1
     
  •   wind3110991 · 2015-05-16 00:13:58 +08:00 · 6005 次点击
    这是一个创建于 3514 天前的主题,其中的信息可能已经有所发展或是发生改变。

    书:
    Mark-Down

    在unpbook 官网下载了源码,在Mac OS上make了里面的源码,我做的步骤:
    1)chmod u+x configure
    ./configure
    2)cd lib
    make
    3)cd ../libfree
    make (报错了)
    4)cd ../libgai
    make (报错了)

    然后试着去gcc一个TCP echo回文Server程序,然后一堆报错

    #include    "unp.h"
    
    int
    main(int argc, char **argv)
    {
        int                 listenfd, connfd;
        pid_t               childpid;
        socklen_t           clilen;
        struct sockaddr_in  cliaddr, servaddr;
        void                sig_chld(int);
    
        listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port        = htons(SERV_PORT);
    
        Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    
        Listen(listenfd, LISTENQ);
    
        Signal(SIGCHLD, sig_chld);
    
        for ( ; ; ) {
            clilen = sizeof(cliaddr);
            if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
                if (errno == EINTR)
                    continue;       /* back to for() */
                else
                    err_sys("accept error");
            }
    
            if ( (childpid = Fork()) == 0) {    /* child process */
                Close(listenfd);    /* close listening socket */
                str_echo(connfd);   /* process the request */
                exit(0);
            }
            Close(connfd);          /* parent closes connected socket */
        }
    }
    
    }
    

    稍微gcc下,报一堆错误

    Undefined symbols for architecture x86_64:
      "_Bind", referenced from:
          _main in tcpserv03-11de6f.o
      "_Close", referenced from:
          _main in tcpserv03-11de6f.o
      "_Fork", referenced from:
          _main in tcpserv03-11de6f.o
      "_Listen", referenced from:
          _main in tcpserv03-11de6f.o
      "_Signal", referenced from:
          _main in tcpserv03-11de6f.o
      "_Socket", referenced from:
          _main in tcpserv03-11de6f.o
      "_err_sys", referenced from:
          _main in tcpserv03-11de6f.o
      "_sig_chld", referenced from:
          _main in tcpserv03-11de6f.o
      "_str_echo", referenced from:
          _main in tcpserv03-11de6f.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    请问下看过这本书的前辈,如果是学习这本书,有必要去具体编译这本书里的源码吗?

    Mac OS怎么也是继承BSD的,为什么里面的编程环境有所不同呢?

    更重要的是还是说我只用看下,了解Unix大概的实现,然后去网上找c++源码上手这样?不希望为这些事情浪费太多时间

    26 条回复    2018-07-21 06:20:08 +08:00
    lingxi27
        1
    lingxi27  
       2015-05-16 00:19:07 +08:00
    "不希望为这些事情浪费太多时间" 那就不要浪费时间了
    wind3110991
        2
    wind3110991  
    OP
       2015-05-16 00:20:33 +08:00
    @lingxi27 那就是看一遍过?
    auser
        3
    auser  
       2015-05-16 00:32:55 +08:00 via Android
    这本书我看的滚瓜烂熟

    网络协议不好先看tcp编程接口部分。开头的协议和选项什么的先忽略。程序自己对照manpage写。反复阅读并写代码练习。,最终把tcp udp全看熟悉。完了nginx什么的网络模块。 最终归到协议上。
    wind3110991
        4
    wind3110991  
    OP
       2015-05-16 00:47:37 +08:00
    @auser 这本书有没有必要全部看完?
    xguru
        5
    xguru  
       2015-05-16 02:38:05 +08:00
    装个虚拟机呗
    wind3110991
        6
    wind3110991  
    OP
       2015-05-16 02:48:55 +08:00
    @xguru 装虚拟机?Mac OS本身就是基于Unix了还需要装虚拟机吗?
    ilotuo
        7
    ilotuo  
       2015-05-16 02:57:03 +08:00
    好像是安装错了
    mac 的gcc也有分不同版本. clang是mac自己的不是移植linux的
    port install gcc48 试试
    auser
        8
    auser  
       2015-05-16 07:32:27 +08:00
    @wind3110991 没必要 比如sctp 主要还是TCP和UDP相关的部分 熟悉接口和对应协议状态变化以及底层处理的方式
    auser
        9
    auser  
       2015-05-16 07:33:55 +08:00
    @wind3110991 刚开始学我还是建议在Linux上写代码 编程经验不多的话 现在处理跨平台方面的差异还太早
    greatyao
        10
    greatyao  
       2015-05-16 07:47:19 +08:00 via Android
    choury
        11
    choury  
       2015-05-16 10:38:38 +08:00
    不知道你哪来的代码,在我的印象里面,socket,bind这些函数都是小写开头的
    shiweifu
        12
    shiweifu  
       2015-05-16 10:42:11 +08:00
    @choury
    记得貌似是这本书源码里定义的宏
    ioth
        13
    ioth  
       2015-05-16 11:01:58 +08:00
    不希望为这些事情浪费太多时间
    ,
    osx和unix区别
    就像linux和安卓
    chengzhoukun
        14
    chengzhoukun  
       2015-05-16 11:19:30 +08:00 via Android
    早上刚下单😁
    wind3110991
        15
    wind3110991  
    OP
       2015-05-16 11:35:41 +08:00
    @choury 书里包括网上的源码全是大写。。。貌似作者书里说允许环境变量覆写,也不知道什么意思
    wind3110991
        16
    wind3110991  
    OP
       2015-05-16 11:38:03 +08:00
    @auser 我都是vps直接ssh上centos 6.5去写的,请问下有什么好的方法管理和同步代码?是不是一般用git,有没有更好的方法
    wind3110991
        17
    wind3110991  
    OP
       2015-05-16 11:39:40 +08:00
    @shiweifu 对对,但是编译作者给的库后并不能用 - -,还是读读源码,然后乖乖写回c++好了
    frostcake
        18
    frostcake  
       2015-05-16 12:39:09 +08:00
    请问楼主是怎么学习这边书的? 从第一章开始一章一章看?
    wind3110991
        19
    wind3110991  
    OP
       2015-05-16 12:44:34 +08:00
    @frostcake 正在快速过第一遍,我看书一般第一次略读然后标出自己认为重要的部分,第二次细读重要部分然后记下不懂的地方,然后敲里面的源码,第三次回头看下不懂的地方
    lu18887
        20
    lu18887  
       2015-05-16 13:43:02 +08:00
    ./configure # try to figure out all implementation differences

    cd lib # build the basic library that all programs need
    make # use "gmake" everywhere on BSD/OS systems

    cd ../libfree # continue building the basic library
    make

    cd ../libroute # only if your system supports 4.4BSD style routing sockets
    make # only if your system supports 4.4BSD style routing sockets

    cd ../libxti # only if your system supports XTI
    make # only if your system supports XTI

    cd ../intro # build and test a basic client program
    make daytimetcpcli
    ./daytimetcpcli 127.0.0.1

    按这个顺序来,可以吗?
    shiweifu
        21
    shiweifu  
       2015-05-16 14:36:35 +08:00
    @wind3110991
    其实建议拿Python、Ruby来对照函数重新写一下,反正都是那些方法,都是那个原理,实在没必要非得用C、C++
    zyearn
        22
    zyearn  
       2015-05-16 18:57:03 +08:00
    @wind3110991 看这本书之前先问问自己看书的目的是什么,是熟悉API?linux下编程?还是熟悉网络编程?如果是想熟悉网络编程,建议你先自己实现一个静态web server,遇到一些坑,有自己的解决方案,不好也没关系,然后再看这本书,会有事半功倍的效果。我也在学网络编程,结合epoll自己实现了一个web server,有兴趣你可以参考参考:) ,这是链接 https://github.com/zyearn/zaver
    wind3110991
        23
    wind3110991  
    OP
       2015-05-18 20:43:19 +08:00
    @zyearn 谢谢你,我会参考的~
    wind3110991
        24
    wind3110991  
    OP
       2015-05-18 20:43:41 +08:00
    @shiweifu 我做的方向可能还是要用c和c++去实现
    bookit
        25
    bookit  
       2015-05-21 22:52:22 +08:00
    你根本没有成功地编译出libunp,当然后面要用到unp里面的函数,都链接不上了

    所以你应该去搞懂如何成功地编译出书里带的这个lib,然后再编译出单独的小程序来练习。

    既然做了这个行业,处理编译错误是基本功,去google吧
    thomas2015
        26
    thomas2015  
       2018-07-21 06:20:08 +08:00
    我用 Mac 编译这个源码的时候,只有 Libgai 这个包编译错误,其他都可以编译,之所以出现:
    Undefined symbols for architecture x86_64:
    "_Bind", referenced from:
    _main in tcpserv03-11de6f.o
    "_Close", referenced from:
    _main in tcpserv03-11de6f.o
    "_Fork", referenced from:
    _main in tcpserv03-11de6f.o
    "_Listen", referenced from:
    _main in tcpserv03-11de6f.o
    "_Signal", referenced from:
    _main in tcpserv03-11de6f.o
    "_Socket", referenced from:
    _main in tcpserv03-11de6f.o
    "_err_sys", referenced from:
    _main in tcpserv03-11de6f.o
    "_sig_chld", referenced from:
    _main in tcpserv03-11de6f.o
    "_str_echo", referenced from:
    _main in tcpserv03-11de6f.o
    ld: symbol(s) not found for architecture x86_64

    是因为你在编译的时候,没有加上 -lunp,当然首先必须编译出这个静态库文件,一般在编译 libfree 这个最基本的库之后就能编译出 unp.a(在上一层目录生成),然后就可以了.至于其他的 libroute 编译不出来,其实关系不大(大概好像是说是否支持 BSD4.8),主要 libfree 能编译出来,那么 unp.a 就可以编译出来了.
    我用 CentOS 7 编译的时候,没有出现问题,连 Mac 编译不出来的 libgai 都可以编译出来,Mac 会出现一些意想不到的麻烦,网上资料也少,除非 google 还能找到一些,用 Linux 还是比较好.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2757 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:59 · PVG 13:59 · LAX 21:59 · JFK 00:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.