zoukankan      html  css  js  c++  java
  • Socket 基本使用

     

    • 导入头文件
    #import <sys/socket.h>
    #import <netinet/in.h>
    #import <arpa/inet.h>
    
    • 定义属性
    @interface ViewController ()
    /// 客户端 socket
    @property (nonatomic, assign) int clientSocket;
    @end
    
    • 建立 socket
    /**
     参数
    
     domain:    协议域,AF_INET(IPV4的网络开发)
     type:      Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
     protocol:  IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议
    
     返回值
     socket,如果 > 0 就表示成功
     */
    self.clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    
    NSLog(@"%d", self.clientSocket);
    
    • 连接到主机
    /**
     参数
     1> 客户端socket
     2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址
         服务器的"结构体"地址
         提示:C 语言中没有对象
     3> 结构体数据长度
    
     返回值
        0 成功/其他 错误代号,非0即真
     */
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serverAddr.sin_port = htons(12345);
    
    return connect(self.clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr)) == 0;
    
    • 调用连接到主机
    if (![self connectToHost]) {
        NSLog(@"失败");
        return;
    }
    NSLog(@"成功");
    
    • 发送消息
    /**
     参数
     1> 客户端socket
     2> 发送内容地址 void * == id
     3> 发送内容长度
     4> 发送方式标志,一般为0
    
     返回值
        如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
     */
    NSString *msg = @"约?";
    ssize_t sendLen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);
    NSLog(@"发送 %ld %tu %ld", sendLen, msg.length, strlen(msg.UTF8String));
    
    • 接收消息
    /**
     参数
     1> 客户端socket
     2> 接收内容缓冲区地址
     3> 接收内容缓存区长度
     4> 接收方式,0表示阻塞,必须等待服务器返回数据
    
     返回值
        如果成功,则返回读入的字节数,失败则返回SOCKET_ERROR
     */
    uint8_t buffer[1024];
    ssize_t recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"接收了 %ld %ld", recvLen, sizeof(buffer));
    
    NSString *result = [[NSString alloc] initWithBytes:buffer length:recvLen encoding:NSUTF8StringEncoding];
    
    return result;
    
    • 断开连接
    - (void)disconnect {
        close(self.clientSocket);
    }
  • 相关阅读:
    BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(分块)
    BZOJ 4241 历史研究(分块)
    BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
    hdu 5412 CRB and Queries(整体二分)
    POJ2104 K-th Number(整体二分)
    luogu P3157 [CQOI2011]动态逆序对(CDQ分治)
    陌上开花(CDQ分治)
    BZOJ 1176[Balkan2007]Mokia(CDQ分治)
    BZOJ 3626 LCA(离线+树链剖分+差分)
    bzoj1592 Making the Grade
  • 原文地址:https://www.cnblogs.com/chzheng/p/5962499.html
Copyright © 2011-2022 走看看