安装好FreeBSD,继续编译剩下的代码。
1、链接
http://www.kohala.com/start/tcpipiv1.tar.Z
2、解压缩
3、makefile需要修改
# Following line for SVR4, Solaris 2.x
#LIBS = /usr/ucblib/libucb.a -lsocket -lnsl 注释掉
# Following line for 4.4BSD, BSD/386, SunOS 4.x, AIX 3.2.2
LIBS = #取消注释
4、sock下的strerror.c文件需要修改
extern char *sys_errlist[];
extern int sys_nerr;
改为
extern const char * const sys_errlist[];
extern const int sys_nerr;
然后就可以编译了。
Openindiana
makefile需要修改
# Following line for SVR4, Solaris 2.x
#LIBS = /usr/ucblib/libucb.a -lsocket -lnsl 注释掉
# Following line for 4.4BSD, BSD/386, SunOS 4.x, AIX 3.2.2
LIBS = -lsocket -lnsl
但是socket文件夹下会有问题,提示:
error: structure has no member named `msg_control'
error: structure has no member named `msg_controllen'
error: structure has no member named `msg_flags'
原因如下:
4.3BSD
不幸,对于4.3BSD以及在其基础上构造的SunOS和Ultrix,以及从4.3BSD Reno开始的后续版本我们必须提供不同的实现。为了交换文件描述符,调用sendmsg(2)和recvmsg(2)函数。这两个函数的参数中都有一个指向msghdr的指针,该结构包含了所有关于要发送和接收消息的信息。该结构定义在<sys/socket.h> 头文件中,在BSD4.3之下,其样式是:
strcut msghdr {
caddr_t msg_name; 可选的地址
int msg_namelen; 地址长度
struct iovec msg_iov; 散布/聚集数组
int msg_iovlen; 在msg_iov数组中的元素数
caddr_t msg_accrights; 存取权发送/接收到
int msg_accrightslen; 存取权缓存的长度
}
从4.3BSD Reno开始,更改了msghdr结构的定义。在以前版本中被称之为"存取权" 的最后两个元素改称为"辅助数据"。另外,在该结构结束处增加了一个新成员msg_flags。
strcut msghdr {
caddr_t msg_name; 可选的地址
int msg_namelen; 地址长度
struct iovec msg_iov; 散布/聚集数组
int msg_iovlen; 在msg_iov数组中的元素数
caddr_t msg_control; 辅助数据
int msg-controllen; 辅助数据的长度
int msg_flags; 接收到消息的标志
}
在CFLAGS一行加上
-D_XOPEN_SOURCE=500 -D__EXTENSIONS__