博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题) (转)
阅读量:5787 次
发布时间:2019-06-18

本文共 2984 字,大约阅读时间需要 9 分钟。

分类:
1234人阅读
(4)

下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程。这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端。

这里涉及到了编写代码,因此要

搭建unix网络编程环境

unix系统我没安装,系统不易获得而且也没必要安装unix。用linux是最佳选择。再者我本来就是ubuntu系统,所以就在ubuntu下搭建环境了。

1,安装编译器,为了齐全还是安装一下build-essential

 

[python]
  1. sudo apt-get install build-essential  

2,下载本书的头文件及示例源码

(这个编译有问题)(这个经itnovice回复中告诉我已经解决了错误,所以最好用这个,能节省很多时间)

(下载unpv13e的话,3中解决问题的地方就可以略过了)

3,解压unpv12e.tar.gz后进入目录查看README,然后可以按照里面提示操作,不过会遇到问题

第一步:在终端中进入upnv12e目录,然后执行代码:

 

[python]
  1. ./configure  

第二步:这里有问题及解决方法

 

[python]
  1. cd lib  

 

[python]
  1. make  //这一步我出错了  

错误代码为:

 

[python]
  1. gcc -g -O2 -D_REENTRANT -Wall   -c -o connect_nonb.o connect_nonb.c  
  2. In file included from connect_nonb.c:1:  
  3. unp.h:114: error: redefinition of ‘struct in_pktinfo’  
  4. make: *** [connect_nonb.o] 错误 1  

redefinition of ‘struct in_pktinfo’的解决方法如下: 

结构in_pktinfo已经包含在标准头文件bits/in.h中了, 它又通过 netinet/in.h 在unp.h中被包括进来. 只要将 unp.h 中的结构定义comment out注释掉就行了. 

注释掉之后重新

 

[python]
  1. make //build the basic library that all programs need  

这次就成功了!生成了../libunp.a文件。

第三步:这一步没有问题

[python]
  1. cd ../libfree  # continue building the basic library  
  2. make  

第四步:这步解决方法麻烦一点
[python]
  1. cd ../libgai   # the getaddrinfo() and getnameinfo() functions  
  2. make  
错误提示如下:
[python]
  1. gcc -g -O2 -D_REENTRANT -Wall   -c -o getaddrinfo.o getaddrinfo.c  
  2. getaddrinfo.c: In function ‘getaddrinfo’:  
  3. getaddrinfo.c:58: error: ‘EAI_ADDRFAMILY’ undeclared (first use in this function)  
  4. getaddrinfo.c:58: error: (Each undeclared identifier is reported only once  
  5. getaddrinfo.c:58: error: for each function it appears in.)  
  6. getaddrinfo.c:116: error: ‘EAI_NODATA’ undeclared (first use in this function)  
  7. make: *** [getaddrinfo.o] 错误 1  

解决方法如下:

 

回到unpv12e目录: 

 

[python]
  1. cd ..  
  2. gedit configure.in   
找到下面一行注释掉
LIBGAI_OBJS="getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o"
然后用下面的代码代替注释掉的那行
  1. LIBGAI_OBJS=
  2. if test "$ac_cv_func_getaddrinfo" = no ; then
  3. LIBGAI_OBJS="$LIBGAI_OBJS getaddrinfo.o"
  4. fi
  5. if test "$ac_cv_func_getnameinfo" = no ; then
  6. LIBGAI_OBJS="$LIBGAI_OBJS getnameinfo.o"
  7. fi
  8. if test "$ac_cv_func_freeaddrinfo" = no ; then
  9. LIBGAI_OBJS="$LIBGAI_OBJS freeaddrinfo.o"
  10. fi
  11. if test "$ac_cv_func_gai_strerror" = no ; then
  12. LIBGAI_OBJS="$LIBGAI_OBJS gai_strerror.o"
  13. fi
[python]
  1. autoconf  
  2. ./configure  
[python]
  1. gedit Make.defines   
在文件末尾加上下面这句:
CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE

然后重新执行代码:

 

[python]
  1. cd libgai  # continue building the basic library  
  2. make  

ok,问题解决了!

4,将生成的libunp.a静态库复制到/usr/lib/和/usr/lib64/中。

 

[html]
  1. cd ..   //回到unpv12e目录  
[html]
  1. sudo cp libunp.a /usr/lib  
  2. sudo cp libunp.a /usr/lib64  

5,修改unp.h并将其和config.h拷贝到/usr/include中,为了以后include方便

[python]
  1. gedit lib/unp.h   //将unp.h中#include "../config.h"修改为#include "config.h"  
[python]
  1. sudo cp lib/unp.h /usr/include  
  2. sudo cp config.h /usr/include  

6,编译源代码

[python]
  1. cd ./intro  
  2. gcc daytimetcpcli.c -o daytimetcpcli -lunp  

 

跟普通的编译不一样的是要在最后加上刚才那个链接库,-l参数加上刚才那个libunp.a去掉lib和后面的.a。最后得到参数-lunp。

7,编写程序

以后编写完的程序安装6中的代码编译就行了,然后代码可以完全跟书上的一样。代码编辑器或IDE等就按自己的喜好来选了。这个网上很多c语言编程环境搭建教程。

我选择命令行用,主要为了锻炼一下自己。

转载于:https://www.cnblogs.com/ljjphysics/archive/2012/04/08/2437790.html

你可能感兴趣的文章
Ubuntu18.04中配置QT5.11开发环境
查看>>
Exception的妙用
查看>>
基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
查看>>
JavaScript(五):变量的作用域
查看>>
知识图谱在互联网金融中的应用
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
wpf 自定义窗口,最大化时覆盖任务栏解决方案
查看>>
【docker】关于docker 中 镜像、容器的关系理解
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>
瓜子二手车的谎言!
查看>>
Python基础:搭建开发环境(1)
查看>>
[转]使用Git Submodule管理子模块
查看>>
DICOM简介
查看>>
Scrum之 Sprint计划会议
查看>>
最小化托盘程序
查看>>
List<T> to DataTable
查看>>
[Java]Socket和ServerSocket学习笔记
查看>>
stupid soso spider
查看>>
[雪峰磁针石博客]数据仓库快速入门教程1简介
查看>>
海康威视:工程项目不是我们的目标,对创新业务发展充满信心 ...
查看>>