// // 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->connect->send->close //建立一個套接字 //套接字:源IP地址和目的IP地址 以及 源端口號和目的端口號的組合。用於標識客戶端請求的服務器。 //int socket(int domain, int type, int protocol); //domain:定義域,目前只支持AF_INET格式 //type:套接字類型描述。SOCK_STREAM流式(TCP),SOCK_DGRAM數據報式(UDP) //protocol:套接字所用協議。如不想指定,可用0表示 int fd = socket(AF_INET, SOCK_STREAM, 0); //只要不等於-1,表示建立成功。 BOOL success = (fd != -1); //sockaddr_in 是網絡環境下套接字的地址形式 struct sockaddr_in addr; //建立整型變量,用於體現網絡鏈接中的錯誤 int err; if (success) { NSLog(@"socket success"); //內存初始化 //sizeof:計算數據空間字節數 memset(&addr, 0, sizeof(addr)); //對addr結構體進行設置 // addr.sin_len = sizeof(addr); //AF_INET經過IPv4進行通訊 addr.sin_family = AF_INET; //設置網絡地址 //INADDR_ANY指定地址爲0.0.0.0的地址。表示一個不肯定地址,或想象成一個「任意地址」。 addr.sin_addr.s_addr = INADDR_ANY; //將socket與特定主機地址與端口號進行綁定,成功綁定會返回0,失敗爲-1. err = bind(fd, (const struct sockaddr*)&addr, sizeof(addr)); success = (err == 0);//if(err==0){success = true;} }if (success) { NSLog(@"bind success"); //建立要鏈接的服務器地址 struct sockaddr_in serveraddr; //內存初始化 memset(&serveraddr, 0, sizeof(serveraddr)); //設置結構體(host to net shot) serveraddr.sin_port = htons(1024);//將主機的無符號短整型轉換成網絡字節順序 serveraddr.sin_len = sizeof(serveraddr); serveraddr.sin_family = AF_INET; //設置服務器地址 serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");//這個地址是本地,通常用來測試使用。 NSLog(@"鏈接ing"); //客戶端向服務器發送鏈接請求,鏈接成功返回0,失敗返回-1. err = connect(fd, (const struct sockaddr*)&serveraddr, sizeof(serveraddr)); success = (err == 0); socklen_t addrLen = sizeof(serveraddr);//客戶端地址長度 if (success) { NSLog(@"鏈接成功"); getsockname(fd, (struct sockaddr *)&addr, &addrLen); success = (err == 0); if (success) { //inet_ntoa:將一個IP轉換成互聯網標準點分格式的字符串 //ntohs:將網絡字節順序轉換爲主機字節順序 NSLog(@"本地地址:%s,端口號:%d",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)); //發送消息 char buf[1024]; do{ printf("請輸入信息:"); //puts相似scanf,可是能夠有空格 // puts(buf); scanf("%s",buf); send(fd, buf, 1024, 0); }while (strcmp(buf, "exit") != 0);//當輸入exit跳出循環,結束 } }else{ NSLog(@"connect 失敗"); } } return 0; }