ios中利用BSDSocket进行网络通信(客户端篇)
来源:互联网 发布:手机充电加速软件 编辑:程序博客网 时间:2024/06/04 05:50
最近在学习网络编程,发现BSDSocket进行网络通信是一件比较有趣的事情,顺便记下笔记
详情如下:
- (void)createSocketClientWithURL:(NSURL*)url{
// int socket(int addressFamily, int type, int protocol)
// addressFamily:IP协议类型 AF_INET指IPV4
// type:socket的类型,一般为字节流stream(SOCK_STREAM) 或 数据报文datagram(SOCK_DGRAM)
// protocol:协议,一般填0,让OS自动选取最佳协议
// 函数返回socket的文件描述符
int socketDecriputor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDecriputor == -1) {
NSLog(@"socket创建失败");
}
//通过服务器的域名得到服务器的ip地址
NSString* hostName = [url host];
NSNumber* port = [url port];
struct hostent* remoteHostEnt = gethostbyname(hostName.UTF8String);
struct in_addr* remoteInAdd = (struct in_addr*)remoteHostEnt->h_addr_list[0];
//sockaddr_in 保存要连接的服务器的相关信息
struct sockaddr_in addParamters;
addParamters.sin_family = AF_INET;
addParamters.sin_addr = *remoteInAdd;
//htons是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处
addParamters.sin_port = htons([port intValue]);
// int connect(int socketFileDescriptor, sockaddr *serverAddress, int serverAddressLength)
// socketFileDescriptor: socket 的文件描述符
// serverAddress:服务器地址
// serverAddressLength:服务器地址长度
// 连接成功返回0,失败返回 -1
int reslut = connect(socketDecriputor, (struct sockaddr *)&addParamters, sizeof(addParamters));
if (reslut == -1) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.resultStr.text = @"连接服务器失败";
}];
return;
}else{
//用于保存从网络中接收的信息
NSMutableData* data = [NSMutableData data];
BOOL waitingForData = YES;
while (waitingForData) {
const char* buffer[1024]; //数据缓存区
long len = sizeof(buffer);
long resutlLen = recv(socketDecriputor, &buffer, len, 0);
if (resutlLen == -1) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.resultStr.text = @"接收失败";
}];
return;
}
[data appendBytes:&buffer length:resutlLen];
if (resutlLen == 0) {
waitingForData = NO;
}
}
close(socketDecriputor);
NSString* resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// UIImage* image = [UIImage imageWithData:data];
//回到主线程刷新页面
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.resultStr.text = resultStr;
// self.imaV.image = image;
}];
}
}
注意的是,当recv函数返回值为0时,一般是对端关闭了socke连接,客户端仍然在接收。
- ios中利用BSDSocket进行网络通信(客户端篇)
- 网络编程(1)--利用socket进行客户端与服务器端的通信
- 利用WSAEventSelect进行网络通信
- 利用select进行网络通信
- iOS 中客户端和服务器的 Web Service 网络通信
- 利用多线程进行多客户端通信
- 【Linux网络编程实例】实例二:利用TCP协议进行客户端与服务器通信
- iOS 中客户端和服务器的 Web Service 网络通信 (1)
- iOS 中客户端和服务器的 Web Service 网络通信 (2)
- iOS 中客户端和服务器的 Web Service 网络通信 (1)
- iOS 中客户端和服务器的 Web Service 网络通信 (2)
- IOS-18-网络通信之Socket通信中服务端与客户端的实现
- android中利用Socket实现手机客户端与PC端进行通信
- LInux中利用线程实现多个客户端和服务器端进行通信
- IOS使用AFNetworking进行网络通信
- Android中利用httpclient进行网络通信的方法(以用户登录为例说明)
- 利用C#进行socket编程(模拟服务器和客户端通信)
- BSDSocket
- mybatis 数据库配置文件
- codeforces problem 701 C They Are Everywhere尺取法
- 你为什么还在用国产的安全软件
- sublime 自定义快捷键 功能增强
- 如何升级cocos2d-x来支持ipv6以及socket怎么支持ipv6
- ios中利用BSDSocket进行网络通信(客户端篇)
- python实现爬虫抓取段子
- 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
- java 解析 Xml ( VTDGen、AutoPilot )的应用
- 用代码和位编译的XAML文件,创建WPF程序
- JPA 各种基本用法
- SVN回滚版本
- js笔记
- 图层