#import <sys/socket.h>

#import <netinet/in.h>

#import <arpa/inet.h>

#import <unistd.h>

/*

     1 创建Socket

     参数

     domain:协议域AF_INET->IPV4

     type: socket类型SOCK_STREAM(TCP) SOCK_DGRAM(UDP)

     protocol :IPPROTO_TCP,如果写0,就会自动根据第二个参数选择

     返回值 :int socket

     */

   

    int clientSocket = socket(AF_INET, SOCK_STREAM, 0);

    /*

     2.连接到服务器

     参数

     1>客户端socket

     2>指向结构图sockaddr的指针,其中包括目的端口的IP地址

     3>结构体数据长度

     返回值 : 0 成功  / 其他 错误代号

     */

    struct sockaddr_in serverAddr;

    //端口号

    serverAddr.sin_port = htons(80);

    

    serverAddr.sin_family=AF_INET;

    

    //ip地址 inet_addr函数,可以将ip地址转成一个数字

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

    

    // nc -lk 12345  终端监听端口号12345的数据

    int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));

    if (connResult == 0) {

        NSLog(@"连接成功");

    }else{

        NSLog(@"连接失败:%d",connResult);

        return;

    }

    

    /*

     3 发送数据

     参数

     1>客户端socket

     2>发送内容地址(指针)

     3>发送内容长度

     4>发生方式标志,一般为0

     返回值

     如果成功,则返回字节数,失败则返回SOCKET_ERROR

     */

    NSString *msg = @"GET / HTTP/1.1\n""Host:www.baidu.com\n\n";

    ssize_t sendlen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);

    NSLog(@"发送了 %ld 个字节",sendlen);

    

    /*

     4. 读取数据

     参数

     1>客户端socket

     2>接受内容缓冲区地址

     3>接受内容缓冲区长度

     4>接受方式,0表示阻塞,必须等待服务器返回数据

     返回值

     如果成功 则返回读入的字节数,失败则返回SOCKET_ERROR

     */

    uint8_t buffer[1024];

    size_t recvlen = recv(clientSocket, buffer, sizeof(buffer), 0);

    NSLog(@"接受到了 %ld 个字节", recvlen  );

    NSData *data = [NSData dataWithBytes:buffer length:recvlen];

    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);

    

    /*

     5.关闭连接

     */

    close(clientSocket);