Socket通信之編程原理

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

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

客戶端和服務(wù)端編程流程:

1,客戶端socket編程:創(chuàng)建套接字socket(),建立套接字鏈接connect(),數(shù)據(jù)傳輸send()和recv(),關(guān)閉套接字close().
2,服務(wù)端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()
需要導(dǎo)入的頭文件:
#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,使用默認(rèn)的鏈接模式
    返回值:整型的套接字號或者叫文件描述符,創(chuàng)建失敗返回-1
   int socket(int, int, int);
    */
// 創(chuàng)建socket
 int sock = socket(AF_INET, SOCK_STREAM, 0);

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

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

    struct hostent *gethostbyname(const char *);

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

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

     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é)到目標(biāo)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ā)送和接收回阻塞當(dāng)前線程
// 發(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)系作者
  • 序言:七十年代末春贸,一起剝皮案震驚了整個濱河市混萝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍恕,老刑警劉巖逸嘀,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異允粤,居然都是意外死亡崭倘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門类垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司光,“玉大人,你說我怎么就攤上這事悉患〔屑遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵售躁,是天一觀的道長跪削。 經(jīng)常有香客問我谴仙,道長迂求,這世上最難降的妖魔是什么碾盐? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮揩局,結(jié)果婚禮上毫玖,老公的妹妹穿的比我還像新娘。我一直安慰自己凌盯,他們只是感情好付枫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驰怎,像睡著了一般阐滩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上县忌,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天掂榔,我揣著相機(jī)與錄音,去河邊找鬼症杏。 笑死装获,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厉颤。 我是一名探鬼主播穴豫,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逼友!你這毒婦竟也來了精肃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帜乞,失蹤者是張志新(化名)和其女友劉穎司抱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挖函,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡状植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怨喘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片津畸。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖必怜,靈堂內(nèi)的尸體忽然破棺而出肉拓,到底是詐尸還是另有隱情,我是刑警寧澤梳庆,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布暖途,位于F島的核電站卑惜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驻售。R本人自食惡果不足惜露久,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欺栗。 院中可真熱鬧毫痕,春花似錦、人聲如沸迟几。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类腮。三九已至臊泰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚜枢,已是汗流浹背缸逃。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟偷,地道東北人察滑。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像修肠,于是被迫代替她去往敵國和親贺辰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

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