如何使用系统自带文件实现socket通信之服务器端
1.首先搭建服务器端
注意: 这里创建文件是在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));
3.监听
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; }