玩轉iPhone網路通訊之BSD Socket篇(手把手教你iphone開發 - 基礎篇)

來源:互聯網
上載者:User

作者:孫東風 2009-11-11(請尊重作者勞動成果,轉載務必註明出處)

 

在進行iPhone網路通訊程式的開發中,不可避免的要利用Socket通訊端。iPhone提供了Socket網路編程的介面CFSocket,不過筆者更喜歡使用BSD Socket。

 

iPhone BSD Socket進行編程所需要的標頭檔基本都位於/Xcode3.1.4/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include/sys下,既然本篇文章作為基礎篇,那麼筆者就從最基本的知識講解開始。

 

首先,Socket是進行程式間通訊(IPC, Internet Process Connection)的BSD方法,這意味著Socket是用來讓一個進程和其他的進程互相通訊的,就像我們用電話來和其他人交流一樣。

 

既然說Socket像個電話,那麼如果要打電話首先就要安裝一部電話,“安裝電話”這個動作對BSD Socket來說就是初始化一個Socket,方法如下:

 

int     socket(int, int, int);

 

第一個int參數為Socket的地址方式,既然要“安裝電話”,那麼就要首先確認所要安裝的電話是音訊還是脈衝的。而如果要給BSD Socket安裝電話,有兩種類型可供讀者選擇:AF_UNIX和AF_INET,它們代表Socket的地址格式。如果選擇AF_UNIX,意味著需要為Socket提供一個類似Unix路徑的名稱,這個選項主要用於本地程式之間的socket通訊;本文主要講解網路通訊,所以需要選擇參數AF_INET。

 

第二個int參數為Socket的類型,“安裝電話”需要首先確定是裝有線還是裝無線,安裝Socket也一樣,在Socket中提供了兩種類型:SOCK_STREAM和SOCK_DGRAM。SOCK_STREAM表明資料像字元流一樣通過Socket;而SOCK_DGRAM則表明資料以資料報(Datagrams)的形式通過Socket,本文主要講解SOCK_STREAM,因為它的使用更為廣泛。

 

第三個int參數為所使用的協議,本文裡使用0即可。

 

“安裝電話”的代碼如下:

 

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

    {

        perror("socket");

        exit(1);

    }

 

到現在為止,怎麼安裝電話已經清楚了。因為本文主要示範如何在iPhone上使用BSD Socket擷取內容,更多的功能是“打電話”而不是“接電話”,所以下面主要講解BSD Socket扮演“用戶端”角色的操作。

 

既然要“打電話”,那麼首先要有打電話的對象,更確切的說需要一個“電話號碼”,BSD Socket中的“電話號碼”就是IP地址。更糟糕的情況是,如果只知道連絡人的名字而不知道電話號碼,那麼還需要程式尋找相應連絡人的電話號碼,根據連絡人姓名尋找電話號碼的過程在BSD Socket中叫做DNS解析,代碼如下:

 

- (NSString*)getIpAddressForHost:(NSString*) theHost

{

    struct hostent *host = gethostbyname([theHost UTF8String]);

   

    if(!host)

    {

        herror("resolv");

        return NULL;

    }

   

    struct in_addr **list = (struct in_addr **)host->h_addr_list;

    NSString *addressString = [NSString stringWithCString:inet_ntoa(*list[0])];

    return addressString;

}

 

hostent是個結構體,使用它需要#import <netdb.h>,通過這個方法得到theHost網域名稱的第一個有效IP地址並返回。

 

正確的“找到電話號碼”後,就需要“撥打到電話”了,代碼如下:

 

        their_addr.sin_family = AF_INET;

        their_addr.sin_addr.s_addr = inet_addr([[self getIpAddressForHost:hostName] UTF8String]);

        NSLog(@"getIpAddressForHost :%@",[self getIpAddressForHost:hostName]);

       

        their_addr.sin_port = htons(80);

        bzero(&(their_addr.sin_zero), 8);

       

        int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));

       

        NSLog(@"Connect errno is :%d",conn);

 

筆者最初試圖採用NHost進行主機網域名稱的解析,奈何iPhone的這個類為private的,在application的開發中不可使用。

 

如果“電話”能順利的接通,那麼就可以進行“講話”了,反之則會斷開“電話串連”,如果友好的話,最好能給個提示,諸如“您所撥打的電話不在服務區之類”:)

 

        if(conn != -1)

        {

            NSLog(@"Then the conn is not -1!");

           

            NSMutableString* httpContent = [self makeHttpHeader:hostName];

           

            NSLog(@"httpCotent is :%@",httpContent);

           

            if(contentSended != nil)

                [httpContent appendFormat:contentSended];

           

            NSLog(@"Sended content is :%@",httpContent);

           

            NSData *data = [httpContent dataUsingEncoding:NSISOLatin1StringEncoding];

            ssize_t dataSended = send(sockfd, [data bytes], [data length], 0);

           

            if(dataSended == [data length])

            {

                NSLog(@"Datas have been sended over!");

            }

           

            printf("send %d bytes to %s",dataSended,inet_ntoa(their_addr.sin_addr));

 

            NSMutableString* readString = [[NSMutableString alloc] init];

            char readBuffer[512];

           

            int br = 0;

            while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)) < sizeof(readBuffer))

            {

                NSLog(@"read datas length is :%d",br);

               

                [readString appendFormat:[NSString stringWithCString:readBuffer length:br]];

              &

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.