Socket翻譯成套接字層、插座
Socket就是為網絡服務提供的一種機制
通信的兩端都是Socket
網絡通信其實就是Socket間的通信
數據在兩個Socket間通過IO傳輸
Socket是純C語言的,是跨平臺的
輔助工具 —— NetCat
是終端下用于調試和檢查網絡的工具包
可用于創建 TCP/IP 連接
進入終端,輸入以下指令
# 始終監聽本地計算機 12345 端口的數據
$ nc -lk12345
Socket獲取百度首頁
百度服務器返回數據不是一次性就返回完的,是一點一點的返回的,所以我們接受數據時需要創建一個循環,循環的去接受百度服務器每次返回到客戶端的數據.
當最后一次返回數據為0時,說明數據已經返回完成了.
使用Socket就不需要設置ATS.因為Socket是底層的實現.
Socket使用步驟
創建客戶端Socket
連接到服務器Socket
客戶端Socket發送數據到服務器Socket
客戶端Socket接收服務器返回的數據
關閉客戶端Socket
socket : 創建客戶端Socket
/**
參數
參數1 : domain,協議域/協議簇,AF_INET(IPV4的網絡開發)
參數2 : type,Socket類型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,報文)
參數3 : protocol,IPPROTO_TCP,協議,如果輸入0,可以根據第二個參數,自動選擇協議
返回值
int類型,如果 > 0 就表示成功,返回socket
*/
int clientSocket = socket(AF_INET, SOCK_STREAM,0);
connect : 連接到服務器Socket
/**
參數
參數1 :? 客戶端socket
參數2 :? 指向數據結構sockaddr的指針,其中包括目的端口和IP地址
服務器的"結構體"地址
提示:C 語言中沒有對象
參數3 :? 結構體數據長度
返回值
0 成功/其他 錯誤代號,非0即真
*/
// 創建結構體
struct sockaddr_in serverAddr;
// 協議簇
serverAddr.sin_family= AF_INET;
// 目的端口,處理http請求的端口號固定的,是80
serverAddr.sin_port= htons(80);
// 目的計算機(服務器)的IP
serverAddr.sin_addr.s_addr= inet_addr("14.215.177.38");
int isConnected = connect(clientSocket, (conststructsockaddr *)&serverAddr,sizeof(serverAddr));
send : 客戶端Socket發送數據到服務器Socket
/**
參數
參數1 : 客戶端socket
參數2 : 發送內容地址 void * == id
參數3 : 發送內容長度
參數4 : 發送方式標志,一般為0
返回值
如果成功,則返回發送的字節數,失敗則返回SOCKET_ERROR
*/
NSString*sendMsg =@"GET / HTTP/1.1\r\n""Host: www.baidu.com\r\n""User-Agent: iphone\r\n""Connection: close\r\n\r\n";
ssize_t sendlen = send(clientSocket,sendMsg.UTF8String,strlen(sendMsg.UTF8String),0);
recv : 客戶端Socket接收服務器返回的數據
/**
參數
參數1 : 客戶端socket
參數2 : 接收內容緩沖區地址
參數3 : 接收內容緩存區長度
參數4 : 接收方式,0表示阻塞,必須等待服務器返回數據
返回值
如果成功,則返回讀入的字節數,失敗則返回SOCKET_ERROR
*/
// 定義暫存區
uint8_t buffer[1024];
// 定義dataM保存每次接受到的二進制數據
NSMutableData *dataM = [NSMutableData data];ssize_t recvCount = -1;
// 當數據發送完,recvCount就為0
while(recvCount !=0) {
// 接收服務器發送的數據
recvCount = recv(clientSocket, buffer,sizeof(buffer),0);
// 循環拼接每次接受到的二進制數據
[dataM appendBytes:buffer length:recvCount];
}
// 把拼接的二進制數據轉換成字符串
NSString*recvStr = [[NSStringalloc] initWithData:dataM encoding:NSUTF8StringEncoding];
close : 關閉客戶端Socket
close(clientSocket);