成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iPhone開發(fā)中BSD Socket輕松學(xué)習(xí)教程

移動(dòng)開發(fā) iOS
iPhone開發(fā)中BSD Socket輕松學(xué)習(xí)是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)iphone開發(fā)中線程的學(xué)習(xí)。在進(jìn)行iphone開發(fā)通訊程序中,不可避免的要利用socket通訊,除了iPhone自帶的CFSocket類接口之外,我們還可以基于BSD Socket來進(jìn)行通訊程式的開發(fā)。

iPhone開發(fā)BSD Socket輕松學(xué)習(xí)是本文要介紹的內(nèi)容,主要是來學(xué)習(xí)iphone開發(fā)中線程的學(xué)習(xí)。在進(jìn)行iphone開發(fā)通訊程序中,不可避免的要利用socket通訊,除了iPhone開發(fā)中自帶的CFSocket類接口之外,我們還可以基于BSD Socket來進(jìn)行通訊程式的開發(fā),而這篇文章簡(jiǎn)單介紹了BSD Socket的知識(shí),筆者認(rèn)為是一篇不錯(cuò)的入門文章,故轉(zhuǎn)到blog上進(jìn)行共享:

當(dāng)你進(jìn)入 UNIX 的神秘世界后,立刻會(huì)發(fā)現(xiàn)越來越多的東西難以理解。對(duì)于大多數(shù)人來說,BSD (Berkeley Software Distribution,伯克利軟件套件是Unix的衍生系統(tǒng),在1977至1995年間由加州大學(xué)伯克利分校開發(fā)和發(fā)布的) socket 的概念就是其中一個(gè)。這是一個(gè)很短的教程來解釋他們是什么、他們?nèi)绾喂ぷ鞑⒔o出一些簡(jiǎn)單的代碼來解釋如何使用他們。

類比 (什么是 socket ?)

socket 是進(jìn)行程序間通訊(IPC,Internet Process Connection)的 BSD 方法。這意味著 socket 用來讓一個(gè)進(jìn)程和其他的進(jìn)程互通信息,就象我們用電話來和其他的人交流一樣。

用電話來比喻是很恰當(dāng)?shù)模覀冊(cè)诤竺鎸⒁恢庇秒娫掃@個(gè)概念來描敘 socket 。

裝上你的新電話(怎樣偵聽?)

一個(gè)人要能夠收到別人打給他的電話,首先他要裝上一門電話。同樣,你必須先建立 socket 以偵聽線路。這個(gè)過程包含幾個(gè)步驟。首先,你要建立一個(gè)新的 socket,就象先裝上電話一樣。socket() 命令就完成這個(gè)工作。

因?yàn)?sockets 有幾種類型,你要注明你要建立什么類型的。你要做一個(gè)選擇是 socket 的地址格式。如同電話有音頻和脈沖兩種形式一樣,socket 有兩個(gè)最重要的選項(xiàng)是 AF_UNIX 和 IAF_INET。AF_UNIX 就象 UNIX 路徑名一樣識(shí)別 sockets。這種形式對(duì)于在同一臺(tái)機(jī)器上的 IPC 很有用。而 AF_INET 使用象 192.9.200.10 這樣被點(diǎn)號(hào)隔開的四個(gè)十進(jìn)制數(shù)字的地址格式。除了機(jī)器地址以外,還可以利用端口號(hào)來允許每臺(tái)機(jī)器上的多個(gè) AF_INET socket。我們這里將著重于 AF_INET 方式,因?yàn)樗苡杏貌V泛使用。

另外一個(gè)你必須提供的參數(shù)是 socket 的類型。兩個(gè)重要的類型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM 表明數(shù)據(jù)象字符流一樣通過 socket 。而 SOCK_DGRAM 則表明數(shù)據(jù)將是數(shù)據(jù)報(bào)(datagrams)的形式。我們將講解 SOCK_STREAM sockets,他很常見并易于使用。

在建立 socket 后,我們就要提供 socket 偵聽的地址了。就象你還要個(gè)電話號(hào)碼來接電話一樣。bind() 函數(shù)來處理這件事情。

SOCK_STREAM sockets 讓連接請(qǐng)求形成一個(gè)隊(duì)列。如果你忙于處理一個(gè)連接,別的連接請(qǐng)求將一直等待到該連接處理完畢。listen() 函數(shù)用來設(shè)置最大不被拒絕的請(qǐng)求數(shù)(一般為5個(gè))。一般最好不要使用 listen() 函數(shù)。

下面的代碼說明如何利用 socket()、 bind() 和 listen() 函數(shù)建立連接并可以接受數(shù)據(jù)。

  1. int establish(unsigned short portnum)  
  2. { char   myname[MAXHOSTNAME+1];  
  3.   int    s;  
  4.   struct sockaddr_in sa;  
  5.   struct hostent *hp;  
  6.   memset(&sa, 0, sizeof(struct sockaddr_in));  
  7.   gethostname(myname, MAXHOSTNAME);            
  8.   hpgethostbyname(myname);                    
  9.   if (hp == NULL)                              
  10.     return(-1);  
  11.   sa.sin_familyhp->h_addrtype;                
  12.   sa.sin_porthtons(portnum);                  
  13.   if ((ssocket(AF_INET, SOCK_STREAM, 0)) < 0)  
  14.     return(-1);  
  15.   if (bind(s,&sa,sizeof(struct sockaddr_in)) < 0) {  
  16.     close(s);  
  17.     return(-1);                                
  18.   }  
  19.   listen(s, 3);                                
  20.   return(s);  

在建立完 socket 后,你要等待對(duì)該 socket 的調(diào)用了。accept() 函數(shù)為此目的而來。調(diào)用 accept() 如同在電話鈴響后提起電話一樣。Accept() 返回一個(gè)新的連接到調(diào)用方的 socket 。

下面的代碼演示使用是個(gè)演示。

  1. int get_connection(int s)  
  2. { int t;                    
  3.   if ((t = accept(s,NULL,NULL)) < 0)    
  4.     return(-1);  
  5.   return(t);  

和電話不同的是,在你處理先前的連接的時(shí)候,你還可以接受調(diào)用。為此,一般用 fork 來處理每個(gè)連接。下面的代碼演示如何使用 establish() 和 get_connection() 來處理多個(gè)連接。

  1. #include          
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #define PORTNUM 50000  
  11. void fireman(void);  
  12. void do_something(int);  
  13. main()  
  14. { int s, t;  
  15.   if ((sestablish(PORTNUM)) < 0) {    
  16.     perror("establish");  
  17.     exit(1);  
  18.   }  
  19.   signal(SIGCHLD, fireman);            
  20.   for (;;) {                            
  21.     if ((tget_connection(s)) < 0) {  
  22.       if (errno == EINTR)              
  23.         continue;                      
  24.       perror("accept");                
  25.       exit(1);  
  26.     }  
  27.     switch(fork()) {                    
  28.     case -1 :                          
  29.       perror("fork");  
  30.       close(s);  
  31.       close(t);  
  32.       exit(1);  
  33.     case 0 :                            
  34.       close(s);  
  35.       do_something(t);  
  36.       exit(0);  
  37.     default :                          
  38.       close(t);                        
  39.       continue;  
  40.     }  
  41.   }  
  42. }  
  43. void fireman(void)  
  44. {  
  45.   while (waitpid(-1, NULL, WNOHANG) > 0)  
  46.     ;  
  47. }  
  48. void do_something(int s)  
  49. {  

撥號(hào) (如何調(diào)用 socket)

現(xiàn)在你應(yīng)該知道如何建立 socket 來接受調(diào)用了。那么如何調(diào)用呢?和電話一樣,你要先有個(gè)電話。用 socket() 函數(shù)來完成這件事情,就象建立偵聽的 socket 一樣。

在給 socket 地址后,你可以用 connect() 函數(shù)來連接偵聽的 socket 了。下面是一段代碼。

  1. int call_socket(char *hostname, unsigned short portnum)  
  2. { struct sockaddr_in sa;  
  3.   struct hostent     *hp;  
  4.   int a, s;  
  5.  
  6.   if ((hpgethostbyname(hostname)) == NULL) {  
  7.     errnoECONNREFUSED;                        
  8.     return(-1);                                  
  9.   }  
  10.  
  11.   memset(&sa,0,sizeof(sa));  
  12.   memcpy((char *)&sa.sin_addr,hp->h_addr,hp->h_length);  
  13.   sa.sin_familyhp->h_addrtype;  
  14.   sa.sin_porthtons((u_short)portnum);  
  15.  
  16.   if ((ssocket(hp->h_addrtype,SOCK_STREAM,0)) < 0)    
  17.     return(-1);  
  18.   if (connect(s,&sa,sizeof sa) < 0) {                    
  19.     close(s);  
  20.     return(-1);  
  21.   }  
  22.   return(s);  

這個(gè)函數(shù)返回一個(gè)可以流過數(shù)據(jù)的 socket 。

談話(如何通過 sockets 交談)

好了,你在要傳輸數(shù)據(jù)的雙方建立連接了,現(xiàn)在該傳輸數(shù)據(jù)了。read() 和 write() 函數(shù)來處理吧。除了在 socket 讀寫和文件讀寫中的一個(gè)區(qū)別外,和處理一般的文件一樣。區(qū)別是你一般不能得到你所要的數(shù)目的數(shù)據(jù)。所以你要一直循環(huán)到你需要的數(shù)據(jù)的到來。一個(gè)簡(jiǎn)單的例子:將一定的數(shù)據(jù)讀到緩存。

  1. int read_data(int s,      
  2.               char *buf,  
  3.               int n        
  4.              )  
  5. { int bcount;  
  6.   int br;      
  7.   bcount0;  
  8.   br0;  
  9.   while (bcount < n) {              
  10.     if ((brread(s,buf,n-bcount)) > 0) {  
  11.       bcount += br;                  
  12.       buf += br;                    
  13.     }  
  14.     else if (br < 0)                
  15.       return(-1);  
  16.   }  
  17.   return(bcount);  

相同的函數(shù)也可以寫數(shù)據(jù),留給我們的讀者吧。

掛起(結(jié)束)

和你通過電話和某人交談后一樣,你要在 socket 間關(guān)閉連接。一般 close() 函數(shù)用來關(guān)閉每邊的 socket 連接。如果一邊的已經(jīng)關(guān)閉,而另外一邊卻在向他寫數(shù)據(jù),則返回一個(gè)錯(cuò)誤代碼。

世界語(交流的語言很重要)

現(xiàn)在你可以在機(jī)器間聯(lián)絡(luò)了,可是要小心你所說的話。許多機(jī)器有自己的方言,如 ASCII 和 EBCDIC。更常見的問題是字節(jié)順序問題。除非你一直傳輸?shù)亩际俏谋荆駝t你一定要注意這個(gè)問題。幸運(yùn)的是,人們找出了解決的辦法。

在很久以前,人們爭(zhēng)論哪種順序更“正確”。現(xiàn)在必要時(shí)有相應(yīng)的函數(shù)來轉(zhuǎn)換。其中有 htons()、ntohs()、htonl() 和 ntohl()。在傳輸一個(gè)整型數(shù)據(jù)前,先轉(zhuǎn)換一下。

  1. ihtonl(i);  
  2. write_data(s, &i, sizeof(i)); 

在讀數(shù)據(jù)后,再變回來。

  1. read_data(s, &i, sizeof(i));  
  2. intohl(i); 

如果你一直堅(jiān)持這個(gè)習(xí)慣,你將比別人少出錯(cuò)的機(jī)會(huì)。

未來在你的掌握了(下一步?)

就用我們剛才討論的東西,你就可以寫自己的通訊程序了。和對(duì)待所有的新生事物一樣, 最好還是看看別人已經(jīng)做了些什么。這里有許多關(guān)于 BSD socket 的東西可以參考。

請(qǐng)注意,例子中沒有錯(cuò)誤檢查,這在“真實(shí)”的程序中是很重要的。你應(yīng)該對(duì)此充分重視。

小結(jié):關(guān)于iPhone開發(fā)BSD Socket輕松學(xué)習(xí)教程的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 新浪博客
相關(guān)推薦

2011-07-27 16:46:04

iPhone iPhone破解 MacPort

2011-08-09 09:57:59

iPhone服務(wù)器Socket

2011-08-10 15:48:10

iPhone網(wǎng)絡(luò)

2011-08-09 17:12:30

iPhoneCFRunLoop

2011-08-19 09:49:03

iPhone開發(fā)Three20 NetTTRequestLo

2011-08-15 13:44:07

iPhone開發(fā)UITableView

2011-08-05 16:10:31

iPhone 網(wǎng)絡(luò) NSURLConne

2011-08-05 16:31:47

iPhone 數(shù)據(jù)庫(kù)

2011-08-11 16:19:11

iPhoneCocoa

2011-08-02 17:37:01

IPhone開發(fā) 環(huán)境搭建

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-10 18:24:22

iPhone 圖形 繪圖

2011-07-08 16:02:24

iphone

2011-08-12 09:48:24

iPhoneCoreLocatio定位

2011-08-08 10:10:14

iPhone開發(fā) 圖片 方法

2011-08-15 10:06:22

iPhone開發(fā)nib 文件

2011-08-01 18:27:58

iPhone開發(fā) UISearchBa

2011-08-09 17:29:29

iPhone文件屏幕

2011-08-09 13:10:32

iPhone地圖開發(fā)

2011-07-21 10:29:18

iPhone 開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 激情影院久久 | 91亚洲精品在线观看 | 欧美一区永久视频免费观看 | 国产亚洲精品久久情网 | 久久精品久久久 | 免费午夜视频在线观看 | 日本成人久久 | 久久久免费在线观看 | 欧美国产一区二区三区 | 亚洲天堂男人的天堂 | 国产精品自拍啪啪 | 日韩欧美国产一区二区 | 精品中文字幕一区二区三区 | 国产亚洲欧美另类一区二区三区 | 日本 欧美 三级 高清 视频 | 久久久久国产一级毛片 | 亚洲国产小视频 | 日韩蜜桃视频 | 日韩欧美在线一区 | 久久视频免费观看 | 欧美一级全黄 | a在线免费观看视频 | 婷婷色国产偷v国产偷v小说 | 欧美电影免费观看高清 | 国产在线观看av | 亚洲免费三区 | 污免费网站 | 国产成人精品综合 | 成人亚洲性情网站www在线观看 | 在线视频一区二区三区 | 日韩色视频 | 情侣黄网站免费看 | 天天综合天天 | 7799精品视频天天看 | 性色av香蕉一区二区 | 国产一区二区三区四区三区四 | 国产精品久久久久久av公交车 | 国产综合久久 | 国产精品久久久久久久久图文区 | 欧美一区二区三区精品免费 | 国产精选一区 |