// socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0), 则使用缺省的连接方式。 socket(af,type,protocol) // 将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号). bind(sockid, local addr, addrlen) // 创建一个套接口并监听申请的连接. listen( Sockid ,quenlen) // 用于建立与指定socket的连接. connect(sockid, destaddr, addrlen) // 在一个套接口接受一个连接. accept(Sockid,Clientaddr, paddrlen) // 用于向一个已经连接的socket发送数据,如果无错误,返回值为所发送数据的总数,否则返回SOCKET_ERROR。 send(sockid, buff, bufflen) // 用于已连接的数据报或流式套接口进行数据的接收。 recv() // 指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包 (参数为SOCK_DGRAM) sendto(sockid,buff,…,addrlen) // 用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。 recvfrom() // 关闭Socket连接 close(socked)
// 1、 创建socket /** 参数 domain: 协议域,AF_INET --> IPV4 type: Socket 类型, SOCK_STREAM(TCP)/SOCKET_DGRAM(报文 UDP) protocol: IPPROTO_TCP,如果传入0,会自动根据第二个参数,选择合适的协议 返回值 socket */ int clientSocket = socket(AF_INET, SOCK_STREAM, 0); // 2、 连接到服务器 /** 参数 1> 客户端socket 2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址 3> 结构体数据长度 返回值 0 成功/其他 错误代号 */ struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; //端口 serverAddr.sin_port = htons(12345); //地址 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr)); if (connResult == 0) { NSLog(@"连接成功"); }else{ NSLog(@"连接失败 %zi",connResult); return; } // 3、发送数据到服务器 /** 参数 1> 客户端socket 2> 发送内容地址 3> 发送内容长度 4> 发送方式标志,一般为0 返回值 如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR */ NSString *sendMsg = @"Hello"; ssize_t sendLen = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0); NSLog(@"发送了 %zi 个字节",sendLen); // 4、 从服务器接受数据 /** 参数 1> 客户端socket 2> 接受内容缓冲区地址 3> 接受内容缓冲区长度 4> 接收方式,0表示阻塞,必须等待服务器返回数据 返回值 如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR */ uint8_t buffer[1024];//将空间准备出来 ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0); NSLog(@"接收到了 %zi 个字节",recvLen); NSData *data = [NSData dataWithBytes:buffer length:recvLen]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"接收到数据为 %@",str); // 5、 关闭 close(clientSocket);
#import "GCDAsyncSocket.h" @interface ViewController2 ()<GCDAsyncSocketDelegate> @property (nonatomic, strong) GCDAsyncSocket *clientSocket; @end @implementation ViewController2 - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 400, 300, 60)]; btn.backgroundColor = [UIColor orangeColor]; [btn setTitle:@"发送数据" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; self.clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [self.clientSocket connectToHost:@"127.0.0.1" onPort:12345 error:&error]; if (error) { NSLog(@"error == %@",error); } } - (void)clickBtn{ NSString *msg = @"发送数据: 你好\r\n"; NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding]; // withTimeout -1 : 无穷大,一直等 // tag : 消息标记 [self.clientSocket writeData:data withTimeout:-1 tag:0]; } - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { NSLog(@"链接成功"); NSLog(@"服务器IP: %@-------端口: %d",host,port); } - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { NSLog(@"发送数据 tag = %zi",tag); [sock readDataWithTimeout:-1 tag:tag]; } - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"读取数据 data = %@ tag = %zi",str,tag); // 读取到服务端数据值后,能再次读取 [sock readDataWithTimeout:- 1 tag:tag]; } - (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { NSLog(@"断开连接"); self.clientSocket.delegate = nil; self.clientSocket = nil; } @end
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用:18652367614 发表于 2018-03-27 15:39 解析地很详细啊,比有些书上的还要深入
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.140625 second(s), 45 queries , Gzip On.