Linux IPC tcp/ip socket 编程

Linux IPC tcp/ip socket 编程

#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> //服务器: socket() //创建socket struct sockaddr_in //准备通信地址 bind() //绑定socket和addr listen() //创建listening socket accept() //创建connect socket send()/recv() //进行通信 close() //关闭socket //客户端: socket() //创建socket 准备通信地址:服务器的地址 connect() //链接socket和通信地址 send()/recv() //进行通信 close() //关闭socket socket() //创建网络端点,返回socket文件描述符,失败返回-1设errno int socket(int domain, int type, int protocol);

domain :协议族(protocol family)(网络通讯(IP)还是本地通讯(xxx.socket))

AF_INET用于实现给予ipv4网络协议的网络协议

type :协议(TCP还是UDP)

SOCK_STREAM //流式套接字, 实现包括但不限于TCP协议,which is有序,可靠双向面向连接的字节流通信方式

protocol: 特殊协议, 一般给0

准备通信地址: struct sockaddr{ //主要用于函数的形参类型, 很少定义结构体变量使用, 叫做通用的通信地址类型//$man bind sa_family_t sa_family; char sa_data[14]; } struct sockaddr_in{ //准备网络通信的通信地址 //$man in.h sa_family_t sin_family; //协议族, 就是socket()的domain的AF_INET in_port_t sin_port; //端口号 struct in_addr sin_addr; //IP地址 } struct in_addr{ in_addr_t s_addr; //整数类型的IP地址 } bind(): //把通信地址和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errno int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())
addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上
addrlen: 通信地址的大小, 使用sizeof();

listen() //创建侦听socket,把sockfd标记的socket标记为被动socket,被动socket表示这个socket只能用来接收即将到来的连接请求,不再用于读写操作和通信,接收连接请求的是accept() //成功返回0,失败返回-1设errno int listen(int sockfd, int backlog);

backlog:排队等待“被响应”连接请求队列的最大长度 eg: 接待室的最大长度

accept() //创建连接socket,返回连接socket的文件描述符,成功返回文件描述符,失败返回-1设errno int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

addr : 结构体指针, 用于带出客户端的通信地址
addlen : 结构体指针, 用于带出通信地址的大小
ATTENTION: listen()把socket()创建的sockfd变为listening socket, 负责侦听哪个client连接上了(即不但要知道连上没, 还要知道谁连上了, 这个SOCK_STREAM的socket有这个能力), accept()提取排队中的最上面的一个client, 给它一个conneted socket, 这样这个client就可以和server沟通了, 就是说这里有两个socket, 一个负责侦听一个负责通信

send() //向指定的socket发送指定的数据,成功返回实际发送数据的大小,失败返回-1设errno ssize_t send(int sockfd, const void *buf, size_t len, int flags);

sockfd: 用于通信的socket描述符(returned by accept())
buf : 被发送数据的缓冲区首地址
len : 被发送数据的大小
flags: 发送的标志, 如果给0等同于write()

recv() //从指定的socket接收数据,成功返回接收的数据的大小,失败返回-1设errno ssize_t recv(int sockfd, void *buf, size_t len, int flags);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c58249b3e2ee611f5ddda10dfa82eace.html