// // 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; }