国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

內核技術:TCP/IP編程實現遠程文件傳輸
2006-06-16   chinaunix

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

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

  UNIX網絡程序設計一般都采用套接字(socket)系統調用。針對目前十分流行的客戶/服務器模式,其程序編寫步驟如下:

  1.Socket系統調用

  為了進行網絡I/O,服務器和客戶機兩端的UNIX進程要做的第一件事是調用socket()系統調用,建立軟插座,指明合適的通訊協議。格式為:

  #include;

  #include;

  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;

  #include;

  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;

#include;

#include;

#include;

#include;

#include;

#include;

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*/

  #include;

  #include;

  #include;

  #include;

  #include;

  #include;

  #include;

  #include ;

  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_WRONLY|O_CREAT|O_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環境下調試通過。

熱詞搜索:

上一篇:統一平臺 軟交換如何加速VoIP的發展
下一篇:專家稱VoIP成為黑客攻擊獲利的目標

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
日本美女一区二区三区| 麻豆免费看一区二区三区| 欧美一区二区在线看| 国产成人精品亚洲日本在线桃色| 亚洲免费观看高清完整版在线观看熊| 欧美浪妇xxxx高跟鞋交| 国产激情视频一区二区三区欧美| 伊人性伊人情综合网| 精品粉嫩aⅴ一区二区三区四区| av激情成人网| 韩国精品免费视频| 午夜成人免费电影| 综合电影一区二区三区 | 日韩高清在线不卡| 中文一区二区在线观看| 日韩欧美在线一区二区三区| 99久久99久久精品免费看蜜桃| 极品少妇一区二区| 亚洲国产一二三| 亚洲欧美日韩国产一区二区三区| 久久亚洲二区三区| 日韩午夜av一区| 欧美人与z0zoxxxx视频| 日本高清不卡一区| 91在线观看污| 高清国产午夜精品久久久久久| 麻豆精品视频在线观看| 日韩av一区二| 午夜欧美视频在线观看| 亚洲午夜日本在线观看| 亚洲精品久久嫩草网站秘色| 中文字幕欧美一| 国产精品久久久久久户外露出| 国产欧美一区二区精品忘忧草| 欧美电视剧在线看免费| 欧美岛国在线观看| 精品日韩在线一区| 久久久精品免费网站| 91精品久久久久久蜜臀| 欧美美女黄视频| 91精品欧美综合在线观看最新| 欧美日韩国产综合一区二区 | 97久久精品人人做人人爽| 国产精品资源在线看| 国产又粗又猛又爽又黄91精品| 捆绑变态av一区二区三区| 男人的天堂亚洲一区| 蜜臀av一区二区在线观看| 免费高清不卡av| 国产一区二区在线观看免费| 狠狠色丁香久久婷婷综合丁香| 另类的小说在线视频另类成人小视频在线 | 成人av电影观看| 成人精品一区二区三区中文字幕| 久草在线在线精品观看| 国产激情视频一区二区三区欧美| 国产成人精品一区二区三区四区 | 在线观看一区二区精品视频| 日本韩国精品在线| 欧美日韩一二三区| 日韩精品一区在线观看| 2020国产成人综合网| 欧美激情在线一区二区三区| 国产精品视频观看| 亚洲一线二线三线视频| 免费观看在线综合| 国产白丝精品91爽爽久久| 成人黄色在线看| 色av综合在线| 欧美一二三区在线| 国产亚洲自拍一区| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲欧美日韩国产一区二区三区| 一二三区精品福利视频| 日韩成人av影视| 国产曰批免费观看久久久| 99精品国产91久久久久久| 欧美午夜精品理论片a级按摩| 91精品久久久久久蜜臀| 欧美激情中文字幕一区二区| 亚洲一区在线观看免费 | 在线亚洲精品福利网址导航| 3d成人h动漫网站入口| 国产无人区一区二区三区| 亚洲精品日韩综合观看成人91| 喷水一区二区三区| 成人av资源在线观看| 欧美日韩夫妻久久| 中文字幕二三区不卡| 亚洲图片欧美色图| 国产不卡视频一区| 欧美一区二区在线看| 综合激情成人伊人| av不卡一区二区三区| 欧美大片在线观看一区| 亚洲精品中文字幕在线观看| 精品一区二区免费看| 欧洲在线/亚洲| 国产日韩亚洲欧美综合| 日韩av一二三| 色婷婷综合久色| 国产日韩一级二级三级| 日韩电影在线一区二区| jizz一区二区| 久久众筹精品私拍模特| 亚洲高清在线精品| 99久久精品国产网站| 久久亚洲春色中文字幕久久久| 午夜视频一区在线观看| 色综合久久九月婷婷色综合| 久久午夜色播影院免费高清| 日韩电影在线观看一区| 91久久精品网| 国产精品伦理在线| 国产高清亚洲一区| 精品91自产拍在线观看一区| 亚洲高清免费观看高清完整版在线观看| 综合久久综合久久| 国产激情视频一区二区三区欧美 | 日本免费在线视频不卡一不卡二| 成人av在线观| 久久精品欧美一区二区三区不卡 | 久久综合五月天婷婷伊人| 亚洲成av人**亚洲成av**| 国产不卡视频在线播放| 精品国产免费人成电影在线观看四季| 亚洲国产精品一区二区www在线| aaa亚洲精品| 中文字幕欧美一区| 97精品久久久午夜一区二区三区| 国产亚洲欧美激情| 国产精品综合二区| 精品国一区二区三区| 久久超碰97人人做人人爱| 欧美一区二区三区日韩视频| 视频一区二区中文字幕| 欧美群妇大交群的观看方式| 亚洲二区在线观看| 911精品国产一区二区在线| 亚洲一区在线观看免费观看电影高清| 一本久道久久综合中文字幕 | 欧美日韩一本到| 五月综合激情日本mⅴ| 欧美日韩aaa| 另类中文字幕网| 久久午夜色播影院免费高清| 国产精品一区二区x88av| 久久久久久久久伊人| 成人激情av网| 一区二区三国产精华液| 欧美午夜片在线观看| 成人视屏免费看| 国产精品三级视频| 色视频一区二区| 日韩精品三区四区| 精品sm在线观看| 国产剧情一区二区| 亚洲欧美日韩国产综合在线| 91行情网站电视在线观看高清版| 亚洲自拍欧美精品| 欧美一区二区成人6969| 国产伦精品一区二区三区免费 | 在线播放欧美女士性生活| 久久99国产精品成人| 中文字幕久久午夜不卡| 91黄色免费看| 麻豆成人av在线| 中文字幕在线免费不卡| 欧美午夜视频网站| 国产伦理精品不卡| 亚洲一区二区av电影| 欧美videos中文字幕| 97精品电影院| 日韩av网站免费在线| 久久久国产综合精品女国产盗摄| 菠萝蜜视频在线观看一区| 亚洲国产日韩综合久久精品| 亚洲精品一区二区在线观看| 99麻豆久久久国产精品免费| 日本不卡高清视频| 最新中文字幕一区二区三区| 在线播放91灌醉迷j高跟美女| 国产乱码精品一区二区三区av | 久久久久久久免费视频了| 色综合久久九月婷婷色综合| 精品亚洲国内自在自线福利| 18成人在线观看| 精品欧美乱码久久久久久1区2区| 色综合天天综合在线视频| 久久精品国产久精国产爱| 亚洲乱码精品一二三四区日韩在线| 日韩欧美国产一二三区| 91免费看片在线观看| 国产一区二区精品在线观看| 亚洲成人精品一区二区| 久久九九久久九九| 制服丝袜亚洲网站| 一本色道久久综合精品竹菊| 国产精品一品视频| 日本女优在线视频一区二区|