亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bsd socket 簡易入門手冊.htm

?? windows網絡編程技術文章
?? HTM
字號:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>BSD Socket 簡易入門手冊</title></head><body><div align="center">  <center>  <table border="0" width="750" height="243">    <tr>      <td width="673" height="243"><p align="center"><font color="#9879c6"><big><big>BSD Socket 簡易入門手冊</big></big></font></p><p align="right">翻譯:<a href="mailto:rezaie@softhome.net">Wilbur Lang</a></p><h2>目錄</h2><ul>  <li><a href="#Introduction">介紹</a>  <li><a href="#Analogy">類比 (什么是 socket ?)</a>  <li><a href="#Establish">裝上你的新電話(怎樣偵聽?)</a>  <li><a href="#Connect">撥號 (如何調用 socket)</a>  <li><a href="#IO">談話(如何通過 sockets 交談)</a>  <li><a href="#Closing">掛起(結束)</a>  <li><a href="#Byte_order">世界語(交流的語言很重要)</a>  <li><a href="#Summary">未來在你的掌握了(下一步?)</a></ul><p><hr><h2><a name="Introduction">介紹</a></h2><p>當你進入 UNIX 的神秘世界后,立刻會發現越來越多的東西難以理解。對于大多數人來說,BSD socket 的概念就是其中一個。這是一個很短的教程來解釋他們是什么、他們如何工作并給出一些簡單的代碼來解釋如何使用他們。<h2><a name="Analogy">類比 (什么是 socket ?)</a></h2><p><em>socket</em> 是進行程序間通訊(IPC)的 BSD 方法。這意味著 socket 用來讓一個進程和其他的進程互通信息,就象我們用電話來和其他的人交流一樣。<p>用電話來比喻是很恰當的,我們在后面將一直用電話這個概念來描敘 socket 。<h2><a name="Establish">裝上你的新電話(怎樣偵聽?)</a></h2><p>一個人要能夠收到別人打給他的電話,首先他要裝上一門電話。同樣,你必須先建立 socket 以偵聽線路。這個過程包含幾個步驟。首先,你要建立一個新的 socket,就象先裝上電話一樣。<code>socket()</code> 命令就完成這個工作。<p>因為 sockets 有幾種類型,你要注明你要建立什么類型的。你要做一個選擇是 socket 的地址格式。如同電話有音頻和脈沖兩種形式一樣,socket 有兩個最重要的選項是 <strong>AF_UNIX</strong> 和 <strong>IAF_INET</strong>。<strong>AF_UNIX</strong> 就象 UNIX 路徑名一樣識別 sockets。這種形式對于在同一臺機器上的 IPC 很有用。而 <strong>AF_INET</strong> 使用象 192.9.200.10 這樣被點號隔開的四個十進制數字的地址格式。除了機器地址以外,還可以利用端口號來允許每臺機器上的多個 <strong>AF_INET</strong> socket。我們這里將著重于 <strong>AF_INET</strong> 方式,因為他很有用并廣泛使用。<p>另外一個你必須提供的參數是 socket 的類型。兩個重要的類型是 <strong>SOCK_STREAM</strong> 和 <strong>SOCK_DGRAM</strong>。<strong>SOCK_STREAM</strong> 表明數據象字符流一樣通過 socket 。而 <strong>SOCK_DGRAM</strong> 則表明數據將是數據報(<em>datagrams</em>)的形式。我們將講解 <strong>SOCK_STREAM</strong> sockets,他很常見并易于使用。<p>在建立 socket 后,我們就要提供 socket 偵聽的地址了。就象你還要個電話號碼來接電話一樣。<code>bind()</code> 函數來處理這件事情。<p>SOCK_STREAM sockets 讓連接請求形成一個隊列。如果你忙于處理一個連接,別的連接請求將一直等待到該連接處理完畢。<code>listen()</code> 函數用來設置最大不被拒絕的請求數(一般為5個)。一般最好不要使用 <code>listen()</code> 函數。<p>下面的代碼說明如何利用 <code>socket()</code>、<code>bind()</code> 和 <code>listen()</code> 函數建立連接并可以接受數據。<p><listing>/* code to establish a socket; originally from bzs@bu-cs.bu.edu */int establish(unsigned short portnum){ char   myname[MAXHOSTNAME+1];  int    s;  struct sockaddr_in sa;  struct hostent *hp;  memset(&sa, 0, sizeof(struct sockaddr_in)); /* clear our address */  gethostname(myname, MAXHOSTNAME);           /* who are we? */  hp= gethostbyname(myname);                  /* get our address info */  if (hp == NULL)                             /* we don't exist !? */    return(-1);  sa.sin_family= hp->h_addrtype;              /* this is our host address */  sa.sin_port= htons(portnum);                /* this is our port number */  if ((s= socket(AF_INET, SOCK_STREAM, 0)) &lt; 0) /* create socket */    return(-1);  if (bind(s,&sa,sizeof(struct sockaddr_in)) &lt; 0) {    close(s);    return(-1);                               /* bind address to socket */  }  listen(s, 3);                               /* max # of queued connects */  return(s);}</listing><p> 在建立完 socket 后,你要等待對該 socket 的調用了。<code>accept()</code> 函數為此目的而來。調用 <code>accept()</code> 如同在電話鈴響后提起電話一樣。<code>Accept()</code> 返回一個新的連接到調用方的 socket 。<p>下面的代碼演示使用是個演示。<p><listing>/* wait for a connection to occur on a socket created with establish() */int get_connection(int s){ int t;                  /* socket of connection */  if ((t = accept(s,NULL,NULL)) &lt; 0)   /* accept connection if there is one */    return(-1);  return(t);}</listing><p>和電話不同的是,在你處理先前的連接的時候,你還可以接受調用。為此,一般用 fork 來處理每個連接。下面的代碼演示如何使用 <code>establish()</code> 和 <code>get_connection()</code> 來處理多個連接。<p><listing>#include &lt;errno.h&gt;       /* obligatory includes */#include &lt;signal.h&gt;#include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#include &lt;sys/types.h&gt;#include &lt;sys/socket.h&gt;#include &lt;sys/wait.h&gt;#include &lt;netinet/in.h&gt;#include &lt;netdb.h&gt;#define PORTNUM 50000 /* random port number, we need something */void fireman(void);void do_something(int);main(){ int s, t;  if ((s= establish(PORTNUM)) &lt; 0) {  /* plug in the phone */    perror("establish");    exit(1);  }  signal(SIGCHLD, fireman);           /* this eliminates zombies */  for (;;) {                          /* loop for phone calls */    if ((t= get_connection(s)) &lt; 0) { /* get a connection */      if (errno == EINTR)             /* EINTR might happen on accept(), */        continue;                     /* try again */      perror("accept");               /* bad */      exit(1);    }    switch(fork()) {                  /* try to handle connection */    case -1 :                         /* bad news.  scream and die */      perror("fork");      close(s);      close(t);      exit(1);    case 0 :                          /* we're the child, do something */      close(s);      do_something(t);      exit(0);    default :                         /* we're the parent so look for */      close(t);                       /* another connection */      continue;    }  }}/* as children die we should get catch their returns or else we get * zombies, A Bad Thing.  fireman() catches falling children. */void fireman(void){  while (waitpid(-1, NULL, WNOHANG) &gt; 0)    ;}/* this is the function that plays with the socket.  it will be called * after getting a connection. */void do_something(int s){  /* do your thing with the socket here      :      :   */}</listing><h2><a name="Connect">撥號 (如何調用 socket)</a></h2><p>現在你應該知道如何建立  socket 來接受調用了。那么如何調用呢?和電話一樣,你要先有個電話。用 <code>socket()</code> 函數來完成這件事情,就象建立偵聽的 socket 一樣。<p>在給 socket 地址后,你可以用 <code>connect()</code> 函數來連接偵聽的 socket 了。下面是一段代碼。<p><listing>int call_socket(char *hostname, unsigned short portnum){ struct sockaddr_in sa;  struct hostent     *hp;  int a, s;  if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host's */    errno= ECONNREFUSED;                       /* address? */    return(-1);                                /* no */  }  memset(&sa,0,sizeof(sa));  memcpy((char *)&sa.sin_addr,hp->h_addr,hp->h_length); /* set address */  sa.sin_family= hp->h_addrtype;  sa.sin_port= htons((u_short)portnum);  if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) &lt; 0)   /* get socket */    return(-1);  if (connect(s,&sa,sizeof sa) &lt; 0) {                  /* connect */    close(s);    return(-1);  }  return(s);}</listing><p>這個函數返回一個可以流過數據的 socket 。<h2><a name="IO">談話(如何通過 sockets 交談)</a></h2><p>好了,你在要傳輸數據的雙方建立連接了,現在該傳輸數據了。<code>read()</code> 和 <code>write()</code> 函數來處理吧。除了在 socket 讀寫和文件讀寫中的一個區別外,和處理一般的文件一樣。區別是你一般不能得到你所要的數目的數據。所以你要一直循環到你需要的數據的到來。一個簡單的例子:將一定的數據讀到緩存。<p><listing>int read_data(int s,     /* connected socket */              char *buf, /* pointer to the buffer */              int n      /* number of characters (bytes) we want */             ){ int bcount; /* counts bytes read */  int br;     /* bytes read this pass */  bcount= 0;  br= 0;  while (bcount &lt; n) {             /* loop until full buffer */    if ((br= read(s,buf,n-bcount)) &gt; 0) {      bcount += br;                /* increment byte counter */      buf += br;                   /* move buffer ptr for next read */    }    else if (br &lt; 0)               /* signal an error to the caller */      return(-1);  }  return(bcount);}</listing><p>相同的函數也可以寫數據,留給我們的讀者吧。<h2><a name="Closing">掛起(結束)</a></h2><p>和你通過電話和某人交談后一樣,你要在 socket 間關閉連接。一般 <code>close()</code> 函數用來關閉每邊的 socket 連接。如果一邊的已經關閉,而另外一邊卻在向他寫數據,則返回一個錯誤代碼。<h2><a name="Byte_order">世界語(交流的語言很重要)</a></h2><p>現在你可以在機器間聯絡了,可是要小心你所說的話。許多機器有自己的方言,如 ASCII 和 EBCDIC。更常見的問題是字節順序問題。除非你一直傳輸的都是文本,否則你一定要注意這個問題。幸運的是,人們找出了解決的辦法。<p>在很久以前,人們爭論哪種順序更“正確”?,F在必要時有相應的函數來轉換。其中有 <code>htons()</code>、<code>ntohs()</code>、<code>htonl()</code> 和 <code>ntohl()</code>。在傳輸一個整型數據前,先轉換一下。<p><listing>i= htonl(i);write_data(s, &i, sizeof(i));</listing><p>在讀數據后,再變回來。<p><listing>read_data(s, &i, sizeof(i));i= ntohl(i);</listing><p>如果你一直堅持這個習慣,你將比別人少出錯的機會。<h2><a name="Summary">未來在你的掌握了(下一步?)</a></h2><p>就用我們剛才討論的東西,你就可以寫自己的通訊程序了。和對待所有的新生事物一樣, 最好還是看看別人已經做了些什么。這里有許多關于 BSD socket 的東西可以參考。<p>請注意,例子中沒有錯誤檢查,這在“真實”的程序中是很重要的。你應該對此充分重視。<p align="center">&nbsp;</p>        <p> </td>    </tr>  </table>  </center></div></body></html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品沙发午睡系列990531| 欧美一区二区高清| 亚洲一区二区在线播放相泽 | 国产精品夜夜爽| 青青国产91久久久久久| 亚洲第一成年网| 亚洲一区二区三区视频在线播放| 精品一区二区影视| 久久99日本精品| 国产一二精品视频| 国产激情91久久精品导航| 国产成人精品免费网站| 欧美日本国产视频| 日韩精品一区二区在线观看| 欧美成人一区二区三区在线观看| 精品少妇一区二区三区视频免付费 | 久久成人免费网| 欧美亚洲尤物久久| 欧美美女一区二区三区| 欧美一级日韩免费不卡| 亚洲综合免费观看高清在线观看| 国产+成+人+亚洲欧洲自线| 国产成人啪午夜精品网站男同| 欧美福利视频导航| 亚洲a一区二区| 在线观看不卡一区| 精品理论电影在线观看| 日韩国产欧美视频| 成人一区二区视频| 91极品视觉盛宴| 欧美色综合网站| 亚洲精品大片www| 老司机精品视频导航| 欧美一区二区视频网站| 午夜久久久影院| 国产成人综合自拍| 久久精品欧美一区二区三区不卡| 中文字幕视频一区二区三区久| 亚洲一区二区五区| 欧美视频一区二| 亚洲成人激情av| 欧美一区二区三区视频免费播放 | 国产欧美日本一区二区三区| 一区二区三区成人| 国产麻豆一精品一av一免费| 精品国产乱码久久久久久久| 亚洲美女在线一区| 国产乱码精品一区二区三区忘忧草 | 最新日韩av在线| 成人午夜电影小说| 欧美激情艳妇裸体舞| 樱花影视一区二区| 在线欧美小视频| 亚洲一二三四久久| 久久国产精品72免费观看| 精品福利二区三区| 成人一区二区三区中文字幕| 亚洲精品ww久久久久久p站| 欧美系列日韩一区| 麻豆视频观看网址久久| 欧美午夜精品久久久| 天堂一区二区在线| 色香色香欲天天天影视综合网| www国产亚洲精品久久麻豆| 日韩和的一区二区| 国产午夜精品在线观看| 一本到三区不卡视频| 日韩激情视频网站| 国产精品素人一区二区| 欧美日韩国产一二三| 国产精品一区二区久激情瑜伽| 亚洲色图制服丝袜| 99国产精品国产精品毛片| 久久久久国产精品麻豆| 久久99精品网久久| 亚洲欧美欧美一区二区三区| 日韩视频在线一区二区| 免费在线成人网| 亚洲欧美在线高清| 精品国产91亚洲一区二区三区婷婷| av一二三不卡影片| 亚洲猫色日本管| 精品国产乱码久久久久久图片 | 中文成人综合网| 欧美精品在线一区二区| 成人h精品动漫一区二区三区| 国产区在线观看成人精品| 色av综合在线| 国产成+人+日韩+欧美+亚洲 | 中文字幕视频一区| 欧美第一区第二区| 欧美军同video69gay| av电影在线观看完整版一区二区| 美脚の诱脚舐め脚责91| 亚洲一区二区欧美日韩 | 亚洲综合色丁香婷婷六月图片| 精品国产乱码久久久久久闺蜜| 欧美性大战久久久久久久蜜臀| 不卡的av在线播放| 国产传媒欧美日韩成人| 精品一区二区三区免费播放| 亚洲成人动漫av| 亚洲美女少妇撒尿| 中文字幕一区二区三区色视频| 亚洲精品在线观| 日韩免费高清av| 久久99国产精品尤物| 日韩精品自拍偷拍| 欧美色中文字幕| 99r精品视频| gogogo免费视频观看亚洲一| 激情国产一区二区| 欧美白人最猛性xxxxx69交| 欧美性感一区二区三区| 在线观看网站黄不卡| 91丝袜国产在线播放| 天堂一区二区在线免费观看| 亚洲电影在线播放| 亚洲一卡二卡三卡四卡| 亚洲在线免费播放| 亚洲成人在线网站| 日韩中文欧美在线| 蜜臀精品一区二区三区在线观看 | 亚洲一区二区av电影| 亚洲欧美日韩国产综合| 久久久综合九色合综国产精品| 欧美日韩国产精品自在自线| 欧美亚洲一区二区在线观看| 欧美图片一区二区三区| 欧美视频一区二区三区四区| 欧美精品aⅴ在线视频| 91精品国产黑色紧身裤美女| 欧美成人精精品一区二区频| 精品va天堂亚洲国产| 国产网红主播福利一区二区| 国产精品私房写真福利视频| 日韩美女视频一区二区| 亚洲国产va精品久久久不卡综合| 首页亚洲欧美制服丝腿| 精品午夜一区二区三区在线观看| 国产一区二区不卡在线| hitomi一区二区三区精品| 欧美日韩在线播| 国产91精品露脸国语对白| 99vv1com这只有精品| 欧美色男人天堂| 精品国产百合女同互慰| 亚洲欧美在线aaa| 日韩av午夜在线观看| 国产成人精品免费网站| 欧美色涩在线第一页| 国产亚洲成年网址在线观看| av电影天堂一区二区在线观看| 欧美日韩精品一区二区三区四区| 欧美日韩国产a| 2021久久国产精品不只是精品| 国产欧美日本一区二区三区| 夜夜嗨av一区二区三区中文字幕| 久久66热re国产| 色综合中文字幕国产 | 国产乱淫av一区二区三区 | 在线观看视频一区二区欧美日韩| 欧美一卡二卡在线观看| 国产精品理伦片| 国产精品沙发午睡系列990531| 亚洲综合男人的天堂| 国产高清精品网站| 欧美精品久久天天躁| 国产精品久久久一本精品| 婷婷久久综合九色综合伊人色| 成人高清伦理免费影院在线观看| 国产精品天美传媒| 免费成人性网站| 一本久久a久久免费精品不卡| 欧美精品一区二区三| 亚洲福利视频一区二区| 99热这里都是精品| 2023国产精品自拍| 日本三级亚洲精品| 欧美午夜精品久久久久久孕妇| 国产精品毛片高清在线完整版| 久久国产三级精品| 欧美日韩国产一区| 亚洲综合区在线| 色婷婷av久久久久久久| 日本一区二区三级电影在线观看| 日韩不卡在线观看日韩不卡视频| 色哟哟一区二区三区| 国产亚洲综合在线| 美腿丝袜亚洲三区| 欧美夫妻性生活| 亚洲成人综合视频| 色丁香久综合在线久综合在线观看| 国产精品私房写真福利视频| 国产成人综合视频| 久久亚洲一区二区三区明星换脸| 日韩国产欧美视频| 欧美久久一区二区| 首页综合国产亚洲丝袜| 欧美精品aⅴ在线视频|