青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

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


TCP/IP編程實現遠程文件傳輸
??
????在TCP/IP網絡結構中,為了保證網絡安全,網絡人員往往需要在路由器上添加防火墻,禁止非法用戶用ftp等安全危害較大的TCP/IP協議訪問主機。而有時系統維護人員需要用ftp將一些文件從中心機房主機傳到前端網點主機上,比如應用程序的替換升級。如果每次傳輸文件時都要打開防火墻,未免顯得有些繁瑣,要是在自己的應用程序中增加一個專門的文件傳輸模塊,那將是十分愉快的事情。
?
  UNIX網絡程序設計一般都采用套接字(socket)系統調用。針對目前十分流行的客戶/服務器模式,其程序編寫步驟如下:
  1.Socket系統調用
  為了進行網絡I/O,服務器和客戶機兩端的UNIX進程要做的第一件事是調用socket()系統調用,建立軟插座,指明合適的通訊協議。格式為:
  #include<sys/types.h>
  #include<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(″\n″);?
  ??
  printf(″\n\n\t\t輸入要傳輸的文件名:″);?
  scanf(″%s″,file);?
  
if?((source=open(file,O_RDONLY))<0){?
   perror(″源文件打開出錯″);?
   exit(
1);?
  }
?
  printf(″\n\t\t在傳送文件,稍候…″);?
  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(″\n\n\t\t傳輸完畢
!!!\n″);?
  close(ns);?
}
?
  close(source);?
  exit(
0);?
  
/*客戶機源程序khj.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>?
  #include?
<string.h>?
  main()?
  
{?
   
char?buf[1024],file[30];?
   
char?*strs=″\n\n\t\t正在接收文件″;?
   
int?target;?
   register?
int?k,s;?
   
struct?sockaddr_in?sin;?
   
struct?hostent?*hp;?
   system(″clear″);?
   printf(″\n″);?
   ??
   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(″\n\n\t\t正在與服務器連接…″);?
   
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(″\n\n\t\t接收文件成功
!!!\n″);?
  close(s);?
  close(target);?
  }
?

  上述程序在Sco?Unix?System?v3.2及Sco?TCP/IP?Rumtime環境下調試通過。

posted on 2006-04-20 17:16 楊粼波 閱讀(1343) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜激情综合网| 亚洲人体偷拍| 性感少妇一区| 国精品一区二区| 欧美国产日韩一区| 欧美大片专区| 亚洲综合色在线| 欧美在线亚洲一区| 亚洲精品五月天| 国产精品有限公司| 亚洲精品国产品国语在线app | 激情综合网激情| 亚洲激情自拍| 国产精品欧美日韩一区| 裸体女人亚洲精品一区| 欧美伦理在线观看| 欧美专区日韩专区| 欧美精品三级日韩久久| 欧美一区影院| 欧美精品七区| 老牛嫩草一区二区三区日本| 欧美精品久久久久久久久老牛影院| 午夜精品久久| 欧美激情精品久久久久久变态| 亚洲欧美日韩在线高清直播| 麻豆国产va免费精品高清在线| 亚洲免费在线观看| 欧美va天堂va视频va在线| 亚洲欧美怡红院| 欧美成人午夜激情| 久久久久9999亚洲精品| 欧美日韩麻豆| 欧美国产专区| 国产午夜久久久久| 在线亚洲欧美| 亚洲免费观看高清完整版在线观看| 香蕉av福利精品导航| 亚洲午夜未删减在线观看| 久久躁狠狠躁夜夜爽| 久久国产欧美日韩精品| 国产精品国产三级国产普通话99 | 亚洲欧美视频一区| 99国产一区| 女同性一区二区三区人了人一| 久久精品在这里| 国产精品久久久久久久久久免费看 | 香蕉久久夜色精品国产| 一本色道久久综合亚洲91| 玖玖玖免费嫩草在线影院一区| 久久激五月天综合精品| 国产精品免费观看在线| 宅男噜噜噜66一区二区66| 99精品热视频| 欧美片在线播放| 亚洲国产精品va在线看黑人| 亚洲高清网站| 免费成人av在线看| 欧美韩日一区| 亚洲精品日日夜夜| 欧美国产第一页| 最新日韩精品| 亚洲视频久久| 国产精品国产精品| 亚洲一区二区精品在线| 午夜视频在线观看一区二区| 国产精品男gay被猛男狂揉视频| 亚洲一区二区在线免费观看视频| 午夜精品久久久久久久久久久久| 性欧美超级视频| 国产日韩精品视频一区| 欧美亚洲综合久久| 久久视频精品在线| 亚洲国产欧美日韩精品| 欧美成人有码| 在线视频欧美一区| 欧美中在线观看| 韩国女主播一区| 免费不卡视频| 亚洲午夜电影| 久久色在线播放| 亚洲精品一区二区三区樱花| 欧美日韩在线第一页| 亚洲一区二区免费视频| 久久漫画官网| 日韩视频国产视频| 国产精品综合网站| 久久综合九色九九| 亚洲精品一区二区网址| 久久成人免费| 亚洲精品乱码久久久久久按摩观| 欧美午夜久久| 久久人人97超碰精品888| 亚洲精品久久7777| 久久久精彩视频| 日韩视频在线播放| 国产午夜精品全部视频在线播放| 久热精品视频在线观看一区| 亚洲天堂av在线免费观看| 久久综合中文色婷婷| 在线一区二区日韩| 尤物精品在线| 国产精品一二一区| 欧美国产日韩视频| 久久精品91| 亚洲手机成人高清视频| 欧美成人第一页| 久久成人精品电影| 亚洲一区二区高清| 亚洲精品国产精品国自产观看浪潮| 国产精品美女xx| 欧美久久99| 免费观看日韩| 久久久精品tv| 午夜久久美女| 亚洲视频电影在线| 亚洲精品在线视频| 欧美国产日韩二区| 久久综合婷婷| 久久久www成人免费精品| 亚洲欧美日韩中文视频| 一区二区久久久久| 亚洲欧洲精品一区二区| 激情懂色av一区av二区av| 国产农村妇女毛片精品久久麻豆 | 99国产精品久久久久久久| 在线观看日韩av| 黄色资源网久久资源365| 国产亚洲一区在线| 国产乱子伦一区二区三区国色天香| 欧美三级视频| 欧美日韩在线播放三区| 欧美日韩精品在线| 欧美日本中文字幕| 欧美日韩1区2区3区| 欧美激情视频网站| 欧美精品97| 欧美日韩高清在线一区| 欧美日韩国产综合视频在线观看 | 亚洲丁香婷深爱综合| 狠狠色狠色综合曰曰| 国语自产精品视频在线看8查询8| 国产拍揄自揄精品视频麻豆| 国产精品日韩二区| 国产女人水真多18毛片18精品视频| 国产精品免费网站在线观看| 国产精品美女主播| 国产亚洲精品久久久久动| 国产视频不卡| 亚洲成色777777女色窝| 亚洲日本中文字幕| 一个人看的www久久| 亚洲综合国产| 久久久久高清| 欧美高清在线| 亚洲精品综合| 午夜国产精品视频免费体验区| 欧美一区二区视频在线观看2020| 久久久精品国产一区二区三区 | 在线国产日韩| 99综合精品| 久久成人综合视频| 欧美暴力喷水在线| 日韩视频永久免费观看| 亚洲欧美日韩国产另类专区| 久久久久.com| 欧美色图一区二区三区| 国产亚洲欧美日韩日本| 91久久黄色| 亚洲香蕉伊综合在人在线视看| 欧美影视一区| 亚洲国产日韩欧美| 国产综合亚洲精品一区二| 国产女人18毛片水18精品| 国产性天天综合网| 国产在线视频欧美一区二区三区| 国产午夜亚洲精品羞羞网站 | 久久久噜噜噜久久中文字幕色伊伊 | 欧美一区二区视频97| 免费短视频成人日韩| 91久久久久久久久| 亚洲欧美日韩成人高清在线一区| 蜜桃av综合| 国产嫩草一区二区三区在线观看| 国内成人精品一区| 99精品99| 老司机67194精品线观看| 日韩一级黄色av| 久久躁狠狠躁夜夜爽| 国产免费成人| 亚洲精品国产视频| 欧美一级片久久久久久久| 亚洲成人在线网站| 午夜免费在线观看精品视频| 欧美不卡在线视频| 国产一区二区三区在线观看视频| 99re热这里只有精品视频| 麻豆精品精华液| 性娇小13――14欧美| 国产精品高清在线观看| 一区二区国产日产|