亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

TCP/IP編程實現遠程文件傳輸

2019-11-17 05:02:17
字體:
來源:轉載
供稿:網友
在TCP/ip網絡結構中,為了保證網絡安全,網絡人員往往需要在路由器上添加防火墻,禁止非法用戶用FTP等安全危害較大的TCP/IP協議訪問主機。而有時系統維護人員需要用ftp將一些文件從中心機房主機傳到前端網點主機上,比如應用程序的替換升級。假如每次傳輸文件時都要打開防火墻,未免顯得有些繁瑣,要是在自己的應用程序中增加一個專門的文件傳輸模塊,那將是十分愉快的事情。

  UNIX網絡程序設計一般都采用套接字(socket)系統調用。針對目前十分流行的客戶/服務器模式,其程序編寫步驟如下:
  1.Socket系統調用
  為了進行網絡I/O,服務器和客戶機兩端的UNIX進程要做的第一件事是調用socket()系統調用,建立軟插座,指明合適的通訊協議。格式為:
 ?。nclude >sys/types.h>
 ?。nclude >sys/socket.h>
  int socket(int family,int type,int PRotocol)
  其中:(1)family指明套節字族,其值包括:
  AF_UNIX   (UNIX內部協議族)
  AF_INET   (Iternet協議)
  AF_NS (XeroxNs協議,TCP/IP編程取該值)
  AF_IMPLINK  (IMP鏈接層)
  (2)type 指明套接字類型,取值有:
  SOCK_STREAM     (流套接字)
  SOCK_DGRAM     (數據報套接字)
  SOCK_RAW      (原始套接字)
  SOCK_SEQPACKET   (定序分組套接字)
  一般情況下,前兩個參數的組合就可以決定所使用的協議,這時第三個參數被置為0,假如第一個參數為AF_INET,第二個參數選SOCK_STREAM,則使用的協議為TCP;第二個參數選SOCK_DGRAM,則使用的協議為UDP;當第二個參數選SOCK_RAW時,使用的協議為IP。值得指出的是并不是所有的族和類型的組合都是合法的,具體請查閱相關資料。該系統調用若成功則返回一個類似文件描述符,成為套節字描述字,可以像文件描述符那樣用read和write對其進行I/O操作。當一個進程使用完該軟插座時,需用close(<描述符>)關閉(具體見后面內容)。
  2.服務器端Bind系統調用
  軟插座創建時并沒有與任何地址相關聯,必須用bind()系統調用為其建立地址聯系。其格式為:
  #include <sys/types.h>
  #include <sys/socket.h>
  int bind(int socketfd,strUCt sockaddr_in *localaddr,sizeof(localaddr));
  其中:(1)第一個參數socketfd是前步socket()系統調用返回的套節字描述符。
  (2)第二個參數被捆向本地地址的一種結構,該結構在sys/netinet/in.h中定義:
  struct sockaddr_in{
   short sin_family;/*socket()系統調用的協議族如AF_INET*/
   u_short sin_port;/*網絡字節次序形式的端口號碼*/
   struct in_addr sin_addr;/*網絡字節次序形式的網絡地址*/
   char sin_zero[8];
  }
  一臺機器上的每個網絡程序使用一個各自獨立的端口號碼,例如:telnet程序使用端口號23,而ftp文件傳輸程序使用端口號21。我們在設計應用程序時,端口號碼可以由getservbyname()函數從/etc/services庫文件中獲取,也可以由htons (int portnum)函數將任意正整數轉換為網絡字節次序形式來得到,有些版本的UNIX操作系統則規定1024以下的端口號碼只可被超級用戶使用,普通用戶程序使用的端口號碼只限于1025到32767之間。網絡地址可以由gethostbyname(char*hostname)函數得到(該函數和getservbyname()一樣都以網絡字節次序形式返回所有在他們結構中的數據),參數hostname為/etc/hosts文件中某一網絡地址所對應的機器名。該函數返回一個類型為hostent的結構指針,hostent結構在netdb.h中定義:
  struct hostent{
   char *h_name;
   char **h_aliases;
   int h_addrtype;
   int h_length;  /*地址長度*/
   char **h_addr_list;
   #define h_addr h_addr_list[0];/*地址*/

  }
  (3)第三個參數為第二個結構參數的長度,假如調用成功,bind返回0,否則將返回-1并設置errno。
  3.服務器端系統調用listen,使服務器愿意接受連接
  格式:int listen(int socketfd,int backlong)
  它通常在socket和bind調用后在accept調用前執行。第二個參數指明在等待服務器執行accept調用時系統可以排隊多少個連接要求。此參數常指定為5,也是目前答應的最大值。
  4.服務器調用accept,以等待客戶機調用connect進行連接。格式如下:
  int newsocket=(int socketfd,struct sockaddr_in *peer,int*addrlen);
  該調用取得隊列上的第一個連接請求并建立一個具有與sockfd相同特性的套節字。假如沒有等待的連接請求,此調用阻塞調用者直到一連接請求到達。連接成功后,該調用將用對端的地址結構和地址長度填充參數peer和addlen,假如對客戶端的地址信息不感愛好,這兩個參數用0代替。
  5.客戶端調用connect()與服務器建立連接。格式為:
  connect(int socketfd,struct sockaddr_in *servsddr,int addrlen)
  客戶端取得套接字描述符后,用該調用建立與服務器的連接,參數socketfd為socket()系統調用返回的套節字描述符,第二和第三個參數是指向目的地址的結構及以字節計量的目的地址的長度(這里目的地址應為服務器地址)。調用成功返回0,否則將返回-1并設置errno。
  6.通過軟插座發送數據
  一旦建立連接,就可以用系統調用read和write像普通文件那樣向網絡上發送和接受數據。Read接受三個參數:一個是套節字描述符;一個為數據將被填入的緩沖區,還有一個整數指明要讀的字節數,它返回實際讀入的字節數,出錯時返回-1,碰到文件尾則返回0。Write也接受三個參數:一個是套節字描述符;一個為指向需要發送數據的緩沖區,還有一個整數指明要寫入文件的字節個數,它返回實際寫入的字節數,出錯時返回-1。當然,也可以調用send和recv來對套節字進行讀寫,其調用與基本的read和write系統調用相似,只是多了一個發送方式參數。
  7.退出程序時,應按正常方式關閉套節字。格式如下:
  int close(socketfd)
  前面介紹了UNIX客戶/服務器模式網絡編程的基本思路和步驟。值得指出的是socket編程所涉及的系統調用不屬于基本系統調用范圍,其函數原形在libsocket.a文件中,因此,在用cc命令對原程序進行編譯時需要帶-lsocket選項。
  現在,我們可以針對文章開頭提出的問題著手進行編程了。在圖示的網絡結構中,為使中心機房的服務器能和網點上的客戶機進行通信,需在服務器端添加通過路由器1112到客戶機的路由,兩臺客戶機也必須添加通過路由器2221到服務器的路由。在服務器的/etc/hosts文件中應該包含下面內容:
  1.1.1.1  server
  2.2.2.2  cli1
  2.2.2.3  cli2
  客戶機的/etc/hosts文件中應該有本機地址信息和服務器的地址信息,如cli1客戶機的/etc/hosts文件:
  2.2.2.2  cli1
  1.1.1.1  server
  網絡環境搭建好后,我們可以在服務器端編寫fwq.c程序,負責接受客戶機的連接請求,并將從源文件中讀取的數據發送到客戶機。客戶機程序khj.c向服務器發送連接請求,接收從服務器端發來的數據,并將接收到的數據寫入目標文件。源程序如下:
/*服務器源程序fwq.c*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <sys/netinet/in.h>
#include <netdb.h>
#include <errno.h>
main()
{
  char c,buf[1024],file[30];
  int fromlen,source;
  register int k,s,ns;
  struct sockaddr_in sin;
  struct hostent *hp;
  system(″clear″);
  printf(″
″);
  
  printf(″

輸入要傳輸的文件名:″);
  scanf(″%s″,file);
  if ((source=open(file,O_RDONLY))<0){
   perror(″源文件打開出錯″);
   exit(1);
  }
  printf(″
在傳送文件,稍候…″);
  hp=gethostbyname(″server″);
  if (hp==NULL){
   perror(″返回主機地址信息錯!!!″);
   exit(2);
  }
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s<0){
   perror(″獲取SOCKET號失敗!!!″);
   exit(3);
  }
  sin.sin_family=AF_INET;
  sin.sin_port=htons(1500);/*使用端口1500*/
  bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
  if(bind(s,&sin,sizeof(sin))<0){
   perror(″不能將服務器地址捆綁到SOCKET號上!!!″);
   colse(s);
   exit(4);
  }
  if(listen(s,5)<0{
   perror(″sever:listen″);
   exit(5);
  }
while(1){
  if((ns=accept(s,&sin,&fromlen))<0){
   perror(″sever:accept″);
   exit(6);
  }
  lseek(source,OL,0);/*每次接受客戶機連接,應將用于讀的源文件指針移到文件頭*/

  write(ns,file,sizeof(file)); /*發送文件名*/
  while((k=read(source,buf,sizeof(buf)))>0)
   write(ns,buf,k);
  printf(″

傳輸完畢!!!
″);
  close(ns);
}
  close(source);
  exit(0);
  /*客戶機源程序khj.c*/
 ?。nclude >stdio.h>
  #include >sys/types.h>
 ?。nclude >sys/fcntl.h>
  #include >sys/socket.h>
 ?。nclude >sys/netinet/in.h>
  #include >netdb.h>
 ?。nclude >errno.h>
  #include >string.h>
  main()
  {
   char buf[1024],file[30];
   char *strs=″

正在接收文件″;
   int target;
   register int k,s;
   struct sockaddr_in sin;
   struct hostent *hp;
   system(″clear″);
   printf(″
″);
   
   hp=gethostbyname(″server″);
   if(hp==NULL){
          perror(″返回服務器地址信息錯!!!″);
    exit(1);
   }
   s=socket(AF_INET,SOCK_STREAM,0);
   if(s<0){
    perror(″獲取SOCKET號失敗!!!″);
    exit(2);
   }
   sin.sin_family=AF_INET;
   sin.sin_port=htons(1500);/*端口號需與服務器程序使用的一致*/
   bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
   printf(″

正在與服務器連接…″);
   if(connect(s,&sin,sizeof(sin),0)<0){
    perror(″不能與服務器連接!!!″);
    exit(3);
   }
   while((k=read(s,file,sizeof(file)))<?0/*接收文件名*/
   if((target=open(file,o_WRONLYO_CREATO_TRUNC,0644))<0){
    perror(″不能打開目標文件!!″);
    exit(4);
  }
  strcat(strs,file);
  strcat(strs,″,稍候…″);
  write(1,strs,strlen(strs));
  while((k=read(s,buf,sizeof(buf)))>0)
   write(tatget,buf,k);
  printf(″

接收文件成功!!!
″);
  close(s);
  close(target);
  }
  上述程序在Sco Unix System v3.2及Sco TCP/IP Rumtime環境下調試通過。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛片在线观看| 亚洲爱爱爱爱爱| 日本久久亚洲电影| 国产mv免费观看入口亚洲| 日韩精品999| 国产精品福利在线观看| 欧美视频在线免费| 91av成人在线| 深夜福利91大全| 久久精品视频导航| 国产热re99久久6国产精品| 亚洲一区二区三区xxx视频| 久久久精品亚洲| 日韩美女在线观看| 在线视频免费一区二区| 日韩精品在线免费观看视频| 欧美成人黑人xx视频免费观看| 亚洲成色777777在线观看影院| 国产精品中文字幕在线| 久久久久久久久电影| 国产精品综合久久久| 欧美亚洲国产视频| 欧美激情精品久久久久久久变态| 91精品久久久久久久久| 精品国产91久久久久久老师| 欧美久久精品午夜青青大伊人| 国产成人精品电影| 欧美中文在线观看| 久久免费成人精品视频| 久久久久女教师免费一区| 亚洲最新av在线网站| 69av成年福利视频| 日韩精品中文字幕久久臀| 午夜精品久久久久久久白皮肤| 欧美黑人xxx| 国产99在线|中文| 北条麻妃久久精品| 久久精品人人爽| 亚洲最大福利视频网| 亚洲国产中文字幕久久网| 亚洲精品自拍偷拍| 国产日本欧美一区| 欧美日韩性视频在线| 亚洲免费视频网站| 亚洲男人天堂网| 国模极品一区二区三区| 亚洲免费视频一区二区| 日本人成精品视频在线| 日韩欧美极品在线观看| 国产成人鲁鲁免费视频a| 亚洲欧美在线一区| 日韩av在线影视| 日韩成人黄色av| 亚洲男人天堂2019| 色噜噜狠狠色综合网图区| 狠狠综合久久av一区二区小说| 日本欧美国产在线| 在线电影中文日韩| 欧美疯狂性受xxxxx另类| 91日韩在线播放| 国产综合久久久久久| 国产精品视频999| 97在线精品国自产拍中文| 精品一区二区电影| xxxx欧美18另类的高清| 有码中文亚洲精品| 欧美电影免费观看电视剧大全| 国产精品欧美一区二区三区奶水| 日韩日本欧美亚洲| www.99久久热国产日韩欧美.com| 成人福利网站在线观看11| 亚洲欧美中文日韩v在线观看| 最新中文字幕亚洲| 国产精品视频yy9099| 国产精品直播网红| 欧美日韩国产在线播放| 久久韩剧网电视剧| 国产精品永久免费在线| 精品久久久免费| 国产成人av网址| 欧美在线视频免费| 欧美在线精品免播放器视频| 国产日韩欧美电影在线观看| 欧美日韩国产精品专区| 成人免费网视频| 在线视频免费一区二区| 浅井舞香一区二区| 国产精品久久久久久亚洲调教| 国产女人精品视频| 国产一区二中文字幕在线看| 欧美成人在线免费视频| 亚洲国产精品高清久久久| 久久久亚洲网站| 欧美一级电影免费在线观看| 国产精品一区二区久久久| 国产精品777| 青青草99啪国产免费| 中文字幕av一区二区三区谷原希美| 国产一区二区三区在线| 欧美体内谢she精2性欧美| 国产在线播放91| 国产xxx69麻豆国语对白| 欧美大片大片在线播放| 91九色国产社区在线观看| 欧美男插女视频| 欧美日韩另类视频| 亚洲aaa激情| 日产日韩在线亚洲欧美| 欧美在线视频播放| 在线观看精品自拍私拍| 午夜美女久久久久爽久久| 日韩av资源在线播放| 日韩美女在线看| 91精品视频专区| 精品国内产的精品视频在线观看| 精品国产91乱高清在线观看| 欧美激情精品久久久久久变态| 色婷婷久久一区二区| 欧美激情欧美激情在线五月| 亚洲国产另类 国产精品国产免费| 欧美大秀在线观看| 中文字幕亚洲色图| 一个色综合导航| 国产精品久久久久久久久久久不卡| 久久久国产在线视频| 精品激情国产视频| 在线播放精品一区二区三区| 日韩在线不卡视频| 亚洲精品乱码久久久久久金桔影视| 亚洲精品xxx| 国产亚洲视频在线观看| 久热在线中文字幕色999舞| 日韩视频永久免费观看| 久久国产精品久久久久久久久久| 国产精品欧美在线| 日韩av成人在线观看| 日韩国产高清污视频在线观看| 亚洲欧洲视频在线| 欧美激情精品久久久久久久变态| 91久久精品国产91久久| 欧美日韩成人在线视频| 久久夜精品va视频免费观看| 91久久精品久久国产性色也91| 亚洲一区制服诱惑| 久久久国产精品视频| 精品国产拍在线观看| 国产成人综合精品在线| 亚洲激情在线视频| 欧美亚洲成人网| 91日本视频在线| 欧美成aaa人片在线观看蜜臀| 国产一区二区三区视频免费| 欧美福利视频在线| 亚洲自拍另类欧美丝袜| 国产深夜精品福利| 不卡av电影院| 亚洲成人xxx| 欧美亚洲视频一区二区| 日韩免费在线看| 欧美激情国产日韩精品一区18| 欧美精品手机在线| 亚洲午夜激情免费视频| 欧美电影《睫毛膏》| 亚洲国产精品久久久久秋霞蜜臀|