【轉】Unix NetWork Programming——環境搭建(解決unp.h等源碼編譯問題)

下面開始用簡單但典型的客戶端和服務器端程序說明如何進行網絡編程。這一小節講的是客戶端,一個用來鏈接並讀取服務器發送來的時間的客戶端。css

這裏涉及到了編寫代碼,所以要html

搭建unix網絡編程環境python

 

unix系統我沒安裝,系統不易得到並且也不必安裝unix。用linux是最佳選擇。再者我原本就是ubuntu系統,因此就在ubuntu下搭建環境了。linux

1,安裝編譯器,爲了齊全仍是安裝一下build-essential編程

  1. sudo apt-get install build-essential  


2,下載本書的頭文件及示例源碼ubuntu

點此下載unpv12e.tar.gz(這個編譯有問題)點此下載unpv13e.tar.gz(這個經itnovice回覆中告訴我已經解決了錯誤,因此最好用這個,能節省不少時間)服務器

(下載unpv13e的話,3中解決問題的地方就能夠略過了)網絡

 

3,解壓unpv12e.tar.gz後進入目錄查看README,而後能夠按照裏面提示操做,不過會遇到問題app

第一步:在終端中進入upnv12e目錄,而後執行代碼:tcp

  1. ./configure  

 

第二步:這裏有問題及解決方法

  1. cd lib  
  1. make  //這一步我出錯了  

 

錯誤代碼爲: 

  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註釋掉就好了. 

註釋掉以後從新 

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

 

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

 

第三步:這一步沒有問題

 

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

 

第四步:這步解決方法麻煩一點

 

  1. cd ../libgai   # the getaddrinfo() and getnameinfo() functions  
  2. make  
錯誤提示以下:
  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目錄: 

 

  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
  1. autoconf  
  2. ./configure  
  1. gedit Make.defines   
在文件末尾加上下面這句:
CFLAGS = -g -O2 -D_REENTRANT -Wall -D_GNU_SOURCE

而後從新執行代碼:

  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方便

  1. gedit lib/unp.h   //將unp.h中#include "../config.h"修改成#include "config.h"  
  1. sudo cp lib/unp.h /usr/include  
  2. sudo cp config.h /usr/include  


6,編譯源代碼

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

 

跟普通的編譯不同的是要在最後加上剛纔那個連接庫,-l參數加上剛纔那個libunp.a去掉lib和後面的.a。最後獲得參數-lunp。

7,編寫程序

之後編寫完的程序安裝6中的代碼編譯就好了,而後代碼能夠徹底跟書上的同樣。代碼編輯器或IDE等就按本身的喜愛來選了。這個網上不少c語言編程環境搭建教程。

我選擇命令行用vi編寫程序,主要爲了鍛鍊一下本身。

相關文章
相關標籤/搜索