iOS Socket通信编程
最近想在两个project进行一些数据的交换,以达到模拟服务器对应用程序进行操控的效果,所以想到了利用socket双向通信链接,在此对研究结果记录一下。
Socket概念
socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,UDP连接同理。
客户端
创建Socket:
//函数
int socket(int domain, int type, int protocol);
//实例
int socketClient = socket(AF_INET, SOCK_STREAM, 0);
//返回一个代表此Socket的描述符
int domain
:表示所使用的协议族,通常为PF_INET或者是AF_INET。
int type
:指定socket的类型,SOCK_STREAM(TCP类型)或SOCK_DGRAM(UDP类型)。
int protocol
:表示允许程序使用底层协议,通常为0。
连接服务器:
//函数
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
//实例
int iTmp = connect(socketServer, (struct sockaddr *) &socketParameters, sizeof(socketParameters));
//返回一个代表连接成功与否的整型,成功则返回0,失败则返回错误码
int sockfd
:表示标识客户端的套接字。
struct sockaddr * serv_addr
:套接字想要连接的服务端的相关多个信息,用结构体来表示。
int addrlen
:服务端信息的长度。
接受数据:
//函数
int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);
//实例
int length = recv(socketServer, recvbuffer, BUFFER_SIZE,0);
//返回一个代表接收到的实际数据的长度,一定需要比缓冲区预留的长度小
_In_ SOCKET s
:同样是客户端的套接字。
_Out_ char *buf
:存放接收到的数据的缓冲区。
int addrlen
:接受数据的缓冲区的长度。
_In_ int flags
:一般置为0即可。
发送数据:
//函数
int send( SOCKET s, const char FAR *buf, int len, int flags );
//实例
int length = send(socketServer, "3", 1, 0);
SOCKET s
:套接字描述符。
const char FAR *buf
:存放发送的数据的缓冲区。
int len
:发送数据的长度。
int flags
:一般置为0即可。
关闭Socket:
close(socketServer);
服务器端
创建Socket:
函数与客户端一样在此不在赘述。
绑定Socket:
//函数
int bind(int sockfd, struct sockaddr * my_addr, int addrlen);
//实例
bind(g_socketServer,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
g_socketServer
:同样是套接字描述符。
(struct sockaddr*)&serverAddr
:需要一个结构体描述套接字的信息
(struct sockaddr*)&serverAddr
:其结构体的结构长度
监听Socket:
//函数
int listen(int s, int backlog);
//实例
listen(g_socketServer, LENGTH_OF_LISTEN_QUEUE);
g_socketServer
:套接字描述符。
int backlog
:等待连接队列的最大长度。