iOS网络编程笔记——Socket底层实现笔记

Socket简单底层实现笔记:

以Socket客户端编程为例:

1.导入头文件

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

2.创建Socket

@implementation ViewController {
int _clientSocket;
}

/*
1.AF_INET: ipv4 执行ip协议的版本
2.SOCK_STREAM:指定Socket类型,面向连接的流式socket 传输层的协议
3.IPPROTO_TCP:指定协议。 IPPROTO_TCP 传输方式TCP传输协议
返回值 大于0 创建成功
*/
_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

3.建立链接与服务器

/*
终端里面 命令模拟服务器 netcat  nc -lk 12345
参数一:套接字描述符
参数二:指向数据结构sockaddr的指针,其中包括目的端口和IP地址
参数三:参数二sockaddr的长度,可以通过sizeof(struct sockaddr)获得
返回值 int -1失败 0 成功
*/
struct sockaddr_in addr;
/* 填写sockaddr_in结构*/
addr.sin_family = AF_INET;
addr.sin_port=htons(12345);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int connectResult= connect( _clientSocket, (const struct sockaddr *)&addr, sizeof(addr));

4.发送数据

/*
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程式要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字符数;
第四个参数一般置0。
成功则返回实际传送出去的字符数,失败返回-1,
*/
char * str = "itcast";
ssize_t sendLen = send( _clientSocket, str, strlen(str), 0);

 

5.从服务器接收数据

/*
第一个参数socket
第二个参数存放数据的缓冲区
第三个参数缓冲区长度。
第四个参数指定调用方式,一般置0
返回值 接收成功的字符数
*/
char *buf[1024];
ssize_t recvLen = recv( _clientSocket, buf, sizeof(buf), 0);
NSLog(@"---->%ld",recvLen);

6.关闭连接

 close( _clientSocket);

 

简书上帖子的封装方法:

//发送数据并等待返回数据
- (void)sentAndRecv:(NSString *)msg {
    dispatch_queue_t q_con =  dispatch_queue_create("CONCURRENT", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(q_con, ^{
   const char *str = msg.UTF8String;
    ssize_t sendLen = send(_clientSocket, str, strlen(str), 0);
    char *buf[1024];
    ssize_t recvLen = recv(_clientSocket, buf, sizeof(buf), 0);
    NSString *recvStr = [[NSString alloc] initWithBytes:buf length:recvLen encoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            
              self.tv_showMSG.text = recvStr;
        });
    });
  
}

//建立连接
- (void)connectToServer:(NSString *)ip port:(int)port {
    _clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct sockaddr_in addr;
    /* 填写sockaddr_in结构*/
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(ip.UTF8String);

    int connectResult = connect(_clientSocket, (const struct sockaddr *)&addr, sizeof(addr));

    if (connectResult == 0) {
        NSLog(@"conn ok");
        _status.text = @"连接成功";
    }else{
        
        _status.text = @"连接失败";
       
    }
}

原帖:http://www.jianshu.com/p/1883977690b3写的非常好,大家一起学习。

转载于:https://www.cnblogs.com/byxixiblogs/p/6542972.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值