iOS中Socket開發(fā)--UDP篇

1.Socket簡介

Socket

百度百科:

網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket霞溪。
Socket的英文原義是“孔”或“插座”中捆。作為BSD UNIX的進(jìn)程通信機(jī)制,取后一種意思殴蓬。通常也稱作"套接字"蟋滴,用于描述IP地址和端口,是一個通信鏈的句柄肖粮,可以用來實現(xiàn)不同虛擬機(jī)或不同計算機(jī)之間的通信尔苦。在Internet上的主機(jī)一般運行了多個服務(wù)軟件,同時提供幾種服務(wù)凌净。每種服務(wù)都打開一個Socket屋讶,并綁定到一個端口上,不同的端口對應(yīng)于不同的服務(wù)皿渗。Socket正如其英文原意那樣轻腺,像一個多孔插座贬养。一臺主機(jī)猶如布滿各種插座的房間琴庵,每個插座有一個編號,有的插座提供220伏交流電迷殿, 有的提供110伏交流電庆寺,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號的插座懦尝,就可以得到不同的服務(wù)。

圖說Socket

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層, 它是一組接口琅轧。

2.TCP和UDP的區(qū)別

TCP

面向連接鹰晨、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)止毕、用于傳輸大量數(shù)據(jù)(流模式)、速度慢扁凛,建立連接需要開銷較多(時間谨朝,系統(tǒng)資源)。

UDP

面向非連接字币、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)士复、速度快

區(qū)別

關(guān)于TCP是一種流模式的協(xié)議便贵,UDP是一種數(shù)據(jù)報模式的協(xié)議冗荸,這里要說明一下,TCP是面向連接的盔粹,也就是說魂毁,在連接持續(xù)的過程中,socket中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮),因此税稼,知道保證數(shù)據(jù)是有序的到達(dá)就行了,至于每次讀取多少數(shù)據(jù)自己看著辦只祠。

UDP是無連接的協(xié)議扰肌,也就是說,只要知道接收端的IP和端口盗舰,且網(wǎng)絡(luò)是可達(dá)的桂躏,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)。這時候蛮位,如果一次能讀取超過一個報文的數(shù)據(jù)鳞绕,則會亂套。比如们何,主機(jī)A向發(fā)送了報文P1垂蜗,主機(jī)B發(fā)送了報文P2解幽,如果能夠讀取超過一個報文的數(shù)據(jù)烘苹,那么就會將P1和P2的數(shù)據(jù)合并在了一起,這樣的數(shù)據(jù)是沒有意義的霜定。

3.UDP的Socket具體實現(xiàn)

iOS提供了Socket網(wǎng)絡(luò)編程的接口CFSocket廊鸥,不過這里使用BSD Socket。

基本UDP客戶—服務(wù)器程序設(shè)計基本框架流程圖


常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)流式是一種面向連接的Socket吆视,針對于面向連接的TCP服務(wù)應(yīng)用數(shù)據(jù)報式Socket是一種無連接的Socket您觉,對應(yīng)于無連接的UDP服務(wù)應(yīng)用瘸洛。

Socket調(diào)用的主要庫函數(shù)

創(chuàng)建套接字

Socket(af, type, protocol)

建立地址和套簽字的練習(xí)

bind(sockid, local addr, addrlen)

服務(wù)器端監(jiān)聽客戶端的請求

listen(Sockid, quenlen)

建立服務(wù)器/客戶端的連接(面向連接TCP)
客戶端請求連接

Connect(Sockid, destaddr, addrlen)

服務(wù)器端等待從編號為Sockid的Socket上接收客戶連接請求

newsockid = accept(Sockid棺滞,Clientaddr, paddrlen)

發(fā)送/接收數(shù)據(jù)
面向?qū)ο?/p>

send(sockid, buff, bufflen)
recv()

面向無連接

sendto(sockid, buff, ..., addrlen)
recvform()

釋放嵌套字

close(socked)

UDP下Socket具體實現(xiàn)

服務(wù)器的工作流程:首先調(diào)用socket函數(shù)創(chuàng)建一個Socket恶导,然后調(diào)用bind函數(shù)將其與本機(jī)地址以及一個本地端口號綁定郁妈,接收到一個客戶端時,服務(wù)器顯示該客戶端的IP地址噩咪,并將字串返回給客戶端胃碾。

服務(wù)器參考代碼:

#import <Foundation/Foundation.h>
#import <sys/socket.h>
#import <sys/types.h>
#import <netinet/in.h>
#import <arpa/inet.h>

int main(int argc, const char * argv[]) {

    int ser_sockfd = 0;
    int len = 0;
    //int addrlen;
    socklen_t addrlen = 0;
    char seraddr[100] = {0};
    struct sockaddr_in ser_addr = {0};

    /*建立socket*/
    ser_sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(ser_sockfd < 0)
    {
        printf("I cannot socket success\n");
        return 1;
    }

    /*填寫sockaddr_in 結(jié)構(gòu)*/
    addrlen = sizeof(struct sockaddr_in);
    bzero(&ser_addr, addrlen);
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    ser_addr.sin_port = htons(1024);

    /*綁定客戶端*/
    if(bind(ser_sockfd, (struct sockaddr *)&ser_addr, addrlen) < 0)
    {
        printf("connect");
        return 1;
    }

    while(1)
    {
        bzero(seraddr, sizeof(seraddr));
        len = recvfrom(ser_sockfd, seraddr, sizeof(seraddr), 0, (struct sockaddr*)&ser_addr, &addrlen);
        /*顯示client端的網(wǎng)絡(luò)地址*/
        printf("receive from %s\n", inet_ntoa(ser_addr.sin_addr));
        /*顯示客戶端發(fā)來的字串*/
        printf("recevce:%s", seraddr);
        /*將字串返回給client端*/
        sendto(ser_sockfd, seraddr, len, 0, (struct sockaddr*)&ser_addr, addrlen);
    }
    return 0;
}

客戶端參考代碼

#import <Foundation/Foundation.h>
#import <sys/socket.h>
#import <sys/types.h>
#import <netinet/in.h>
#import <arpa/inet.h>

int GetServerAddr(char *addrname)
{
    printf("please input server addr:");
    scanf("%s", addrname);
    return 1;
}

int main(int argc, const char * argv[]) {

    int cli_sockfd = 0;
    int len = 0;
    socklen_t addrlen = 0;
    char seraddr[14] = {0};
    struct sockaddr_in cli_addr = {0};
    char buffer[256] = {0};

    GetServerAddr(seraddr);

    /* 建立socket*/
    cli_sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cli_sockfd < 0)
    {
        printf("I cannot socket success\n");
        return 1;
    }

    /* 填寫sockaddr_in*/
    addrlen = sizeof(struct sockaddr_in);
    bzero(&cli_addr, addrlen);
    cli_addr.sin_family = AF_INET;
    cli_addr.sin_addr.s_addr = inet_addr(seraddr);
    //cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    cli_addr.sin_port = htons(1024);
    bzero(buffer,sizeof(buffer));

    /* 從標(biāo)準(zhǔn)輸入設(shè)備取得字符串*/
    len = read(STDIN_FILENO, buffer, sizeof(buffer));

    /* 將字符串傳送給server端*/
    sendto(cli_sockfd, buffer, len, 0, (struct sockaddr*)&cli_addr, addrlen);

    /* 接收server端返回的字符串*/
    len = recvfrom(cli_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cli_addr, &addrlen);
    //printf("receive from %s\n",inet_ntoa(cli_addr.sin_addr));
    printf("receive: %s", buffer);
    close(cli_sockfd);

    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厕隧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子髓迎,更是在濱河造成了極大的恐慌建丧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橄维,死亡現(xiàn)場離奇詭異拴曲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竞川,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門叁熔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來者疤,“玉大人叠赦,你說我怎么就攤上這事〕悖” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵泳姐,是天一觀的道長暂吉。 經(jīng)常有香客問我,道長阎肝,這世上最難降的妖魔是什么肮街? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沛硅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擂红。我一直安慰自己朦蕴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布涉茧。 她就那樣靜靜地躺著疹娶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钳垮。 梳的紋絲不亂的頭發(fā)上额港,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音肚医,去河邊找鬼向瓷。 笑死,一個胖子當(dāng)著我的面吹牛猖任,可吹牛的內(nèi)容都是我干的朱躺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乾闰,長吁一口氣:“原來是場噩夢啊……” “哼盈滴!你這毒婦竟也來了轿钠?” 一聲冷哼從身側(cè)響起病苗,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贷腕,沒想到半個月后咬展,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡涮总,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年瀑梗,在試婚紗的時候發(fā)現(xiàn)自己被綠了裳扯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿鲜,死狀恐怖冤吨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锅很,我是刑警寧澤凤跑,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布仔引,位于F島的核電站,受9級特大地震影響咖耘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜版保,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叫胁。 院中可真熱鬧汞幢,春花似錦、人聲如沸输钩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坎藐。三九已至,卻和暖如春碉咆,著一層夾襖步出監(jiān)牢的瞬間蛀恩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工壳咕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留顽馋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓竟稳,卻偏偏與公主長得像熊痴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子果善,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 1.1 TCP/IP協(xié)議組 TCP/IP協(xié)議(傳輸控制協(xié)議)由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成 IP層負(fù)責(zé)...
    F麥子閱讀 2,781評論 0 25
  • 轉(zhuǎn)展懈。。存崖。。来惧。。隅居。葛虐。 SOCKET,TCP/UDP,HTTP,FTP (一)TCP/UDP,SOCKET,HTTP,...
    zeqinjie閱讀 3,268評論 1 53
  • 1.Socket簡介 Socket 百度百科: 網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換乒融,這個連接的一...
    于是有了濤閱讀 2,230評論 0 4
  • 個人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記愧捕,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評論 0 8
  • 1.這篇文章不是本人原創(chuàng)的次绘,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的撒遣,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,037評論 6 174