socket-(1)

常见知识点:

1、 网络常识 - IP地址、端口、网络协议、7层模型和4层/5层模型/osi

2、 7层模型: 物理层、数据链路层、网络层、传输层、会话层、表现层、应用层

3、 协议

在网络中,有很多的规范(数据交互),这些规范叫做协议。

常见协议:
http - 超文本传输协议(互联网基础协议)
ftp - 文件传输协议(文件上传和下载)
邮件发送和接收协议 - smtp 和 pop3


传输层协议:
TCP协议 - 传输控制协议
UDP协议 - 用户数据报协议
网络层的IP协议 - 网络中查找计算机


Tcp/ip 协议族
TCP(Transmission Control Protocol)
– 传输控制协议,基于连接的服务
 UDP(User Datagram Protocol)
– 用户数据报协议,无连接的服务
 IP(Internet Protocol)
– Internet协议,信息传递机制

4、 协议簇

一堆相关的协议组成一个协议簇(协议族),如:TCP/IP就是一个协议簇。

5、 ip地址

就是一个整数,最初时就是4字节整数,是计算机在网络中的唯一标识。两种表示方式:
十六进制描述法(8位的十六进制) 针对计算机底层。
点分十进制:每个字节算一个数(0-255),中间用点隔开。人接触的IP都是点分十进制。
后来因为IP地址的分配不均,导致IP地址紧张,因此IP地址做了扩展,到了128位,因此IP地址有2种形式:IPV4 - 4字节 IPV6 ,主流的还是IPV4

192.168.15.100 -> 点分十进制
C0 A8 0F 64 -> 0xC0A80F64(十六进制)
其实对应IP地址是一个。

IP地址其实要和Mac地址绑定才能生效,Mac地址就是网卡的物理地址,就是网卡出厂时预先设定的编号,这个编号确保唯一。

6、 查看ip地址的命令

WINDOWS(DOS): ipconfig
Unix : ifconfig (/sbin/ifconfig)

7、 ip端口

IP地址可以定位计算机,但数据传送时需要给计算机中的特定进程。端口 就是定位计算机中的进程。网络交互 必须有 IP地址和端口号。
端口是一个short,值为 0-65535。不是所有端口都可以直接使用。
0-1023 大部分都被系统占用,所以不要用。
1024-48000多 程序员使用的,其中某些被程序占用。
余下的是 动态端口,系统随时可能用一下,不稳定。

8、 简单的socket编程的步骤

  8.1  服务端

  1) 创建socket关键字;

  2) 准备通信地址

  3) 绑定

  4) 通信

  5) 关闭

  8.2 客户端

  1) 创建socket关键字;

  2) 准备通信地址

  3) 连接

  4) 通信

  5) 关闭

  8.3 简单实例

  服务端:

  int main()

{

  int sockfd = socket(AF_FILE,SOCK_DGRAM,0);//1、 创建soctet关键字

  if(sockfd == -1)

  {

    perror("socket"),exit(-1);

  }

  struct sockaddr_un addr;//2、 创建通信地址,用结构体

  addr.sun_family=AF_FILE;//与第一步中,创建sock关键字的一样

  strcpy(addr.sun_path,"./a.sock");//本地通信文件

  int res = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));//3绑定

  if(res == -1)

  {

    perror("bind"),exit(-1);

  }

  char buf[1024];

  memset(buf,0x00,sizeof(buf));

  int len = read(sockfd,buf,sizeof(buf));//4 通信

  printf("read %d ,The content is %s ",len,buf);

  close(sockfd);//5关闭

}

int main()

{

  int sockfd = socket(AF_FILE,SOCK_DGRAM,0);

  if(sockfd == -1)

  {

    perror("socket"),exit(-1);

  }

  struct sockaddr_un addr;

  addr.sun_family = AF_FILE;

  strcpy(addr.sun_path,"./a.sock");

  int res=connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));

  if(res == -1)

  {

    perror("connect"),exit(-1);

  }

  write(sockfd,"aiyq195",5);

  close(sockfd);

}

上面的代码,还涉及到一些内容:

socket有两种通信方式:本地通信和网络通信

其中的关键函数

1、 socket() 函数

socket()函数,创建一个套接字 socket,返回 socket描述符。
int socket(int domain,int type,int protocol)
其中参数:
domain 域,用于选择协议簇。
AF_UNIX AF_LOCAL AF_FILE - 本地通信(IPC)
AF_INET - 网络通信
AF_INET6 - 网络通信IPV6

type 用于选择通信类型
SOCK_STREAM : 数据流,用于TCP
SOCK_DGRAM : 数据报,用于UDP
protocol 没有效果的参数,给0 即可。
返回 socket描述符,用法和文件描述符差不多。失败返回-1。

2、 通信地址

通信地址有3个结构体,sockaddr不存储通信地址,只做参数的类型。通信地址存在另外两种结构中:
本地通信的地址 sockaddr_un
#include <sys/un.h>
struct sockaddr_un{
int sun_family;//协议簇,与socket一致
char sun_path[];//socket文件的文件名
};
网络通信地址 sockaddr_in
#include <netinet/in.h>
struct sockaddr_in
{
int sin_family;//协议簇,与socket一致
short sin_port;//端口号
struct in_addr sin_addr;//IP地址
};

3、 bind()、connect() 函数

bind(sockfd,sockaddr,addrlength)

connect(sockfd,sockaddr,addrlenth)

原文地址:https://www.cnblogs.com/aiyq195/p/6432479.html