Socket
一、Socket编程的简介
1.Socket就是为网络服务提供的一种机制。
2.通信的两端都是 Socket。
3.网络通信其实就是 Socket 间的通信。
4.数据在两个 Socket 间通过 IO 传输。
5.Socket 是纯C语言的,是跨平台的。
Socket通讯示意图.png
二、Socket的建立和连接
1、导入三个头文件
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
2、创建socket
/*参数
domain: 协议域/协议族,AF_INET(IPV4的网络开发)
type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数自动选择协议
返回值
socket,如果>0 就表示成功/
int clientSocket = socket(AF_INET, SOCK_STREAM,0);
3、连接到服务器
/*
参数
1> 客户端socket
2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址。即服务器的“结构体”地址
3> 结构体数据长度
返回值
0 成功/其他错误代号,非0即真
*/
struct sockaddr_in serverAddress;
//协议族
serverAddress.sin_family = AF_INET;
//ip 找机器
serverAddress.sin_addr.s_addr =inet_addr("127.0.0.1");
//端口号找程序
serverAddress.sin_port = htons(12345);
//连接服务器
int result = connect(clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
if (result == 0)
{
NSLog(@"成功");
}else {
NSLog(@"失败");
}
友情提示
在C语言开发时,如果要传递结构体的地址,通常会一起传递结构的长度。因为C 语言中取数据是通过指针寻址的,告诉长度的目的是防止取错数据。
在终端输入:nc-lk 12345 相当于在本机上启动了一个服务器,ip是本机地址,端口号是12345。
三、发送和接收数据
1、发送数据
/**
参数
1> 客户端socket
2> 发送内容地址void * == id
3> 发送内容长度,是指字节的长度。
4> 发送方式标志,一般为0
返回值
如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
*/
NSString *msg = @"约?";
ssize_t sendLenght = send(clientSocket,msg.UTF8String, strlen(msg.UTF8String),0);
NSLog(@"发送了%ld长度的字节,字符串长度%zd",sendLenght,msg.length);
2、接收数据
/**
参数
1> 客户端socket
2> 接收内容地址
3> 长度,表示一次最多接收服务器返回的多少字节内容。
4> 接收标志,一般填0,表示阻塞式的,一直等待服务器返回数据
返回值
接收数据的长度
*/
//缓冲区,准备接受来自服务器的数据
//C语言中,数组的名字,就是指向数组第一个元素的指针。
uint8_t buffer[1024];
ssize_t recvLen = recv(clientSocket, buffer,sizeof(buffer),0);
NSLog(@"接收%ld 字节",recvLen);
//获得服务器返回的二进制数据
NSData*data = [NSData dataWithBytes:buffer length:recvLen];
//将二进制数据转化成字符串
NSString*resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"接收到的内容是:%@",resultStr);
四、关闭连接
//断开连接
close(clientSocket);