Socket的基本使用步骤

一.使用Socket,首先需要导入这几个系统头文件

  #import <sys/socket.h>

  #import <netinet/in.h>

  #import <arpa/inet.h>

二.然后就是进行Socket代码的编写,先来看看实现一个简单的Socket通信需要哪些步骤:

  >1.创建客户端Socket;

  >2.创建服务器Socket;

  >3.连接两个Socket;

  >4.客户端Socket发送信息给服务器(发送请求的过程);

  >5.服务器响应客户端的请求,返回给客户端数据(服务器响应的过程);

  >6.客户端接受服务器返回的数据;

  >7.关闭Socket;

三.下面要进行详细的Socket代码实现了.

 

  1.创建客户端Socket

  //参数1:协议域: 遵守的IP协议类型! AF_INET:IPv4  AF_INET6:IPv6

  //参数2:端口类型: TCP:SOCK_STREAM   UDP:SOCK_DGRAM

  // 参数3: 选择的协议类型! 一般传0 会根据第二个参数自动选择协议类型!

  // 返回值: 如果返回值>0 ,标示 Socket 创建成功!

  int SocketNumber = socket(AF_INET,SOCK_STRESM,0);

  

  

  2. 创建服务器端 Socket

      struct sockaddr_in serverAddress;

     // 主机 /端口

      // 设置 服务器Socket 遵循的 IP 协议类型为 IPv4

      serverAddress.sin_family = AF_INET;

    

    // 服务器 Socket IP 地址

    serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");

    

    // 设置服务器Socket 的端口号;

    // 端口号的最大值 65535;  09~1024 是系统默认占用的端口号!不要设置!

    // 如果需要手动设置端口号: 一般设置 1024 ~ 65535 之间的值!

    serverAddress.sin_port = htons(3456);

    

    

    3. 连接两个 Socket

    // 参数1: 客户端的 Socket

    // 参数2: 服务器端 Socket/结构体 (const struct sockaddr *)&serverAddress 强制类型转换

    // 参数3: 第二个参数的长度! sizeof(serverAddress) 计算长度! 计算的是内存地址的长度!

    // 返回值: 如果返回值为0 代表连接成功!

    // 返回值 != 0 ,代表连接失败!

    // 如果想要连接成功,必须实时监测服务器端的端口!

    // 监测服务器端口: nc -lk 12345

    int conn = connect(SocketNumber, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));

 

        4. 发送信息给服务器

    // 参数1: 客户端 Socket

    // 参数2: void * 传递给服务器的数据!  msg.UTF8String 就是直接将 OC 数据转换成 C 语言的数据类型!

    // 参数3: size_t 锁传递给服务器数据的长度!

    // 参数4: 0 等待服务器响应数据!

    

    NSString *msg = @"hello socket";

    

    send(SocketNumber, msg.UTF8String, strlen(msg.UTF8String), 0);

    

     5.接受服务器返回的数据!

    // 参数1:客户端 Socket :服务器确定返回给哪一个客户端数据.

    // 参数2:void * :接收服务器返回数据的地址(区域)

    // 参数3:size_t :接受地址的长度

    // 参数4:0 等待服务器返回数据!

    // 返回值: 就是服务器返回的数据长度!

    

    ssize_t buffer[1024];

    

    ssize_t length = recv(SocketNumber, buffer,sizeof(buffer), 0);

    

    // 获得服务器返回的数据( buffer 中取出需要的数据)

    

    // 根据二进制数据,拼接字符串

    // Bytes: 网络中传递的数据流(比特流/字节)

    NSString *returnMsg = [[NSString alloc] initWithBytes:buffer length:length encoding:NSUTF8StringEncoding];

    

    6.一个请求结束之后(接收到响应之后),需要手动关闭Socket!

    close(SocketNumber);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2015-12-01 17:58  X·星子  阅读(4828)  评论(0编辑  收藏  举报