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

2015-05-16 00:13:58 +08:00
 wind3110991

书:

在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++源码上手这样?不希望为这些事情浪费太多时间

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

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

既然做了这个行业,处理编译错误是基本功,去google吧
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 还是比较好.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/191445

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX