请问有人看过《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++源码上手这样?不希望为这些事情浪费太多时间

5755 次点击
所在节点    Linux
26 条回复
lingxi27
2015-05-16 00:19:07 +08:00
"不希望为这些事情浪费太多时间" 那就不要浪费时间了
wind3110991
2015-05-16 00:20:33 +08:00
@lingxi27 那就是看一遍过?
auser
2015-05-16 00:32:55 +08:00
这本书我看的滚瓜烂熟

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

按这个顺序来,可以吗?

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

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

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

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

© 2021 V2EX