下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程。这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端。
这里涉及到了编写代码,因此要
搭建unix网络编程环境
unix系统我没安装,系统不易获得而且也没必要安装unix。用linux是最佳选择。再者我本来就是ubuntu系统,所以就在ubuntu下搭建环境了。
1,安装编译器,为了齐全还是安装一下build-essential
sudo apt-get install build-essential
2,下载本书的头文件及示例源码
点此下载unpv12e.tar.gz(这个编译有问题)点此下载unpv13e.tar.gz(这个经itnovice回复中告诉我已经解决了错误,所以最好用这个,能节省很多时间)
(下载unpv13e的话,3中解决问题的地方就可以略过了)
3,解压unpv12e.tar.gz后进入目录查看README,然后可以按照里面提示操作,不过会遇到问题
第一步:在终端中进入upnv12e目录,然后执行代码:
./configure
第二步:这里有问题及解决方法
cd lib
make //这一步我出错了
错误代码为:
gcc -g -O2 -D_REENTRANT -Wall -c -o connect_nonb.o connect_nonb.c In file included from connect_nonb.c:1: unp.h:114: error: redefinition of ‘struct in_pktinfo’ make: *** [connect_nonb.o] 错误 1
redefinition of ‘struct in_pktinfo’的解决方法如下:
结构in_pktinfo已经包含在标准头文件bits/in.h中了, 它又通过 netinet/in.h 在unp.h中被包括进来. 只要将 unp.h 中的结构定义comment out注释掉就行了.
注释掉之后重新
make //build the basic library that all programs need
这次就成功了!生成了../libunp.a文件。
第三步:这一步没有问题
cd ../libfree # continue building the basic library make
第四步:这步解决方法麻烦一点
错误提示如下:cd ../libgai # the getaddrinfo() and getnameinfo() functions make
gcc -g -O2 -D_REENTRANT -Wall -c -o getaddrinfo.o getaddrinfo.c getaddrinfo.c: In function ‘getaddrinfo’: getaddrinfo.c:58: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function) getaddrinfo.c:58: error: (Each undeclared identifier is reported only once getaddrinfo.c:58: error: for each function it appears in.) getaddrinfo.c:116: error: ‘EAI_NODATA’ undeclared (first use in this function) make: *** [getaddrinfo.o] 错误 1
解决方法如下:
回到unpv12e目录:
找到下面一行注释掉cd .. gedit configure.in
LIBGAI_OBJS="getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o"
然后用下面的代码代替注释掉的那行
- LIBGAI_OBJS=
- if test "$ac_cv_func_getaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getaddrinfo.o"
- fi
- if test "$ac_cv_func_getnameinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS getnameinfo.o"
- fi
- if test "$ac_cv_func_freeaddrinfo" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS freeaddrinfo.o"
- fi
- if test "$ac_cv_func_gai_strerror" = no ; then
- LIBGAI_OBJS="$LIBGAI_OBJS gai_strerror.o"
- fi
autoconf ./configure
在文件末尾加上下面这句:gedit Make.defines
CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE
然后重新执行代码:
cd libgai # continue building the basic library make
ok,问题解决了!
4,将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中。
cd .. //回到unpv12e目录
sudo cp libunp.a /usr/lib
sudo cp libunp.a /usr/lib64
gedit lib/unp.h //将unp.h中#include "../config.h"修改为#include "config.h"
sudo cp lib/unp.h /usr/include
sudo cp config.h /usr/include
6,编译源代码
cd ./intro
gcc daytimetcpcli.c -o daytimetcpcli -lunp
跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。
7,编写程序
以后编写完的程序安装6中的代码编译就行了,然后代码可以完全跟书上的一样。代码编辑器或IDE等就按自己的喜好来选了。这个网上很多c语言编程环境搭建教程。
我选择命令行用vi编写程序,主要为了锻炼一下自己。