网络套接字编程:创建客户端和服务器端的流程及完整代码

TCP通信创建客户端和服务器端的流程

网络套接字编程
套接字 socket , 也可以做进程间通信(ROS)
TCP协议通信 (传输层协议)安全可靠传输协议, 需要先建立链接才进行收发数据
优点 : 安全,协议层会校验, 缺点:实时性差, 粘包问题(数据流)
应用场景: 传输对数据安全高的数据, 文件, 控制指令

流程
网络套接字编程:创建客户端和服务器端的流程及完整代码_第1张图片

> 服务器端

1.创建套接字
#include /* See NOTES */
#include
int socket(int domain, int type, int protocol);
返回值:套接字描述符(类似文件描述符) ,失败返回-1
参数:int domain地址族
(AF_INET-IPV4, AF_INET6-IPV6)
int type 数据类型
比如:SOCK_STREAM(tcp协议) SOCK_DGRAM(udp协议) SOCK_RAW(原始套接字)
int protocol 协议
一般设置为0, 系统自动根据数据类型确定对应的协议

  1. 绑定

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
返回值: 成功返回0, 失败返回-1
参数: int sockfd 套接字描述符
const struct sockaddr *addr 要绑定的端口, 地址
socklen_t addrlen 地址长度
结构体
struct sockaddr {
sa_family_t sa_family; //地址族 IPV4,IPV6
char sa_data[14]; //包含4字节ip地址, 2字节端口号 , 8字节预留
}
设计一个struct sockaddr替代结构体 struct sockaddr_in
struct sockaddr_in
{
short int sin_family; /地址族/
unsigned short int sin_port; /端口号/
struct in_addr sin_addr; /IP地址/
unsigned char sin_zero[8]; /填充0 以保持与struct sockaddr同样大小/
};
struct in_addr {
in_addr_t s_addr;
/*in_addr_t为 32位的unsigned int,该无符号整数采用大端字节序。 */
};

  1. 监听

int listen(int sockfd, int backlog);
返回值: 成功返回0, 失败返回-1
参数: int sockfd: 套接字描述符
int backlog : 监听队列长度

4.接受链接(接受连接成功会创建一个新的套接字, 用来与客户端收发数据)

  1. 如果没有客户端连接, accept函数数阻塞,
  2. 当有客户端连接并且连接成功, 会返回一个套接字描述符 (这个套接字描述符主要使用来与客户端实现收发数据)
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    返回值: 成功返回套接字–与客户端收发数据使用, 失败返回-1
    参数:struct sockaddr *addr 用来存储客户端地址
    socklen_t *addrlen 告诉存储地址的空间长度

5.在服务器端读取客户端发送的数据

#include
ssize_t read(int fd, void *buf, size_t count);

tcp协议通客户端
1.创建套接字

#include /* See NOTES */
#include
int socket(int domain, int type, int protocol);
返回值:套接字描述符(类似文件描述符) ,失败返回-1
参数:int domain地址族 AF_INET-IPV4, AF_INET6-IPV6
int type 数据类型 比如:SOCK_STREAM(tcp协议) SOCK_DGRAM(udp协议) SOCK_RAW(原始套接字)
int protocol 协议 一般设置为0, 系统自动根据数据类型确定对应的协议

2.连接服务器

#include /* See NOTES */
#include
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
返回值 连接成功返回0, 失败返回-1
参数:int sockfd 套接字描述符
const struct sockaddr *addr 要连接的服务器地址和端口 struct sockaddr_in
socklen_t addrlen 地址对应的长度

  1. 发送数据 write, send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
返回:成功返回发送的字节数, 失败返回-1
参数:int sockfd套接字描述符
const void *buf 要发送的数据首地址
size_t len发送数据对应长度
int flags 标识设置为0

以下是客户端&服务器的代码实现过程

//服务器端
/*
点对点通信
服务器端实现步骤:
socket-》创建套接字
bind-》绑定
listen-》监听
accept -》接收
close-》关闭
*/

你可能感兴趣的:(网络编程,linux,http,网络)