iOS socket編程(入門)

來源:互聯網
上載者:User

標籤:

1.基於 C 的 BSD socket(UNIX系統中通用的網路介面)

感覺BSD socket 最容易理解,最容易入門,最為靈活     但是最難用,尤其對於大型項目

需要匯入標頭檔

#import <sys/socket.h>#import <netdb.h>

伺服器端

    int    listenfd, connfd;    struct sockaddr_in     servaddr;    char    buff[4096];    long     n;    int i=100;        //建立 socket    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);        return;    }        //初始化ip地址    memset(&servaddr, 0, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    servaddr.sin_port = htons(8088);//要與用戶端請求的連接埠網址一樣        //綁定 網址連接埠    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);        return;    }        //監聽 網址連接埠    if( listen(listenfd, 10) == -1){        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);        return;    }        //接受伺服器傳來的資料    printf("======waiting for client's request======\n");    while(i>0){        if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){            printf("accept socket error: %s(errno: %d)",strerror(errno),errno);            continue;        }        n = recv(connfd, buff, MAXLINE, 0);        buff[n] = '\0';        printf("recv msg from client: %s\n", buff);        close(connfd);    }        //關閉socket    close(listenfd);

用戶端

-(void)sendDataToServerURL:(NSURL *)url{    int    sockfd;    char    sendline[4096];    struct sockaddr_in    servaddr;    NSString * host = [url host];        //建立 socket    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){        printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);        return;    }            //初始化ip地址    struct hostent * hostEnt = gethostbyname([host UTF8String]);//根據網域名稱 擷取ip資訊    if (NULL == hostEnt) {        NSLog(@"解析網域名稱失敗");        return;    }    struct in_addr * remoteInAddr = (struct in_addr *)hostEnt->h_addr_list[0];        memset(&servaddr, 0, sizeof(servaddr));    servaddr.sin_family = AF_INET;    servaddr.sin_port = htons(8088);    servaddr.sin_addr = *remoteInAddr;        //連結TCP伺服器(根據ip地址)    if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);        return;    }        //發送字串到TCP伺服器    printf("send msg to server: \n");    fgets(sendline, 4096, stdin);    if(send(sockfd, sendline, strlen(sendline), 0) < 0)    {        printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);        return;    }        //關閉socket    close(sockfd);}

2.FCSocket 介面比BSD socket多的多

伺服器端和BSD socket有點類似,

用戶端的與BSD socket完全不同,使用的是輸入輸出資料流。

伺服器端

//收到訊息監聽static void handleConnect(CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){    NSLog(@"收到資訊了");}-(void)openFCSocket{    //建立 socket    const CFSocketContext socketCtxt = {0, (__bridge void *)self, NULL, NULL, NULL};    CFSocketRef  cfSocket = CFSocketCreate(                                           kCFAllocatorDefault,                                           PF_INET,                                           SOCK_STREAM,                                           IPPROTO_TCP,                                           kCFSocketAcceptCallBack,                                           (CFSocketCallBack)handleConnect,//接受資訊回調                                           &socketCtxt);        if (cfSocket == NULL) {        NSLog(@"建立Socket失敗");        return;    }            //初始化ip地址    struct sockaddr_in sin;    memset(&sin, 0, sizeof(sin));    sin.sin_len = sizeof(sin);    sin.sin_family = AF_INET; /* Address family */    sin.sin_port = htons(8088); /* Or a specific port */    sin.sin_addr.s_addr= INADDR_ANY;            //綁定 網址連接埠    CFDataRef sincfd = CFDataCreate(                                    kCFAllocatorDefault,                                    (UInt8 *)&sin,                                    sizeof(sin));        if (kCFSocketSuccess != CFSocketSetAddress(cfSocket, sincfd)) {        NSLog(@"綁定網址連接埠失敗");    }    CFRelease(sincfd);            //將socket加入  run loop    CFRunLoopSourceRef socketsource = CFSocketCreateRunLoopSource(                                                                  kCFAllocatorDefault,                                                                  cfSocket,                                                                  0);    CFRunLoopAddSource(                       CFRunLoopGetCurrent(),                       socketsource,                       kCFRunLoopDefaultMode);}

用戶端

    NSString *host = @"127.0.0.1";    int port = 8088;    //建立輸入 輸出資料流    CFReadStreamRef readStream;    CFWriteStreamRef writeStream;    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)host,                                       port, &readStream, &writeStream);    NSInputStream *inputStream = (__bridge NSInputStream *)readStream;    NSOutputStream *outputStream = (__bridge NSOutputStream *)writeStream;        if (inputStream == nil || outputStream == nil) {        NSLog(@"流建立失敗!");        return ;    }        //啟動輸入 輸出資料流    [inputStream open];    [outputStream open];            //發送資料    NSData *outgoingDataBuffer =  [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];    NSInteger writtenBytes = [outputStream write:outgoingDataBuffer.bytes maxLength:outgoingDataBuffer.length];    if ( writtenBytes == -1 ) {        NSLog(@"發送失敗");        return;    }    NSLog(@"發送成功");

3. CocoaAsyncSocket封裝了CFSocket

實現了TCP,UDP,加入非同步線程,斷開重連,TLS/SSL等等,實際開發中需要實現的的東西。

如果沒時間重複造輪子,用這類第三方架構也不錯



iOS socket編程(入門)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.