美文网首页
socket server 篇章

socket server 篇章

作者: f8d1cf28626a | 来源:发表于2022-07-14 15:04 被阅读0次

socket

#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

步骤一:端口和IP

#define SocketPort htons(8040)
#define SocketIP   inet_addr("127.0.0.1")

// 最大连接数
static int const kMaxConnectCount = 5;

步骤二:创建socket

    // 创建socket
    self.serverId = socket(AF_INET, SOCK_STREAM, 0);
    
    if (self.serverId == -1) {
        NSLog(@"创建socket 失败");
        return;
    }
    NSLog(@"创建socket 成功");

步骤3:将端口和地址 赋值给socket api

    // 端口
    struct sockaddr_in socketAddr;
    socketAddr.sin_family   = AF_INET;
    socketAddr.sin_port     = SocketPort;
    
    // IP
    struct in_addr  socketIn_addr;
    socketIn_addr.s_addr    = SocketIP;
    // 端口绑定IP
    socketAddr.sin_addr     = socketIn_addr;
    
    // 清空
    bzero(&(socketAddr.sin_zero), 8);

步骤四:绑定 socket

int bind_result = bind(self.serverId, (const struct sockaddr *)&socketAddr, sizeof(socketAddr));
    if (bind_result == -1) {
        NSLog(@"绑定socket 失败");
        return;
    }

    NSLog(@"绑定socket成功");

步骤五:监听 listen

 // 3: 监听socket
    int listen_result = listen(self.serverId, kMaxConnectCount);
    if (listen_result == -1) {
        NSLog(@"监听失败");
        return;
    }
    
    NSLog(@"监听成功");

步骤六:接受客户端的链接

for (int i = 0; i < kMaxConnectCount; i++) {
        [self acceptClientConnet];
    }

- (void)acceptClientConnet{
    // 阻塞线程
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        struct sockaddr_in client_address;
        socklen_t address_len;
        // accept函数
        int client_socket = accept(self.serverId, (struct sockaddr *)&client_address, &address_len);
        self.client_socket = client_socket;
        
        if (client_socket == -1) {
            NSLog(@"接受 %u 客户端错误",address_len);
            
        }else{
            NSString *acceptInfo = [NSString stringWithFormat:@"客户端 in,socket:%d",client_socket];
            NSLog(@"%@",acceptInfo);
            [self receiveMsgWithClietnSocket:client_socket];
        }
    });
}
  • [self receiveMsgWithClietnSocket:client_socket];
- (void)receiveMsgWithClietnSocket:(int)clientSocket{
    while (1) {
        // 5: 接受客户端传来的数据
        char buf[1024] = {0};
        long iReturn = recv(clientSocket, buf, 1024, 0);
        if (iReturn>0) {
            NSLog(@"客户端来消息了");
            // 接收到的数据转换
            NSData *recvData  = [NSData dataWithBytes:buf length:iReturn];
            NSString *recvStr = [[NSString alloc] initWithData:recvData encoding:NSUTF8StringEncoding];
            NSLog(@"%@",recvStr);
            
        }else if (iReturn == -1){
            NSLog(@"读取消息失败");
            break;
        }else if (iReturn == 0){
            NSLog(@"客户端走了");
            
            close(clientSocket);
            
            break;
        }
    }
}

步骤七:发送消息给客户端

const char *msg = self.sendMsgContent_tf.text.UTF8String;
    ssize_t sendLen = send(self.client_socket, msg, strlen(msg), 0);
    NSLog(@"发送了:%ld字节",sendLen);
    // 清空文本框
    self.sendMsgContent_tf.text = @"";

步骤八:关闭 客户端socket

int close_result = close(self.client_socket);
    
    if (close_result == -1) {
        NSLog(@"socket 关闭失败");
        return;
    }else{
        NSLog(@"socket 关闭成功");
    }

相关文章

网友评论

      本文标题:socket server 篇章

      本文链接:https://www.haomeiwen.com/subject/uatfirtx.html