zoukankan      html  css  js  c++  java
  • Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)(转载)

    原文地址:http://blog.csdn.net/a649518776/article/details/6724121

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

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

    搭建unix网络编程环境

     

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

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

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


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

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

     

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

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

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

    [python] view plaincopy
    1. ./configure  

     

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

    [python] view plaincopy
    1. cd lib  

     

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

     

    错误代码为:

    [python] view plaincopy
    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] view plaincopy
    1. make //build the basic library that all programs need  

     

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

     

    第三步:这一步没有问题

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

     

    第四步:这步解决方法麻烦一点

    [python] view plaincopy
    1. cd ../libgai   # the getaddrinfo() and getnameinfo() functions  
    2. make  
    错误提示如下:
    [python] view plaincopy
    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] view plaincopy
    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] view plaincopy
    1. autoconf  
    2. ./configure  
    [python] view plaincopy
    1. gedit Make.defines   
    在文件末尾加上下面这句:
    CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE

    然后重新执行代码:

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

    ok,问题解决了!

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

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

     

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

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


    6,编译源代码

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

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

    7,编写程序

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

    我选择命令行用vi编写程序,主要为了锻炼一下自己。

  • 相关阅读:
    从Java角度理解Angular之入门篇:npm, yarn, Angular CLI
    大数据开发实战:Stream SQL实时开发一
    大数据开发实战:Spark Streaming流计算开发
    大数据开发实战:Storm流计算开发
    大数据开发实战:Hadoop数据仓库开发实战
    数据仓库中的拉链表
    java通过jdbc连接impala
    impala-shell常用命令
    Kudu-java数据库简单操作
    拉链表--实现、更新及回滚的具体实现( 转载)
  • 原文地址:https://www.cnblogs.com/NeilHappy/p/2756739.html
Copyright © 2011-2022 走看看