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