#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>
/*
1 创建Socket
参数
domain:协议域AF_INET->IPV4
type: socket类型SOCK_STREAM(TCP) SOCK_DGRAM(UDP)
protocol :IPPROTO_TCP,如果写0,就会自动根据第二个参数选择
返回值 :int socket
*/
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
/*
2.连接到服务器
参数
1>客户端socket
2>指向结构图sockaddr的指针,其中包括目的端口的IP地址
3>结构体数据长度
返回值 : 0 成功 / 其他 错误代号
*/
struct sockaddr_in serverAddr;
//端口号
serverAddr.sin_port = htons(80);
serverAddr.sin_family=AF_INET;
//ip地址 inet_addr函数,可以将ip地址转成一个数字
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// nc -lk 12345 终端监听端口号12345的数据
int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (connResult == 0) {
NSLog(@"连接成功");
}else{
NSLog(@"连接失败:%d",connResult);
return;
}
/*
3 发送数据
参数
1>客户端socket
2>发送内容地址(指针)
3>发送内容长度
4>发生方式标志,一般为0
返回值
如果成功,则返回字节数,失败则返回SOCKET_ERROR
*/
NSString *msg = @"GET / HTTP/1.1\n""Host:www.baidu.com\n\n";
ssize_t sendlen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);
NSLog(@"发送了 %ld 个字节",sendlen);
/*
4. 读取数据
参数
1>客户端socket
2>接受内容缓冲区地址
3>接受内容缓冲区长度
4>接受方式,0表示阻塞,必须等待服务器返回数据
返回值
如果成功 则返回读入的字节数,失败则返回SOCKET_ERROR
*/
uint8_t buffer[1024];
size_t recvlen = recv(clientSocket, buffer, sizeof(buffer), 0);
NSLog(@"接受到了 %ld 个字节", recvlen );
NSData *data = [NSData dataWithBytes:buffer length:recvlen];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
/*
5.关闭连接
*/
close(clientSocket);