Socket
Socket又称“套接字”,应用程序通过“套接字”向网络发送请求或向网络做出应答
网络通信其实就是Socket之间的通信
数据在两个Socket之间通过IO传输数据
Socket是纯C语言的,是跨平台的
HTTP协议是基于Socket的,HTTP协议的底层使用的就是Socket
Socket的通信过程
创建Socket
连接到服务器
发送数据给服务器
从服务器接收数据
关闭连接
Socket的创建
导入头文件
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
创建Socket
int socket(int domain, int type, int protocol);
//参数1 domain 协议域 AF_INET--IPV4
//参数2 type socket类型 SOCK_STREAM(TCP)/SOCKET_DGRAM(UDP)
//参数3 protocol IPPROTO_TCP/IPPROTO_UDP 如果 传入0 会根据第二个参数选择合适的值
//返回值 >0 创建成功 socket的描述符
示例:int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
连接服务器
打开Netcat,模拟服务器
打开终端
nc -lk 12345
nc-->Netcat 终端下用于调试和检查网络的工具
连接服务器
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
//参数1 sockfd 客户端socket
//参数2 serv_addr 服务器地址结构体指针
//参数3 addrlen 结构体数据长度
//返回值 成功则返回0,失败返回非0
示例:
//返回值 成功则返回0,失败返回非0
struct sockaddr_in serverAddr;
//IPV4
serverAddr.sin_family = AF_INET;
//端口
serverAddr.sin_port = htons(12345);
//ip地址
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(@"连接失败");
}
Socket收发数据
发送数据给服务器
const char *sendMessage = "hello world";
ssize_t sendLen = send(clientSocket, sendMessage, strlen(sendMessage), 0);
NSLog(@"发送的字节数:%ld",sendLen);
接收服务器返回的数据
uint8_t buffer[1024];
ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
if (recvLen > 0) {
NSLog(@"接收了%ld个字节",recvLen);
//从缓冲区读取数据
NSData *data = [NSData dataWithBytes:buffer length:recvLen];
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",msg);
}
关闭连接
Socket又称“套接字”,应用程序通过“套接字”向网络发送请求或向网络做出应答
网络通信其实就是Socket之间的通信
数据在两个Socket之间通过IO传输数据
Socket是纯C语言的,是跨平台的
HTTP协议是基于Socket的,HTTP协议的底层使用的就是Socket
Socket的通信过程
创建Socket
连接到服务器
发送数据给服务器
从服务器接收数据
关闭连接
Socket的创建
导入头文件
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
创建Socket
int socket(int domain, int type, int protocol);
//参数1 domain 协议域 AF_INET--IPV4
//参数2 type socket类型 SOCK_STREAM(TCP)/SOCKET_DGRAM(UDP)
//参数3 protocol IPPROTO_TCP/IPPROTO_UDP 如果 传入0 会根据第二个参数选择合适的值
//返回值 >0 创建成功 socket的描述符
示例:int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
连接服务器
打开Netcat,模拟服务器
打开终端
nc -lk 12345
nc-->Netcat 终端下用于调试和检查网络的工具
连接服务器
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
//参数1 sockfd 客户端socket
//参数2 serv_addr 服务器地址结构体指针
//参数3 addrlen 结构体数据长度
//返回值 成功则返回0,失败返回非0
示例:
//返回值 成功则返回0,失败返回非0
struct sockaddr_in serverAddr;
//IPV4
serverAddr.sin_family = AF_INET;
//端口
serverAddr.sin_port = htons(12345);
//ip地址
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(@"连接失败");
}
Socket收发数据
发送数据给服务器
const char *sendMessage = "hello world";
ssize_t sendLen = send(clientSocket, sendMessage, strlen(sendMessage), 0);
NSLog(@"发送的字节数:%ld",sendLen);
接收服务器返回的数据
uint8_t buffer[1024];
ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
if (recvLen > 0) {
NSLog(@"接收了%ld个字节",recvLen);
//从缓冲区读取数据
NSData *data = [NSData dataWithBytes:buffer length:recvLen];
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",msg);
}
关闭连接
close(clientSocket);