標籤:
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編程(入門)