分享

记录一次配置unix网络编程环境的过程和遇到的问题

 just_person 2019-09-09

记录一次搭建unix网络编程环境过程中遇到的问题和总结

计算机环境虚拟机 linuxmint-18-xfce-64bit

1.打开unix网络编程.iso
把目录下的文件复制到某一目录,修改权限,可命令可鼠标操作。

 

2.

s@ss-Linux ~/unix/unpv13e $ sudo su
[sudo] s 的密码: 
ss-Linux unpv13e # ./configure 
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... gcc
checking for C compiler default output... configure: error: C compiler cannot create executables
See `config.log' for more details.

很明显在检测环境时gcc无法生成可执行文件。
于是我又执行了一次configure,还是同样的结果。
我查看了一下config.log也看不大明白。
上网翻博客。。。也没查到相关内容。

 

3.突发奇想,编译器出现问题,不如换个编译器。

s-Linux unpv13e # apt-get install g++
正在读取软件包列表... 完成
正在分析软件包的依赖关系树 
正在读取状态信息... 完成 
将会同时安装下列软件:
binutils cpp-5 g++-5 gcc-5 gcc-5-base gcc-5-base:i386 libasan2 libatomic1
libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgfortran3
libgomp1 libitm1 liblsan0 libmpx0 libquadmath0 libstdc++-5-dev
libstdc++6:i386 libstdc++6 libtsan0 libubsan0
建议安装:
binutils-doc gcc-5-locales g++-multilib g++-5-multilib gcc-5-doc
libstdc++6-5-dbg gcc-5-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg
libatomic1-dbg libasan2-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg
libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg glibc-doc libstdc++-5-doc
下列【新】软件包将被安装:
g++ g++-5 libc-dev-bin libc6-dev libstdc++-5-dev
下列软件包将被升级:
binutils cpp-5 gcc-5 gcc-5-base gcc-5-base:i386 libasan2 libatomic1 libcc1-0
libcilkrts5 libgcc-5-dev libgfortran3 libgomp1 libitm1 liblsan0 libmpx0
libquadmath0 libstdc++6:i386 libstdc++6 libtsan0 libubsan0

。。。。。。。。(略)

上面可以看到gcc等,希望有用。

 

4.再次执行configure

View Code

 

 

5.明显通过检测生成了

Makefile
Make.defines
config.h

 

6.根据readme的指示,编译库文件

View Code

 

 

7.编译库文件

ss-Linux lib # cd ../libfree
ss-Linux libfree # make
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o in_cksum.o in_cksum.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_ntop.o inet_ntop.c
inet_ntop.c: In function ‘inet_ntop’:
inet_ntop.c:60:9: error: argument ‘size’ doesn’t match prototype
size_t size;
^
In file included from inet_ntop.c:27:0:
/usr/include/arpa/inet.h:64:20: error: prototype declaration
extern const char *inet_ntop (int __af, const void *__restrict __cp,
^
<builtin>: recipe for target 'inet_ntop.o' failed
make: *** [inet_ntop.o] Error 1

错误原因可以看出是
类型不对。
通过搜索 可以知道

ANSCI创造了size_t数据类型,它用作malloc的唯一参数(待分配的字节数),或者作为read和write的第三个参数(待读写的字节数)。在32位系统中,size_t是一个32位值,但是64位系统中它必须是一个64位值,以便发挥更大寻址模型的优势。这意味着64位系统中也许含有一个把size_t定义为unsigned long的typedef指令。联网API存在如下问题:POSIX.1g的某些草案规定,存放套接字的地址结构大小的函数参数具有size_t的数据类型(如bind和connect的第三个参数)。某些XTI结构也含有数据类型为long的成员(如t_info和t_opthdr结构)。如果这些规定不加修改,当unix从ILP32模型转为LP64模型时,size_t和long都将从32位变成64位值,这两个列子实际上并不需要使用64的数据类型:套接字的地址结构的长度最多也就几百个字节,给XTI的结构成员使用long数据类型是个错误。
处理这些情况的办法是使用专门设计的数据类型。套接字API对套接字地址结构的长度使用socklen_t数据类型,XTI则使用t_scalar_t和t_uscalar_t数据类型。不把这些值由32位改为64位的理由是易于为那些已经在32位系统上编译的应用程序提供在新的64位系统中的二进制代码的兼容性

我的电脑是64位。

解决办法
找到inet_ntop.c第61行 size_t size ->改成 socklen_t size)

8.重新编译

ss-Linux libfree # make
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_ntop.o inet_ntop.c
/usr/include/arpa/inet.h: In function ‘inet_ntop’:
inet_ntop.c:152:23: warning: ‘best.len’ may be used uninitialized in this function [-Wmaybe-uninitialized]
if (best.base == -1 || cur.len > best.len)
^
inet_ntop.c:123:28: note: ‘best.len’ was declared here
struct { int base, len; } best, cur;
^
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o inet_pton.o inet_pton.c
ar rv ../libunp.a in_cksum.o inet_ntop.o inet_pton.o
a - in_cksum.o
a - inet_ntop.o
a - inet_pton.o
ranlib ../libunp.a

 

9.路由套接字 库

ss-Linux libfree # cd ../libroute
ss-Linux libroute # make
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o get_rtaddrs.o get_rtaddrs.c
In file included from get_rtaddrs.c:1:0:
unproute.h:3:45: fatal error: net/if_dl.h: 没有那个文件或目录
compilation terminated.
<builtin>: recipe for target 'get_rtaddrs.o' failed
make: *** [get_rtaddrs.o] Error 1

又出错了,
c - What package do i need to install for using routing sockets? - Stack Overflow
http:///questions/1520649/what-package-do-i-need-to-install-for-using-routing-sockets

Please note, you DO NOT need to make in that folder "libroute"

See the Document:

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
Linux is not BSD style routing, just go to ../intro and build examples~!

好吧,编译到此结束。

 

10.打开lib目录
修改unp.h
     #include "../config.h"
改成
     #include "config.h"

 

11.返回unpv13e文件夹

ss-Linux unpv13e # cp config.h /usr/local/include
ss-Linux unpv13e # cp lib/unp.h /usr/local/include
ss-Linux unpv13e # sudo cp libunp.a /usr/local/lib
ss-Linux unpv13e # cd intro


12.到此搭建完毕,测试一下

ss-Linux intro # gcc daytimetcpcli.c -o 获取时间
/tmp/cciq4Jvt.o:在函数‘main’中:
daytimetcpcli.c:(.text+0x3b):对‘err_quit’未定义的引用
daytimetcpcli.c:(.text+0x6d):对‘err_sys’未定义的引用
daytimetcpcli.c:(.text+0xe5):对‘err_quit’未定义的引用
daytimetcpcli.c:(.text+0x114):对‘err_sys’未定义的引用
daytimetcpcli.c:(.text+0x153):对‘err_sys’未定义的引用
daytimetcpcli.c:(.text+0x196):对‘err_sys’未定义的引用
collect2: error: ld returned 1 exit status

 

又错。。。。。
按道理头文件,库文件都弄好了啊。......

有个makefile,make,make,make编译成功。[上面的问题,第二天解决了,请翻到最后。初学者很无奈。。。。。。。

ss-Linux intro # make
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli.o daytimetcpcli.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli daytimetcpcli.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli1.o daytimetcpcli1.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli1 daytimetcpcli1.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli2.o daytimetcpcli2.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli2 daytimetcpcli2.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcli3.o daytimetcpcli3.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcli3 daytimetcpcli3.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv.o daytimetcpsrv.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv daytimetcpsrv.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv1.o daytimetcpsrv1.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv1 daytimetcpsrv1.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv2.o daytimetcpsrv2.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv2 daytimetcpsrv2.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrv3.o daytimetcpsrv3.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrv3 daytimetcpsrv3.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpcliv6.o daytimetcpcliv6.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpcliv6 daytimetcpcliv6.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o daytimetcpsrvv6.o daytimetcpsrvv6.c
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o daytimetcpsrvv6 daytimetcpsrvv6.o ../libunp.a -lpthread
gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o byteorder.o byteorder.c
byteorder.c: In function ‘main’:
byteorder.c:21:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("sizeof(short) = %d\n", sizeof(short));
^
gcc -I../lib -g -O2 -D_REENTRANT -Wall -o byteorder byteorder.o ../libunp.a -lpthread

成功!


测试一下

ss-Linux intro # ./daytimetcpcli 127.0.0.1
connect error: Connection refused

又出错。。。

继续上搜索引擎
原来是由于某些原因daytime服务并没有启动,可能系统还没有安装这个服务。

 

13.安装xinetd

ss-Linux intro # apt-get install xinetd

具体请百度,不作解释。

 

14.启用daytime服务
打开 /etc/xinetd.d/daytime 有2个文件修改
disable yes 改为 disable no
重启服务

service xinetd restart

 

15.再次测试

ss-Linux intro # ./daytimetcpcli 127.0.0.1
13 AUG 2016 20:39:16 CST

成功!!!

 

12.1.关于单独编译daytimetcpcli.c出错的原因
没有指定需要链接的库。
gcc -l参数是用来指定程序要链接的库,-l紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,容易看出,把库文件名的头lib和尾.so去掉就是库名

解决加入libunp.a库

ss-Linux intro # gcc daytimetcpcli.c -o 获取时间 -lunp
ss-Linux intro # ./获取时间 127.0.0.1
14 AUG 2016 08:20:15 CST

 

 

感想:

1.花费了两天时间终于粗略的把环境搭建好了,想深入学习,深刻感受到基础知识的重要性。没有系统学习过linux,make命令等等,非常吃力。遇到问题,都不知道如何搜索问题,只能把错误信息粘贴到搜索引擎上,盲目的搜索。

2.眼高手低

3.对于帮助文档一定要好好看,不要什么一上来就去搜索引擎上去寻找答案。

4.第二次搭建环境了,第一次乱七八糟弄好也遇到很多问题没解决,这一次基本上都解决了。以后应认真学习努力加油!

 

最后,写的有些仓促,肯定存在一些细节错误或者没写出来,假如你看到了请指出来,有问题一起来讨论。后续我会继续修改文章的。

转载请注明出处。谢谢。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多