Objective-c 服務端

//
//  main.m
//  服務端12-11
//
//  Created by dc004 on 15/12/11.
//  Copyright © 2015年 gang. All rights reserved.
//

#import <Foundation/Foundation.h>
//提供socket函數以及數據結構
#include <sys/socket.h>
//定義數據結構
#include <netinet/in.h>
//提供IP地址轉換函數
#include <arpa/inet.h>
int main() {
   //服務端順序:socket->bind->listen->while(true) accept->do while recv ->close
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    BOOL success = (fd != -1);
    struct sockaddr_in addr;
    int err;
    //服務端地址設置
    if (success) {
        NSLog(@"socket success");
        memset(&addr, 0, sizeof(addr));
        addr.sin_len = sizeof(addr);
        addr.sin_family = AF_INET;//IPv4
        addr.sin_port = htons(1024);
        addr.sin_addr.s_addr = INADDR_ANY;
        //進行綁定
        err = bind(fd, (const struct sockaddr*)&addr, sizeof(addr));
        success = (err == 0);
    }if (success) {
        NSLog(@"bind成功");
        //listen監聽
        //第二個參數爲等待接收的鏈接的隊列的大小。好比在connect請求過來的時候,完成三次握手後先將鏈接放到隊列中,直到被accept處理。若是這個隊列滿了,而且又有新的鏈接的時候,對方可能會收到錯誤信息。
        err = listen(fd, 5);
        success = (err == 0);
    }if (success) {
        NSLog(@"listen success");
        while (true) {
            struct sockaddr_in clientaddr;
            //定義客戶端的套接字,用於獲取接收到的客戶端套接字。
            int clientfd;
            //定義一個地址長度變量,接收客戶端的長度
            socklen_t addrLen;
            addrLen = sizeof(clientaddr);
            NSLog(@"準備接收");
            //accept函數
            //第二個參數用於返回客戶端的協議地址
            //第三個參數爲協議地址的長度
            clientfd = accept(fd, (struct sockaddr*)&clientaddr, &addrLen);
            success = (clientfd != -1);
            if (success) {
                char buf[1024];
                ssize_t count;//用於接收函數的返回值
                size_t len = sizeof(buf);
                do{
                    //recv()成功返回實際讀入緩衝的數據字節數。
                    count = recv(clientfd, buf, len, 0);
                    if (count < 0) {
                        NSLog(@"再見");
                        break;
                    }
                    //輸出(將c語言字符串轉換成oc字符串輸出)
                    NSString *str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding];
                    NSLog(@"%@",str);
                    
                    
                }while (strcmp(buf, "exit") != 0);
            }
            //關閉客戶端:只是關閉這個套接字特定的TCP鏈接
            close(clientfd);
        }
    }
    
    return 0;
}
相關文章
相關標籤/搜索