从Samples中入门IOS开发(四)------ 基于socket的网络编程

本文介绍了如何使用SimpleNetworkStreams进行基于Socket的网络编程,涉及iOS中实现局域网内文件传输的步骤,包括服务器端的socket监听、客户端发起连接请求、数据的发送与接收等关键流程。
摘要由CSDN通过智能技术生成

SimpleNetworkStreams展示了如何基于Socket网络编程,实现了一个很典型的局域网内网络数据传输的场景,一个是client向server端发送本地的图片文件,另一个是client向server端下载图片到本地文件。抽取出来的一般流程:

  • server开启socket监听

此处IOS的一般做法是三步走:

第一步:创建系统级的socket,并绑定端口

    port = 0;
    
    fd = socket(AF_INET, SOCK_STREAM, 0);
    success = (fd != -1);
    
    if (success) {
        memset(&addr, 0, sizeof(addr));
        addr.sin_len    = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port   = 0;
        addr.sin_addr.s_addr = INADDR_ANY;
        err = bind(fd, (const struct sockaddr *) &addr, sizeof(addr));
        success = (err == 0);
    }
    if (success) {
        err = listen(fd, 5);
        success = (err == 0);
    }
    if (success) {
        socklen_t   addrLen;

        addrLen = sizeof(addr);
        err = getsockname(fd, (struct sockaddr *) &addr, &addrLen);
        success = (err == 0);
        
        if (success) {
            assert(addrLen == sizeof(addr));
            port = ntohs(addr.sin_port);
        }
    }

这里用port=0是让系统自动随机找一个空闲端口。其他都是基于c风格对系统函数的直接调用。

第二步:用IOS的socket(CFSocket)包装系统socket

CFSocketContext context = { 0, (__bridge void *) self, NULL, NULL, NULL };

assert(self->_listeningSocket == NULL);
self->_listeningSocket = CFSocketCreateWithNative(
    NULL, 
    fd, 
    kCFSocketAcceptCallBack, 
    AcceptCallback, 
    &context
);
success = (self->_listen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值