请问有人看过《Unix 网络编程 卷 1:套接字联网 API》吗, MacOS 下如何编译通过里面的源码啊? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wind3110991
V2EX    Linux

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

  •  1
     
  •   wind3110991 May 16, 2015 6916 views
    This topic created in 4009 days ago, the information mentioned may be changed or developed.

    书:
    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 replies    2018-07-21 06:20:08 +08:00
    lingxi27
        1
    lingxi27  
       May 16, 2015
    "不希望为这些事情浪费太多时间" 那就不要浪费时间了
    wind3110991
        2
    wind3110991  
    OP
       May 16, 2015
    @lingxi27 那就是看一遍过?
    auser
        3
    auser  
       May 16, 2015 via Android
    这本书我看的滚瓜烂熟

    网络协议不好先看tcp编程接口部分。开头的协议和选项什么的先忽略。程序自己对照manpage写。反复阅读并写代码练习。,最终把tcp udp全看熟悉。完了nginx什么的网络模块。 最终归到协议上。
    wind3110991
        4
    wind3110991  
    OP
       May 16, 2015
    @auser 这本书有没有必要全部看完?
    xguru
        5
    xguru  
       May 16, 2015
    装个虚拟机呗
    wind3110991
        6
    wind3110991  
    OP
       May 16, 2015
    @xguru 装虚拟机?Mac OS本身就是基于Unix了还需要装虚拟机吗?
    ilotuo
        7
    ilotuo  
       May 16, 2015
    好像是安装错了
    mac 的gcc也有分不同版本. clang是mac自己的不是移植linux的
    port install gcc48 试试
    auser
        8
    auser  
       May 16, 2015
    @wind3110991 没必要 比如sctp 主要还是TCP和UDP相关的部分 熟悉接口和对应协议状态变化以及底层处理的方式
    auser
        9
    auser  
       May 16, 2015
    @wind3110991 刚开始学我还是建议在Linux上写代码 编程经验不多的话 现在处理跨平台方面的差异还太早
    greatyao
        10
    greatyao  
       May 16, 2015 via Android
    choury
        11
    choury  
       May 16, 2015
    不知道你哪来的代码,在我的印象里面,socket,bind这些函数都是小写开头的
    shiweifu
        12
    shiweifu  
       May 16, 2015
    @choury
    记得貌似是这本书源码里定义的宏
    ioth
        13
    ioth  
       May 16, 2015
    不希望为这些事情浪费太多时间
    ,
    osx和unix区别
    就像linux和安卓
    chengzhoukun
        14
    chengzhoukun  
       May 16, 2015 via Android
    早上刚下单
    wind3110991
        15
    wind3110991  
    OP
       May 16, 2015
    @choury 书里包括网上的源码全是大写。。。貌似作者书里说允许环境变量覆写,也不知道什么意思
    wind3110991
        16
    wind3110991  
    OP
       May 16, 2015
    @auser 我都是vps直接ssh上centos 6.5去写的,请问下有什么好的方法管理和同步代码?是不是一般用git,有没有更好的方法
    wind3110991
        17
    wind3110991  
    OP
       May 16, 2015
    @shiweifu 对对,但是编译作者给的库后并不能用 - -,还是读读源码,然后乖乖写回c++好了
    frostcake
        18
    frostcake  
       May 16, 2015
    请问楼主是怎么学习这边书的? 从第一章开始一章一章看?
    wind3110991
        19
    wind3110991  
    OP
       May 16, 2015
    @frostcake 正在快速过第一遍,我看书一般第一次略读然后标出自己认为重要的部分,第二次细读重要部分然后记下不懂的地方,然后敲里面的源码,第三次回头看下不懂的地方
    lu18887
        20
    lu18887  
       May 16, 2015
    ./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  
       May 16, 2015
    @wind3110991
    其实建议拿Python、Ruby来对照函数重新写一下,反正都是那些方法,都是那个原理,实在没必要非得用C、C++
    zyearn
        22
    zyearn  
       May 16, 2015
    @wind3110991 看这本书之前先问问自己看书的目的是什么,是熟悉API?linux下编程?还是熟悉网络编程?如果是想熟悉网络编程,建议你先自己实现一个静态web server,遇到一些坑,有自己的解决方案,不好也没关系,然后再看这本书,会有事半功倍的效果。我也在学网络编程,结合epoll自己实现了一个web server,有兴趣你可以参考参考:) ,这是链接 https://github.com/zyearn/zaver
    wind3110991
        23
    wind3110991  
    OP
       May 18, 2015
    @zyearn 谢谢你,我会参考的~
    wind3110991
        24
    wind3110991  
    OP
       May 18, 2015
    @shiweifu 我做的方向可能还是要用c和c++去实现
    bookit
        25
    bookit  
       May 21, 2015
    你根本没有成功地编译出libunp,当然后面要用到unp里面的函数,都链接不上了

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

    既然做了这个行业,处理编译错误是基本功,去google吧
    thomas2015
        26
    thomas2015  
       Jul 21, 2018
    我用 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 还是比较好.
    About     Help     Advertise     Blog     API     FAQ     Solana     1071 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 88ms UTC 18:21 PVG 02:21 LAX 11:21 JFK 14:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86