iOS socket通信(不使用框架的簡(jiǎn)單實(shí)例)

  • 有很多的文章都有介紹socket通信憔足,但是大多都是用了框架执庐。如果是以學(xué)習(xí)為目的來(lái)用的話酪耕,是十分不利的。所以還是有必要寫(xiě)篇文章來(lái)介紹一下轨淌。
server in mac
client in mac

服務(wù)器的代碼:
1.設(shè)置socket迂烁,設(shè)置好端口號(hào)看尼,地址,長(zhǎng)度盟步。
-最重要的是要調(diào)用bind()函數(shù)對(duì)socket進(jìn)行綁定藏斩;
2.綁定成功后success為YES,進(jìn)入第二步却盘,調(diào)用listen()開(kāi)始監(jiān)聽(tīng)
3.如果有客戶端連接到了服務(wù)器狰域,進(jìn)入第三步。
-注意每個(gè)客戶端連接服務(wù)器后黄橘,服務(wù)器都會(huì)分配一個(gè)端口給客戶端兆览,并在這個(gè)端口上進(jìn)行通信。然后服務(wù)器繼續(xù)在設(shè)定的端口上繼續(xù)等待塞关。

所以在控制臺(tái)上顯示的端口號(hào)并不是你所設(shè)定的(17777)抬探。而是系統(tǒng)自定分配的。(如果沒(méi)有對(duì)socket有比較好的了解描孟,這里很容易會(huì)沒(méi)注意到)

#import 
#include<sys/types.h>
#include<sys/socket.h>
#include <sys/xattr.h>
#include<arpa/inet.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        int err;
        int fd=socket(AF_INET, SOCK_STREAM  , 0);
        BOOL success=(fd!=-1);
        //        1
        if (success) {
            NSLog(@"socket success");
            struct sockaddr_in addr;
            memset(&addr, 0, sizeof(addr));//初始化socket
            addr.sin_len=sizeof(addr);//socket字節(jié)長(zhǎng)度
            addr.sin_family=AF_INET;  //協(xié)議族
            addr.sin_port=htons(17777); //端口
            addr.sin_addr.s_addr=INADDR_ANY; //設(shè)定地址為 所有地址 本地網(wǎng)卡:回環(huán)網(wǎng)卡驶睦,。匿醒。场航。 無(wú)線網(wǎng)卡
            err=bind(fd, (const struct sockaddr *)&addr, sizeof(addr));
            success=(err==0);
        }
        //   2
        //        
        if (success) {
            NSLog(@"bind(綁定) success");
            err=listen(fd, 5);//開(kāi)始監(jiān)聽(tīng)
            success=(err==0);
        }
        //3
#warning 每個(gè)客戶端連接服務(wù)器后,服務(wù)器都會(huì)分配一個(gè)端口給客戶端廉羔,然后服務(wù)器繼續(xù)在設(shè)定的端口上繼續(xù)等待溉痢。
        if (success) {
            NSLog(@"listen success");
            while (true) {
                struct sockaddr_in peeraddr;
                int peerfd;
                socklen_t addrLen;
                addrLen=sizeof(peeraddr);
                NSLog(@"prepare accept");
//獲得服務(wù)器和當(dāng)前連接客戶端通信的專(zhuān)用socket。
                peerfd=accept(fd, (struct sockaddr *)&peeraddr, &addrLen);
                success=(peerfd!=-1);
                if (success) {
                    NSLog(@"accept success,remote address:%s,port:%d",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));
                    char buf[1024];
                    ssize_t count;
                    size_t len=sizeof(buf);
                    do {
                        count=recv(peerfd, buf, len, 0);
                        NSString* str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
                        NSLog(@"%@",str);
                    } while (strcmp(buf, "exit")!=0);
                }         
                close(peerfd);
            } 
        }  
    }
    return 0;
}

客戶端的代碼
1.值得注意的就是客戶端中并不需要綁定socket憋他。

#include<sys/types.h>
#include<sys/socket.h>
#include <sys/xattr.h>
#include<arpa/inet.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        int err;
        int fd=socket(AF_INET, SOCK_STREAM, 0);
        BOOL success=(fd!=-1);
        struct sockaddr_in addr;
#warning 在客戶端中孩饼,是不用綁定端口的。
//        if (success) {
//            NSLog(@"socket success");
//            memset(&addr, 0, sizeof(addr));
//            addr.sin_len=sizeof(addr);
//            addr.sin_family=AF_INET;
//            addr.sin_addr.s_addr=INADDR_ANY;
//            err=bind(fd, (const struct sockaddr *)&addr, sizeof(addr));
//            success=(err==0);
//        }

        if (success) {
            struct sockaddr_in peeraddr;
            memset(&peeraddr, 0, sizeof(peeraddr));
            peeraddr.sin_len=sizeof(peeraddr);
            peeraddr.sin_family=AF_INET;
            peeraddr.sin_port=htons(17777);
            //            peeraddr.sin_addr.s_addr=INADDR_ANY;
            peeraddr.sin_addr.s_addr=inet_addr("127.0.0.1");
            //            這個(gè)地址是服務(wù)器的地址竹挡,
            socklen_t addrLen;
            addrLen =sizeof(peeraddr);
            NSLog(@"connecting");
            err=connect(fd, (struct sockaddr *)&peeraddr, addrLen);
            success=(err==0);
            if (success) {
                //                struct sockaddr_in addr;
                err =getsockname(fd, (struct sockaddr *)&addr, &addrLen);
                success=(err==0);
                if (success) {
                    NSLog(@"connect success,local address:%s,port:%d",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
                    char buf[1024];
                    do {
                        printf("input message:");
                        scanf("%s",buf);
                        send(fd, buf, 1024, 0);
                    } while (strcmp(buf, "exit")!=0);
                }
            }
            else{
                NSLog(@"connect failed");
            }
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镀娶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子揪罕,更是在濱河造成了極大的恐慌梯码,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件好啰,死亡現(xiàn)場(chǎng)離奇詭異轩娶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)框往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)鳄抒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事许溅∪勘牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵闹司,是天一觀的道長(zhǎng)娱仔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)游桩,這世上最難降的妖魔是什么牲迫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮借卧,結(jié)果婚禮上盹憎,老公的妹妹穿的比我還像新娘。我一直安慰自己铐刘,他們只是感情好陪每,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著镰吵,像睡著了一般檩禾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疤祭,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天盼产,我揣著相機(jī)與錄音,去河邊找鬼勺馆。 笑死戏售,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的草穆。 我是一名探鬼主播灌灾,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悲柱!你這毒婦竟也來(lái)了锋喜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豌鸡,失蹤者是張志新(化名)和其女友劉穎跑芳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體直颅,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怀樟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了功偿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖械荷,靈堂內(nèi)的尸體忽然破棺而出共耍,到底是詐尸還是另有隱情,我是刑警寧澤吨瞎,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布痹兜,位于F島的核電站,受9級(jí)特大地震影響颤诀,放射性物質(zhì)發(fā)生泄漏字旭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一崖叫、第九天 我趴在偏房一處隱蔽的房頂上張望遗淳。 院中可真熱鬧,春花似錦心傀、人聲如沸屈暗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)养叛。三九已至,卻和暖如春宰翅,著一層夾襖步出監(jiān)牢的瞬間弃甥,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工堕油, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潘飘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓掉缺,卻偏偏與公主長(zhǎng)得像卜录,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眶明,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理艰毒,服務(wù)發(fā)現(xiàn),斷路器搜囱,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Socket基礎(chǔ)概念 網(wǎng)絡(luò)中進(jìn)程之間如何通信丑瞧? 網(wǎng)絡(luò)中進(jìn)程之間如何通信?首要解決的問(wèn)題是如何唯一標(biāo)識(shí)一個(gè)進(jìn)程蜀肘,否則...
    DiamondsAndRust閱讀 4,743評(píng)論 2 54
  • 最近在學(xué)習(xí)Python看了一篇文章寫(xiě)得不錯(cuò)绊汹,是在腳本之家里的,原文如下扮宠,很有幫助: 一西乖、網(wǎng)絡(luò)知識(shí)的一些介紹 soc...
    qtruip閱讀 2,692評(píng)論 0 6
  • 1、網(wǎng)絡(luò)中進(jìn)程之間如何通信? 2获雕、Socket是什么薄腻? 3、socket的基本操作 3.1届案、socket()函數(shù) ...
    一字碼閱讀 696評(píng)論 0 8
  • 隱喻楣颠,是心理咨詢或心理治療時(shí)經(jīng)常使用的一種技巧尽纽。它通過(guò)將抽象情緒,具象成一種場(chǎng)景或事物球碉,并通過(guò)引導(dǎo)蜓斧,來(lái)改變這種被具...
    Vidya程瑩閱讀 673評(píng)論 0 51