Unix网络编程第一卷(第三版) 第一个程序运行成功
2014-07-23 10:14
357 查看
最近开始看unpv1了,可是在第一个程序的运行上出现了不少问题,但是终究还是解决了,在此记录一下,以方便日后查找!
首先,到http://www.unpbook.com/src.html,下载源代码unpv13e.tar.gz,然后 解压缩。在进入解压后的文件中,有一个README 文件,具体内容见附录。
第一步 ./configure没问题
第二步 cd lib; make 有没问题
第三步 cd ../libfree make 有问题,具体时修改了inet_ntop.c第61行 size_t size ->改成 socklen_t size,参考:http://www.myexception.cn/program/921531.html
其实,就运行第一个程序而言,这几步也够了,之后我们把libunp.a和unp.h 以及config.h拷贝到当前文件所在目录,然后把unp.h中的../config.h修改未config.h即可。
cp libunp.a ../unp/
cp lib/unp.h ../unp/
cp libunp.a ../unp/
另外,其实第一个程序事实上有两个程序的,书上的第一程序,其实时客户端程序,而书上第12页那个程序时服务器程序,先把服务器程序编译,然后运行(sudo ./srv),
接着把客户程序编译,然后运行即可。参考:http://blog.csdn.net/zxremail/article/details/4858714
客户程序:
服务器程序:
附录
首先,到http://www.unpbook.com/src.html,下载源代码unpv13e.tar.gz,然后 解压缩。在进入解压后的文件中,有一个README 文件,具体内容见附录。
第一步 ./configure没问题
第二步 cd lib; make 有没问题
第三步 cd ../libfree make 有问题,具体时修改了inet_ntop.c第61行 size_t size ->改成 socklen_t size,参考:http://www.myexception.cn/program/921531.html
其实,就运行第一个程序而言,这几步也够了,之后我们把libunp.a和unp.h 以及config.h拷贝到当前文件所在目录,然后把unp.h中的../config.h修改未config.h即可。
cp libunp.a ../unp/
cp lib/unp.h ../unp/
cp libunp.a ../unp/
另外,其实第一个程序事实上有两个程序的,书上的第一程序,其实时客户端程序,而书上第12页那个程序时服务器程序,先把服务器程序编译,然后运行(sudo ./srv),
接着把客户程序编译,然后运行即可。参考:http://blog.csdn.net/zxremail/article/details/4858714
客户程序:
#include "unp.h" int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if (argc != 2) err_quit("usage: a.out <IPaddress> "); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_sys("socket error"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port = htons(13); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", argv[1]); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) <0) err_sys("connect error"); while ((n = read(sockfd, recvline, MAXLINE)) > 0) { recvline = 0; /* null terminate */ if (fputs(recvline, stdout) == EOF) err_sys("fputs error"); } if (n <0) err_sys("read error"); exit(0); }
服务器程序:
#include "unp.h" #include <time.h> int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; 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(13); Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); for (;;) { connfd = Accept(listenfd, (SA *) NULL, NULL); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); Write(connfd, buff, strlen(buff)); Close(connfd); } }
附录
QUICK AND DIRTY =============== Execute the following from the src/ directory: ./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 If all that works, you're all set to start compiling individual programs. Notice that all the source code assumes tabs every 4 columns, not 8. MORE DETAILS ============ 5. If you need to make any changes to the "unp.h" header, notice that it is a hard link in each directory, so you only need to change it once. 6. Go into the "lib/" directory and type "make". This builds the library "libunp.a" that is required by almost all of the programs. There may be compiler warnings (see NOTES below). This step is where you'll find all of your system's dependencies, and you must just update your cf/ files from step 1, rerun "config" and do this step again. 6. Go into the "libfree/" directory and type "make". This adds to the "libunp.a" library. The files in this directory do not #include the "unp.h" header, as people may want to use these functions independent of the book's examples. 8. Once the library is made from steps 5 and 6, you can then go into any of the source code directories and make whatever program you are interested in. Note that the horizontal rules at the beginning and end of each program listing in the book contain the directory name and filename. BEWARE: Not all programs in each directory will compile on all systems (e.g., the file src/advio/recvfromflags.c will not compile unless your system supports the IP_RECVDSTADDR socket option). Also, not all files in each directory are included in the book. Beware of any files with "test" in the filename: they are probably a quick test program that I wrote to check something, and may or may not work. NOTES ----- - Many systems do not have correct function prototypes for the socket functions, and this can cause many warnings during compilation. For example, Solaris 2.5 omits the "const" from the 2nd argument to connect(). Lots of systems use "int" for the length of socket address structures, while Posix.1g specifies "size_t". Lots of systems still have the pointer argument to [sg]etsockopt() as a "char *" instead of a "void *", and this also causes warnings. - SunOS 4.1.x: If you are using Sun's acc compiler, you need to run the configure program as CC=acc CFLAGS=-w CPPFLAGS=-w ./configure Failure to do this results in numerous system headers (<sys/sockio.h>) not being found during configuration, causing compile errors later. - If your system supports IPv6 and you want to run the examples in the book using hostnames, you must install the latest BIND release. You can get it from ftp://ftp.vix.com/pub/bind/release. All you need from this release is a resolver library that you should then add to the LDLIBS and LDLIBS_THREADS lines. - IPv6 support is still in its infancy. There may be differences between the IPv6 sockets API specifications and what the vendor provides. This may require hand tweaking, but should get better over time. - If your system supports an older draft of the Posix pthreads standard, but configure detects the support of pthreads, you will have to disable this by hand. Digital Unix V3.2C has this problem, for example, as it supports draft 4, not the final draft. To fix this, remove wrappthread.o from LIB_OBJS in "Make.defines" and don't try to build and run any of the threads programs. COMMON DIFFERENCES ------------------ These are the common differences that I see in various headers that are not "yet" at the level of Posix.1g or X/Open XNS Issue 5. - getsockopt() and setsockopt(): 5th argument is not correct type. - t_bind(): second argument is missing "const". - t_connect(): second argument is missing "const". - t_open(): first argument is missing "const". - t_optmsmg(): second argument is missing "const". - If your <xti.h> defines the members of the t_opthdr{} as longs, instead of t_uscalar_t, some of the printf formats of these value might generate warnings from your compiler, since you are printing a long without a corresponding long format specifier.
相关文章推荐
- 第一个小程序在开发板上运行成功he…
- 今天终于将第一个 Android NDK 程序编译、运行成功
- Ubuntu下第一个C程序的成功运行
- 我成功运行的第一个Socket程序
- 今天终于将第一个 Android NDK 程序编译、运行成功
- 本人第一个能成功运行的hibernate程序
- 《疯狂Java讲义(第三版)》学习笔记之 —— 1.3 Java运行机制 && 1.5 第一个Java程序
- Android NDK-r5 成功运行编译运行第一个NDK程序
- Ubuntu下编译第一个C程序的成功运行
- 终于运行成功tensorflow-mnist-tutorial的第一个程序mnist_1.0_softmax.py!
- 我在altera15下的第一个基于qsys的 nios2程序运行成功了
- 其实并不了解:从0到第一个C程序的成功运行的笔记
- UNIX环境高级编程第二版第一个程序运行成功
- 正在学习 android 开发,开发环境已搭建完毕,第一个测试程序已在模拟器上运行成功。
- 解决unix网络编程(第三版)第一个程序connect dennied.问题&Open 'daytiime' service
- 初试 Symbian 编程(二)——运行你的第一个sis程序
- 运行第一个flex程序(2)
- 第一个可以运行HLSL的DirectX程序
- GTK学习第一步: Windows环境下运行第一个GTK程序
- Skyeye模拟uClinux上运行的第一个程序:Hello World