博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket模型
阅读量:4985 次
发布时间:2019-06-12

本文共 2605 字,大约阅读时间需要 8 分钟。

Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议).

一台电脑(IP)的一个应用程序(端口) 和 另一台电脑(IP)的应用程序(端口) 之间的通信就是通过两个socket进行连接

最常见的socket模型

一个 Socket 至少包含2层协议:网络层/传输层
TCP/IP ->socket TCP端口(传输层) IP主机(网络层)
UDP/IP ->socket UDP端口(传输层) IP主机(网络层)

思路:

1.创建一个 客户端Socket!

2.创建一个 服务器端Socket!
3.连接 两个Socket
4.客户端Socket发送聊天信息给服务器端Socket!
5.服务器端Socket接收到客户端Socket之后,返回信息给客户端Socket!
6.查看服务器端Socket传递回来的信息.

 

demo:

#import "ViewController.h"

#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

@interface ViewController ()

@end

// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)

// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)
@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{
NSLog(@"touchesBegan");
// 1. 创建客户端Socket!
// Socket 参数: Socket = TCP/IP
// 参数:
// 1. AF_INET/IPv4 AF_INET6/IPv6 协议域(IP/主机)
// 2. SOCK_STREAM/TCP SOCK_DGRAM/UDP
// 3. 传0,会根据第二个参数自动选择协议类型
// 返回值: 大于0,代表客户端Socket创建成功!
int SocketNumber = socket(AF_INET, SOCK_STREAM, 0);
if (SocketNumber > 0) {
NSLog(@"客户端Socket创建成功:%d",SocketNumber);
}
// 2. 创建服务器端Socket.
struct sockaddr_in serverAddress;
// 定义服务器端Socket的协议域(IPv4)
serverAddress.sin_family = AF_INET;
// 服务器端的IP地址!
// 本机IP地址:
// 127.0.0.1(所有的计算机都有的地址!指的就是主机本身)
// 192.168.44.72 (网关动态分配的IP地址,每天都可能改变!)
// localhost :指向的就是(127.0.0.1),本机域名!
// serverAddress.sin_addr.s_addr = inet_addr("192.168.44.75");
serverAddress.sin_addr.s_addr = inet_addr("192.168.39.26");
// 设置服务器端Socket的端口号: 1024~65535
serverAddress.sin_port = htons(12345);

// 3. 连接两个Socket!
// 参数:
// 1. 客户端Socket
// 2. 服务器端Socket地址
// 3. 长度(服务器端Socket(结构体)长度).
// sizeof 计算结构体地址长度!
// 返回值:返回值=0,代表连接成功!
int result = connect(SocketNumber, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
NSLog(@"result:%d",result);
// 要想保证连接成功,必须首先监测服务器端的端口号!
// 监测服务器端端口号: 12345
// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)
// 4. 客户端发送消息给服务器.
// 参数:
// 1.客户端Socket
// 2.客户端发送给服务器的内容
// 3.第二个参数的大小/长度
// 4.0,等待服务器返回内容!
// 注意: sizeof :计算的是地址长度,不是字符串长度!
// strlen:计算的是字符串的长度!
NSString *Msg = @"hello socket!";
send(SocketNumber, Msg.UTF8String, strlen(Msg.UTF8String), 0);
// 5.接收服务器端Socket返回的数据
// 参数:
// 1.客户端Socket
// 2.服务器返回的内容存放的位置.
// 3.第二个参数的长度!
// 4.传0,等待接收数据.
// 返回值: 长度.返回的数据的长度!
ssize_t buffer[1024];
ssize_t length = recv(SocketNumber, buffer, sizeof(buffer), 0);
// 从 buffer 中取出接收到的数据!
NSString *recMsg = [[NSString alloc] initWithBytes:buffer length:length encoding:NSUTF8StringEncoding];
NSLog(@"recMsg:%@",recMsg);
// AsyncSocket
}
@end

转载于:https://www.cnblogs.com/ansyxpf/p/5429993.html

你可能感兴趣的文章
linux一些基本常识(四)
查看>>
Docker架构
查看>>
C#设计模式(3)——工厂方法模式
查看>>
过目不忘JS正则表达式
查看>>
bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂
查看>>
Colidity-- StoneWall
查看>>
Leetcode 904. Fruit Into Baskets
查看>>
怎样连接REDIS服务端
查看>>
ajax同步,加载loading的bug
查看>>
秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
查看>>
div滚动条
查看>>
iOS越狱程序开发
查看>>
调用其他类的方法
查看>>
SQlite数据库
查看>>
Python服务器开发 -- 网络基础
查看>>
一些常用的js,jquerry 样例
查看>>
Oracle PL/SQL 多重选择句
查看>>
tyvj1659中中救援队
查看>>
kubernetes学习:CKA考试题
查看>>
LINUX samba的安装使用
查看>>