//
// 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;
}
转载于:https://my.oschina.net/u/2483781/blog/542928