UNIX网络编程 卷2 源代码使用

1. 下载源码,W. Richard Stevens的主页:http://www.kohala.com/start/

wget http://www.kohala.com/start/unpv22e/unpv22e.tar.gz -P /usr/local/src 

2. 解压

tar xvf /usr/local/src/unpv22e.tar.gz -C /root/bin 

3. 编译库文件

cd /root/bin/unpv22e/  

./configure 

编辑生成config.h文件,注释以下几行

vi config.h  

56 // #define uint8_t unsigned char  

57 // #define uint16_t unsigned short  

58 // #define uint32_t unsigned int  

添加MSG_R和MSG_W定义

vi config.h  

66 // add by jcq  

67 typedef unsigned long ulong_t;  

68 #define MSG_R 0400  

69 #define MSG_W 0200 

添加_GNU_SOURCE定义

vi config.h  

#define _GNU_SOURCE 

修改warpunix.c中的MKtemp函数,使用mkstemp函数替换mktemp函数

cd lib  

181 void  

182 Mktemp(char *template)  

183 {  

184 if (mkstemp(template) == NULL || template[0] == 0)  

185 err_quit("mktemp error");  

186 } 

编译生成libunpipc.a

cd lib  

make

 

将生成的libunpipc.a复制到/usr/lib中。

[root@localhost myunp2]# vim ftok.c
[root@localhost myunp2]# gcc -o ftok ftok.c
/tmp/ccxRydhw.o: In function `main':
ftok.c:(.text+0x18): undefined reference to `err_quit'
ftok.c:(.text+0x30): undefined reference to `Stat'
ftok.c:(.text+0x48): undefined reference to `Ftok'
collect2: 错误:ld 返回 1
[root@localhost myunp2]# gcc -o ftok ftok.c -lunpipc
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_open':
wrapunix.c:(.text+0x4d8): undefined reference to `mq_open'
wrapunix.c:(.text+0x4f0): undefined reference to `mq_open'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_close':
wrapunix.c:(.text+0x52b): undefined reference to `mq_close'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_unlink':
wrapunix.c:(.text+0x55b): undefined reference to `mq_unlink'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_send':
wrapunix.c:(.text+0x5a3): undefined reference to `mq_send'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_receive':
wrapunix.c:(.text+0x5e3): undefined reference to `mq_receive'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_notify':
wrapunix.c:(.text+0x623): undefined reference to `mq_notify'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_getattr':
wrapunix.c:(.text+0x653): undefined reference to `mq_getattr'
/usr/lib/libunpipc.a(wrapunix.o): In function `Mq_setattr':
wrapunix.c:(.text+0x68b): undefined reference to `mq_setattr'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_open':
wrapunix.c:(.text+0x9c8): undefined reference to `sem_open'
wrapunix.c:(.text+0x9e0): undefined reference to `sem_open'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_close':
wrapunix.c:(.text+0xa1b): undefined reference to `sem_close'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_unlink':
wrapunix.c:(.text+0xa4b): undefined reference to `sem_unlink'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_init':
wrapunix.c:(.text+0xa8b): undefined reference to `sem_init'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_destroy':
wrapunix.c:(.text+0xabb): undefined reference to `sem_destroy'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_wait':
wrapunix.c:(.text+0xaeb): undefined reference to `sem_wait'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_trywait':
wrapunix.c:(.text+0xb1c): undefined reference to `sem_trywait'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_post':
wrapunix.c:(.text+0xb5b): undefined reference to `sem_post'
/usr/lib/libunpipc.a(wrapunix.o): In function `Sem_getvalue':
wrapunix.c:(.text+0xb93): undefined reference to `sem_getvalue'
/usr/lib/libunpipc.a(wrapunix.o): In function `Shm_open':
wrapunix.c:(.text+0xccc): undefined reference to `shm_open'
/usr/lib/libunpipc.a(wrapunix.o): In function `Shm_unlink':
wrapunix.c:(.text+0xd0b): undefined reference to `shm_unlink'
collect2: 错误:ld 返回 1
[root@localhost myunp2]# gcc -lrt -o ftok ftok.c -lunpipc
[root@localhost myunp2]# man mq_open
Cannot open the message catalog "man" for locale "zh_CN.UTF-8"
(NLSPATH="/usr/share/locale/%l/LC_MESSAGES/%N")

Formatting page, please wait...

出现上面的错误,使用gcc 加选项-lrt解决。

 

错误:

[root@localhost myunp2]# gcc -lrt -o slot slot.c -lunpipc
slot.c: 在函数‘main’中:
slot.c:8:22: 错误:‘IPC_PRIVATE’未声明(在此函数内第一次使用)
         msqid=Msgget(IPC_PRIVATE,SVMSG_MODE|IPC_CREAT);
                      ^
slot.c:8:22: 附注:每个未声明的标识符在其出现的函数内只报告一次
In file included from slot.c:1:0:
unpipc.h:153:21: 错误:‘MSG_R’未声明(在此函数内第一次使用)
 #define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)
                     ^
slot.c:8:34: 附注:in expansion of macro ‘SVMSG_MODE’
         msqid=Msgget(IPC_PRIVATE,SVMSG_MODE|IPC_CREAT);
                                  ^
unpipc.h:153:29: 错误:‘MSG_W’未声明(在此函数内第一次使用)
 #define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)
                             ^
slot.c:8:34: 附注:in expansion of macro ‘SVMSG_MODE’
         msqid=Msgget(IPC_PRIVATE,SVMSG_MODE|IPC_CREAT);
                                  ^
slot.c:8:45: 错误:‘IPC_CREAT’未声明(在此函数内第一次使用)
         msqid=Msgget(IPC_PRIVATE,SVMSG_MODE|IPC_CREAT);
                                             ^
slot.c:11:22: 错误:‘IPC_RMID’未声明(在此函数内第一次使用)
         Msgctl(msqid,IPC_RMID,NULL);

解决方法:

1.unpv22e里面的Make.defines 
修改 
#CFLAGS = -g -O2 -D_REENTRANT -Wall 
CFLAGS = -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall 

2 将unpv22e中的unpipc.h拷贝到需要编译的代码的目录。

3 将config.h也拷贝到这个目录,由于unpipc.h依赖于这个头文件。

 

时间: 2024-12-03 18:37:34

UNIX网络编程 卷2 源代码使用的相关文章

《UNIX网络编程 卷2:进程间通信(第2版)》——第1章 简介 1.1 概述

第1章 简介 1.1 概述 IPC是进程间通信(interprocess communication)的简称.传统上该术语描述的是运行在某个操作系统之上的不同进程间各种消息传递(message passing)的方式.本书还讲述多种形式的同步(synchronization),因为像共享内存区这样的较新式的通信需要某种形式的同步参与运作. 在Unix操作系统过去30年的演变史中,消息传递历经了如下几个发展阶段. 管道(pipe,第4章)是第一个广泛使用的IPC形式,既可在程序中使用,也可从she

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.6 TCP连接的建立和终止

2.6 TCP连接的建立和终止 为帮助大家理解connect.accept和close这3个函数并使用netstat程序调试TCP应用,我们必须了解TCP连接如何建立和终止,并掌握TCP的状态转换图. 2.6.1 三路握手建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成,我们称之为被动打开(passive open). (2)客户通过调用connect发起主动打开(active open).这导致客户T

《UNIX网络编程 卷1:套接字联网API(第3版)》——导读

**前言**本书面向的读者是那些希望自己编写的程序能使用称为套接字(socket)的API进行彼此通信的人.有些读者可能已经非常熟悉套接字了,因为这个模型几乎已经成了网络编程的同义词,但有些读者可能仍需要从头开始学习.本书想达到的目标是向大家提供网络编程指导.这些内容不仅适用于专业人士,也适用于初学者:不仅适用于维护已有代码,也适用于开发新的网络应用程序:此外,还适用于那些只是想了解一下自己系统中网络组件的工作原理的人. 书中的所有示例都是在Unix系统上测试通过的真实的.可运行的代码.但是,考

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.7 TIME_WAIT状态

2.7 TIME_WAIT状态 毫无疑问,TCP中有关网络编程最不容易理解的是它的TIME_WAIT状态.在图2-4中我们看到执行主动关闭的那端经历了这个状态.该端点停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime,MSL)的两倍,有时候称之为2MSL. 任何TCP实现都必须为MSL选择一个值.RFC 1122[Braden 1989]的建议值是2分钟,不过源自Berkeley的实现传统上改用30秒这个值.这意味着TIME_WAIT状态的持续时间在1分钟

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.3 用户数据报协议(UDP)

2.3 用户数据报协议(UDP) UDP是一个简单的传输层协议,在RFC 768[Postel 1980]中有详细说明.应用进程往一个UDP套接字写入一个消息,该消息随后被封装(encapsulating)到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地.UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次. 我们使用UDP进行网络编程所遇到的问题是它缺乏可靠性.如果一个数据报到达了其最终目的地,但是

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.3 协议无关性

1.3 协议无关性 图1-5中的程序是与IPv4协议相关的:我们分配并初始化一个sockaddr_in类型的结构,把该结构的协议族成员设置为AF_INET,并指定socket函数的第一个参数为AF_INET. 为了让图1-5中的程序能够在IPv6上运行,我们必须修改这段代码.图1-6所示的是一个能够在IPv6上运行的版本,其中改动之处用加粗的等宽字体突出显示. 我们只修改了程序的5行代码,得到的却是另一个与协议相关的程序:这回是与IPv6协议相关的.更好的做法是编写协议无关的程序.图11-11将

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.14 小结

2.14 小结 UDP是一个简单.不可靠.无连接的协议,而TCP是一个复杂.可靠.面向连接的协议.SCTP组合了这两个协议的一些特性,并提供了TCP所不具备的额外特性.尽管绝大多数因特网应用(Web.Telnet.FTP和电子邮件)使用TCP,但这3个协议对传输层都是必要的.在22.4节中我们将阐述选用UDP替代TCP的理由.在23.12节中我们将阐述选用SCTP替代TCP的理由. TCP使用三路握手建立连接,使用四分组交换序列终止连接.当一个TCP连接被建立时,它从CLOSED状态转换到EST

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.12 小结

1.12 小结 图1-5展示了一个尽管简单但却完整的TCP客户程序,它从某个指定的服务器读取当前时间和日期:而图1-9则展示了其服务器程序的一个完整版本.这两个例子引入了许多本书其他部分将要扩展的概念和术语. 我们的客户程序与IPv4协议相关,我们于是把它修改成使用IPv6,但这样做却只是给了我们另外一个协议相关的程序.我们将在第11章中开发一些可用来编写协议无关代码的函数,这在因特网开始使用IPv6后会变得非常重要. 纵贯本书,我们将使用1.4节中介绍的包裹函数来缩短代码,同时又保证测试每个函

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.10 Unix标准

1.10 Unix标准 在编写本书时,最引人注目的Unix标准化活动是由Austin公共标准修订组(The Austin Common Standards Revision Group,CSRG)主持的.他们的努力结果是涵盖1 700多个编程接口的约4 000页内容的规范[Josey 2002].这些规范既具有IEEE POSIX名字,也具有开放团体的技术标准(The Open Group's Technical Standard)名字.其结果是同一个Unix标准有多个名字来指称:ISO/IEC