玩转iPhone网络通讯之BSD Socket篇(手把手教你iphone开发

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 08:35 点击:

作者:孙东风 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(s

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • UITableView一些方法
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1