kakaの博客

你所热爱的,就是你的生活

0%

socket

介绍

所谓socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

套接字通信分成两个部分:

  • 服务器端:被动连接
  • 客户端:主动向服务器端发起连接

socket是一套通信的接口,Linux和Windows都有

Socket地址

socket地址实际上是一个结构体,封装端口号和IP等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/socket.h>
struct sockaddr { //通用socket地址
sa_family_t sa_family;
char sa_data[14];
};
typedef unsigned short int sa_family_t;

struct sockaddr_in { //ipv4专用地址
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
}

struct in_addr {
in_addr_t s_addr;
}

通信流程

image-20230208125145685

套接字函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int socket(int domain, int type, int protocol);
/*
- 功能: 创建一个套接字
- 参数:
- domain: 协议族
- AF_INET: ipv4
- AF_INET6: ipv6
- AF_UNIX, AF_LOCAL: 本地套接字通信
- type: 通信过程中使用的协议类型
- SOCK_STREAM: 流式协议
- SOCK_DGRAM: 报式协议
- protocol: 具体的一个协议,一般写0
- 流式协议默认会用TCP
- 报式协议默认使用UDP
- 返回值:
- 成功: 返回文件描述符,操作的就是内核缓冲区
- 失败: -1
*/

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
- 功能: 绑定,将fd和本地的IP+端口进行绑定
- 参数:
- sockfd: 通过socket函数得到的文件描述符
- addr: 需要绑定socket地址,这个地址封装了IP和端口号信息
- addrlen: 第二个参数结构体占内存大小

*/

int listen(int sockfd, int backlog);
/*
- 功能: 监听这个socket上的连接
- 参数:
- sockfd: 通过socket()函数得到的文件描述符
- backlog: 未连接的和已连接的和的最大值,5

*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
/*
- 功能: 接受客户端连接,默认是一个阻塞的函数,阻塞等待客户端连接
- 参数:
- sockfd: 通过socket()函数得到的文件描述符
- addr: 传出参数,记录了连接成功后客户端的地址信息(ip,port)
- addrlen: 指定第二个参数对应的内存大小
- 返回值:
- 成功: 用于通信的的文件描述符
- 失败: -1

*/
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
/*
- 功能: 客户端连接服务器
- 参数:
- sockfd: 用于通信的文件描述符
- addr: 客户端要连接的服务器的地址信息
- addrlen: 指定第二个参数对应的内存大小
- 返回值:
- 成功: 0
- 失败: -1

*/
ssize_t write(int fd, const void *buf, size_t count);// 写数据
ssize_t read(int fd, const void *buf, size_t count);// 读数据
-------------本文结束感谢您的阅读-------------