Socket通信之編程原理

關(guān)于網(wǎng)絡編程,這幾篇文章是對iOS開發(fā)中網(wǎng)絡編程實用的一些指導,簡單整理出來以備查詢.各位大神如果有深入的研究的或者有什么好的使用技巧了都可以交流下哦,歡迎指出使用不當之處

  • iOS中網(wǎng)絡編程大體分為三類,第一種是基于C的BSD socket編程,是最底層的,第二種是基于C的CFNetwork,屬于Core Foundation框架,第三種是屬于cocoa類的,NSURL,NSStream,Bonjour等.第三種是比較常用的,其中NSStream 其實是 對 CFNetwork 簡單封裝,對于數(shù)據(jù)的處理,NSStream是用的代理,CFNetwork是用的函數(shù)回調(diào).

客戶端和服務端編程流程:

1,客戶端socket編程:創(chuàng)建套接字socket(),建立套接字鏈接connect(),數(shù)據(jù)傳輸send()和recv(),關(guān)閉套接字close().
2,服務端scoket編程:創(chuàng)建套接字socket(),指定本地地址bind(),監(jiān)聽鏈接listen(),接收鏈接accept(),數(shù)據(jù)傳輸send()和recv(),關(guān)閉套接字close(),關(guān)閉最初套接字close().
** socket編程時序圖:面向連接 **

Snip20160708_2.png

** 使用socket有一個模式,即所有的程序幾乎毫無例外地按照相同的順序調(diào)用相同的函數(shù),套路基本是固定的,如果第一次做socket編程的時候封裝好了,以后就可以直接用了**

  • ** 客戶端的套接字系統(tǒng)調(diào)用說明 **
    1.創(chuàng)建并初始化套接字──socket()
需要導入的頭文件:
#import <sys/socket.h>
#import <netinet/in.h>
#import <netdb.h>
/**
    第一個參數(shù):指定通信的發(fā)生區(qū)域,通常用的是AF_INET(IPv4)和AF_INET6(IPv6)
    第二個參數(shù):套接字的類型,總共有三種:流式套接字(SOCK_STREAM),數(shù)據(jù)報文datagram(SOCK_DGRAM),原始式套接字(SOCK_RAW),最后一個不常用.
    第三個參數(shù):套接字使用的特定協(xié)議,一般傳0,使用默認的鏈接模式
    返回值:整型的套接字號或者叫文件描述符,創(chuàng)建失敗返回-1
   int socket(int, int, int);
    */
// 創(chuàng)建socket
 int sock = socket(AF_INET, SOCK_STREAM, 0);

2.建立套接字連接──connect(),客戶端通過調(diào)用該接口向服務器發(fā)起建立連接請求

    /**
      其實,在建立連接請求前,需要對IP地址進行查找,如果找不到對應的IP返回NULL.
      參數(shù)傳遞的是IP的char類型的字符串,返回一個指向結(jié)構(gòu)體hostent的指針,結(jié)構(gòu)體hostent記錄著主機的信息,包括主機名、別名、地址類型、地址長度和地址列表

    struct hostent *gethostbyname(const char *);

      */
    // 事例代碼,host是IP地址的OC字符串
    struct hostent *remoteHp = gethostbyname([host UTF8String]);

    /**
     第一個參數(shù):準備建立的本地套接字描述符(套接字號)
     第二個參數(shù):套接字地址結(jié)構(gòu)體指針,就是連接的參數(shù)
     第三個參數(shù):套接字地址結(jié)構(gòu)體的長度
     返回值:整型,判斷連接是否成功,如果連接成功返回0,失敗返回-1.
     說明:對于 UDP 來說,該接口是可選的,如果調(diào)用了該接口,表明設置了該 UDP socket 默認的網(wǎng)絡地址。對 TCP socket來說這就是傳說中三次握手建立連接發(fā)生的地方
     注意:該接口調(diào)用會阻塞當前線程,直到服務器返回

     int connect(int, const struct sockaddr *, socklen_t) 

      */

    // 事例代碼
    /**
      struct sockaddr_in 用來描述套接字地址的結(jié)構(gòu)體
      */
    struct sockaddr_in sockPara;
    /**
      memcpy:內(nèi)存copy函數(shù),從源src所指的內(nèi)存地址的起始位置開始拷貝n個字節(jié)到目標dest所指的內(nèi)存地址的起始位置中
       void *memcpy(void *dest, const void *src, size_t n);
      */
    //  下面的代碼可以替換成:
    //  sockPara.sin_addr = (struct in_addr*)remoteHp->h_addr_list[0];
    memcpy((char *)&sockPara.sin_addr, (char *)remoteHp->h_addr_list[0], remoteHp->h_length);
    sockPara.sin_family = ip;
    sockPara.sin_port = htons([port intValue]);
    
    int connectRet = connect(sock, (struct sockaddr *)&sockPara, sizeof(sockPara));

3.數(shù)據(jù)傳輸──send()和recv()

//  注意:數(shù)據(jù)的發(fā)送和接收回阻塞當前線程
// 發(fā)送數(shù)據(jù)
  /**
  第一個參數(shù):已經(jīng)連接的本地套接字描述符
  第二個參數(shù):指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)的指針
  第三個參數(shù):指定第二個參數(shù)的長度
  第四個參數(shù):指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等
  返回值:如果沒有發(fā)生錯誤,返回的是總共發(fā)送的字節(jié)數(shù),否則返回-1

  ssize_t send(int, const void *, size_t, int);

  */


// 接收數(shù)據(jù)
/**
  第一個參數(shù):已經(jīng)連接的本地套接字描述符
  第二個參數(shù):指向接收輸入數(shù)據(jù)緩沖區(qū)的指針
  第三個參數(shù):指定第二個參數(shù)的長度
  第四個參數(shù):指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等
  返回值:返回總共接收的字節(jié)數(shù),如果連接被關(guān)閉返回0,否則返回-1

  ssize_t recv(int, void *, size_t, int)

*/
   // 事例代碼
  ssize_t result = recv(sock, &buf, sizeof(buf), 0);

4.關(guān)閉──close()

// 傳入的參數(shù):已經(jīng)打開的本地套接字描述符
// 關(guān)閉套接字,并釋放分配給該套接字的資源
int  close(int)

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過建立管道,將兩個不同的進程之間...
    jiodg45閱讀 1,235評論 0 1
  • Socket基礎概念 網(wǎng)絡中進程之間如何通信? 網(wǎng)絡中進程之間如何通信?首要解決的問題是如何唯一標識一個進程,否則...
    DiamondsAndRust閱讀 4,908評論 2 54
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,805評論 1 118
  • 1、網(wǎng)絡中進程之間如何通信? 本地的進程間通信(IPC)有很多種方式,但可以總結(jié)為下面4類:消息傳遞(管道、FIF...
    階梯閱讀 1,089評論 0 4
  • 習題地址:https://github.com/Yixiaohan/show-me-the-code 0、將你的 ...
    Aragami閱讀 2,575評論 0 2

友情鏈接更多精彩內(nèi)容