Socket 基本演练以及用Socket加载百度
2015-10-21 00:25
260 查看
Socket的特点以及Demo
是为网络服务提供的一种机制
通信的两端都是
Socket
网络通信其实就是
Socket间的通信
数据在两个
Socket间通过
IO传输
Socket是
纯C语言的,是跨平台的
导入头文件
#import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h>
定义属性
@interface ViewController () /// 客户端 socket @property (nonatomic, assign) int clientSocket; @end
建立 socket
/** 参数 domain: 协议域,AF_INET(IPV4的网络开发) type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文) protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议 返回值 socket,如果 > 0 就表示成功 */ self.clientSocket = socket(AF_INET, SOCK_STREAM, 0); NSLog(@"%d", self.clientSocket);
连接到主机
/** 参数 1> 客户端socket 2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址 服务器的"结构体"地址 提示:C 语言中没有对象 3> 结构体数据长度 返回值 0 成功/其他 错误代号,非0即真 */ struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); serverAddr.sin_port = htons(12345); return connect(self.clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr)) == 0;
调用连接到主机
if (![self connectToHost]) { NSLog(@"失败"); return; } NSLog(@"成功");
发送消息
/** 参数 1> 客户端socket 2> 发送内容地址 void * == id 3> 发送内容长度 4> 发送方式标志,一般为0 返回值 如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR */ NSString *msg = @"约?"; ssize_t sendLen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0); NSLog(@"发送 %ld %tu %ld", sendLen, msg.length, strlen(msg.UTF8String));
接收消息
/** 参数 1> 客户端socket 2> 接收内容缓冲区地址 3> 接收内容缓存区长度 4> 接收方式,0表示阻塞,必须等待服务器返回数据 返回值 如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR */ uint8_t buffer[1024]; ssize_t recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 0); NSLog(@"接收了 %ld %ld", recvLen, sizeof(buffer)); NSString *result = [[NSString alloc] initWithBytes:buffer length:recvLen encoding:NSUTF8StringEncoding]; return result;
断开连接
- (void)disconnect { close(self.clientSocket); }
加载百度[/code]
修改接收函数
- (NSString *)sendAndRecv:(NSString *)msg { // 1. 发送 ssize_t sendLen = send(self.clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0); NSLog(@"发送 %ld %tu %ld", sendLen, msg.length, strlen(msg.UTF8String)); // 2. 接收 uint8_t buffer[1024]; NSMutableData *dataM = [NSMutableData data]; ssize_t recvLen = -1; while (recvLen != 0) { recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 0); [dataM appendBytes:buffer length:recvLen]; } NSString *result = [[NSString alloc] initWithData:dataM encoding:NSUTF8StringEncoding]; // 3. 断开连接 [self disconnect]; return result; }
相关文章推荐
- 【Python】调用WPS V9 API,实现PPT转PDF
- CentOS6.7配置静态IP
- glog安装与使用
- Nginx配置相关结构划分的技巧和禁止IP访问
- Photoshop、Illustrator思维导图笔记
- gradle of Andorid(一·)
- 内存管理图解---------页目录表 页表
- leetcode之Search a 2D Matrix II
- 关于Android import-module 和NDK_MODULE_PATH
- [OHCI]架构
- jw player去掉logo 二次开发
- vcenter web登陆时自动记住用户名密码的方法
- 大数据导入Excel
- 谱聚类的实现
- Learn Python The Hard Way(0--26)
- 谱聚类的实现
- 关于NSURLConnection的理解的和Demo
- 最简单的mfc程序
- 数据结构: 无向图和有向图的API
- ASP.NET - 使用 XML