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