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

socket模型的更多相关文章

  1. 手把手教你玩转SOCKET模型之重叠I/O篇(下)

    四.     实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...

  2. .NET平台下几种SOCKET模型的简要性能供参考

    转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...

  3. Socket模型(二):完成端口(IOCP)

    为什么要采用Socket模型,而不直接使用Socket? 原因源于recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他链接不能继续.这样我们又 ...

  4. 转:变手把手教你玩转SOCKET模型之重叠I/O篇

    手把手教你玩转SOCKET模型之重叠I/O篇 “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙 ...

  5. php socket 模型及效率问题

    // 创建套接字 socket_create(); // 绑定 socket_bind(); // 监听 socket_listen(); // 主体, 死循环 while(true){ // sel ...

  6. PJSIP Socket 模型

    前些日子为解决项目中问题调试到PJSIP Socket收发数据部分 ,好记性不如烂笔头,记录下 PJSIP 使用的Socket 模型 ,以备后用. 不同平台下PJSIP采用不同的 Socket模型,W ...

  7. Socket模型详解(转)

    两种I/O模式 一.选择模型 二.异步选择 三.事件选择 四.重叠I/O模型 五.完成端口模型 五种I/O模型的比较 两种I/O模式 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待 ...

  8. 手把手教你玩转SOCKET模型之重叠I/O篇(上)

    “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯付 ...

  9. socket模型处理多个客户端

    最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题. 在服务器程序的设计中,一个服务器不可能只相应 ...

随机推荐

  1. CCNA 课程 五

    VLSM (可变长子网掩码)也就是子网的划分过程 子网掩码和ip地址相与得到的是IP地址的网络地址(0&1 == 0 : 1&1 == 1) 简单来说就是 IP地址 和 子网掩码 上下 ...

  2. 音乐下载api

    青檬音乐 http://tingapi.ting.baidu.com/v1/restserver/ting?from=android&version=5.6.5.6&format=js ...

  3. ssh框架整合意义

    一次次学习,一次次不一样的进一步理解. 一.Struts2.String.Hibernate框架的整合的意义: 1.需要将所有的对象进行统一管理(action动作类:sessionFactory) 2 ...

  4. mybatis 中if标签判断boolean 的写法。

    mybatis 的if 比较标签在比较数值时可以这样写: <if test="value=0"> </if> 在比较字符串时可以这么写: <if te ...

  5. IOS 发布被拒 PLA 1.2问题 整个过程介绍 01

    公司前端时间发布IOS APP ,但是遇到一些很麻烦的问题,就是一个让人摸不着头脑的问题. 问题: The Seller and Artist names associated with your a ...

  6. qemu-kvm 代码分析

    qemu-kvm 代码分析 虚拟机组成 实际上面所说计算机组成比较笼统,实际处理器,存储器,输入与设备种类繁多,     -   i440FX host PCI bridge and PIIX3 PC ...

  7. Nginx虚拟主机配置模板

    /////////////////////////////写在前头//////////////////////////////////////////Nginx 服务器中文文档:http://www. ...

  8. c# 查找一个字符串在另一个字符串出现的次数

    方法一: string test = "FF FF FF FF 01 00 82 00 00 A2 00 00 FB 07 FF FF FF FF 01 00 82 00 00 A2 00 ...

  9. http post上传文件

    php.ini中关于文件上传的配置指令: file_uploads = On          //是否接受上传的文件 upload_tmp_dir                //临时文件保持目录 ...

  10. ubuntu更改启动顺序

    在ubuntu中修改启动配置. 启动相关grub2主要包含下面三个文件:1.   /boot/grub/grub.cfg 文件    2.   /etc/grub.d/ 文件夹   3.   /etc ...