注意: 这里创建文件是在Xcode的OSX下面的命令行创建的 因为一会客户端使用的iOS模拟器,而Xcode是不能同时运行两个模拟器的
具体就是 新建工程 >> OS X >> Application >> command Lind Tool
实现socket通信无论是客户端还是服务器端都需要引入四个文件
#import <sys/types.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
搭建socket通信大致分为四个步骤
1.创建socket
2.绑定socket和端口号
3.监听
4.接收来自客户端的请求,连接之后会产生新的socket,专门用来跟客户进行数据传输
5.接收数据 或者 发送数据
6.需要的时候关闭socket
每一个步骤的具体实现如下
1.创建socket
socket()函数有一个int的返回值, 在下面的步骤中 都会用到这个返回值
// 1.创建socket
// socket函数参数含义如下所示: socket(<#int#>, <#int#>, <#int#>)
// 参数1.网络层对应的协议是IPV4(AF_NET)还是IPV6(AF_NET16)
// 参数2.使用的是tcp还是udp传输 (参数点进去看 有系统注释)
// 参数3.一般情况下给0,由系统根据第二个参数自行决定。
int socketDescripter = socket(AF_INET, SOCK_STREAM, 0);
2.绑定socket和端口号
绑定socket和端口需要使用函数 bind(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>)
参数1 就是我们步骤1创建的 socketDescripter
参数2 是一个 系统sockaddr的结构体 里面包含了我们需要绑定的信息
参数3 结构体的大小
// 2.绑定socket和端口号
struct sockaddr_in sockAddr = {0};
// 设置网络层协议
sockAddr.sin_family = AF_INET;
// 设置ip地址
sockAddr.sin_addr.s_addr = INADDR_ANY;
// 设置端口号---网络字节序
sockAddr.sin_port = htons(8910);
bind(socketDescripter, (const struct sockaddr *)&sockAddr, sizeof(sockAddr));
4.接收来自客户端的请求,连接之后会产生新的socket,专门用来跟客户进行数据传输
5.接收数据 或者 发送数据
6.需要的时候关闭socket
// 3.监听
listen(socketDescripter, 40);
while (1) {
// 4.接收来自客户端的连接请求,连接之后会产生新的socket,专门用来跟客户端进行数据传输。
struct sockaddr_in clientSockAddr = {0};
unsigned int length = sizeof(clientSockAddr);
//创建一个socket专门用来和用户端进行通信
int clientSocket = accept(socketDescripter, (struct sockaddr *restrict)&clientSockAddr, &length);
// 5.接收数据或者是发送数据
printf("accept:%s\n",inet_ntoa(clientSockAddr.sin_addr));
send(clientSocket, "hello world", 12, 0);//这个函数就是发送我们的内容
// // 6.关闭socket
// close(clientSocket);
}
到这里 我们服务器端就创建好了 整个页面的代码如下 可以全部copy使用
#import <Foundation/Foundation.h>
#import <sys/types.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// 1.创建socket
// socket函数参数含义如下所示:
// 1.网络层对应的协议是IPV4还是IPV6
// 2.使用的是tcp还是udp传输
// 3.一般情况下给0,由系统根据第二个参数自行决定。
int socketDescripter = socket(AF_INET, SOCK_STREAM, 0);
// 2.绑定socket和端口号
struct sockaddr_in sockAddr = {0};
// 设置网络层协议
sockAddr.sin_family = AF_INET;
// 设置ip地址
sockAddr.sin_addr.s_addr = INADDR_ANY;
// 设置端口号---网络字节序
sockAddr.sin_port = htons(8910);
bind(socketDescripter, (const struct sockaddr *)&sockAddr, sizeof(sockAddr));
// 3.监听
listen(socketDescripter, 40);
while (1) {
// 4.接收来自客户端的连接请求,连接之后会产生新的socket,专门用来跟客户端进行数据传输。
struct sockaddr_in clientSockAddr = {0};
unsigned int length = sizeof(clientSockAddr);
int clientSocket = accept(socketDescripter, (struct sockaddr *restrict)&clientSockAddr, &length);
// 5.接收数据或者是发送数据
printf("accept:%s\n",inet_ntoa(clientSockAddr.sin_addr));
send(clientSocket, "hello world", 12, 0);
// // 6.关闭socket
// close(clientSocket);
}
}
return 0;
}