使用系统文件实现socket通信--服务器端搭建

如何使用系统自带文件实现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;
}



猜你喜欢

转载自blog.csdn.net/iosyangming/article/details/50775041