套接字,IPC

主要是记录apue里面的一些概念网络IPC,unix域套接字(也就是本机IPC的一种实现)附件demo:https://pan.baidu.com/s/1CdWYyUSiNEqP9x4ffkXviw需要编译apue3的静态库int socket(int domain,int type,int protocol);domain:AF_INET IPv4AF_INET6 IPv6AF...
摘要由CSDN通过智能技术生成

主要是记录apue里面的一些概念
网络IPC,unix域套接字(也就是本机IPC的一种实现)
附件demo:
https://pan.baidu.com/s/1CdWYyUSiNEqP9x4ffkXviw
需要编译apue3的静态库

int socket(int domain,int type,int protocol);
domain:
AF_INET IPv4
AF_INET6 IPv6
AF_UNIX 别名 AF_LOCAL unix域
AF_UPSPEC

type:
SOCK_DGRAM 默认UDP 无连接 报文
SOCK_RAW 直接访问下面的网络层 应用程序负责构造自己的协议头部,这是因为传输协议(如 TCP 和 UDP) 被绕过了
SOCK_SEQPACKET 面向连接 报文
SOCK_STREAM 默认tcp 面向连接 字节流

protocol: //参数 protocol 通常是 0,表示为给定的域和套接字类型选择默认协议
IPPROTO_IP IPv4
IPPROTO_IPV6 IPv6
IPPROTO_ICMP
IPPROTO_RAW
IPPROTO_TCP tcp
IPPROTO_UDP udp

struct addrinfo{
int ai_flags;// 定义如何处理地址和名字
int ai_family;// domain 域
int ai_socktype;//类型
int ai_protocol;//协议
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;

}
struct sockaddr{
sa_family_t sa_family;
char sa_data[];//linux sa_data[14];

}
给一个接收客户端请求的服务器套接字关联上一个众所周知的地址,关联地址和套接字
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

建立连接
int connect(int sockfd,const struct sockaddr *addr,socket_t len);

服务器调用 listen 函数来宣告它愿意接受连接请求
int listen(int sockfd, int backlog);
backlog 提示系统该进程所要入队的未完成连接请求数量
一旦队列满,系统就会拒绝多余的连接请求,所以 backlog 的值应该基于服务器期望负载和 处理量来选择,其中处理量是指接受连接请求与启动服务的数量

一旦服务器调用了 listen,所用的套接字就能接收连接请求。使用 accept 函数获得连接 请求并建立连接
accept(int sockefd,struct socketaddr *addr,socklen_t *restrict len);
函数 accept 所返回的文件描述符是套接字描述符,该描述符连接到调用 connect 的客户端
这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族
传给 accept 的原始套接字没有关联到这个连接,而是继续保持可用状态并接收其他连接请求
返回时,accept 会在缓冲区填充客户端的地址,并且更新指向 len 的整数来反映该地址的大小
如果没有连接请求在等待,accept 会阻塞直到一个请求到来。如果 sockfd 处于非阻塞模式, accept 会返回−1,并将 errno 设置为 EAGAIN 或 EWOULDBLOCK

允许将一个主机名和一个服务名映射到一个地址
int getaddrinfo(const char *restrict host,
const char *restrict service,
const struct addrinfo *restrict hint,
struct addrinfo **restrict res);

面向连接的套接字
ssize_t send(int sockfd,const void *buf,size_t nbytes,int flags);
ssize_t recv(int sockfd,void *buf,size_t nbytes,int flags);

面向无连接的套接字
ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags,const struct sockaddr *destaddr, socklen_t destlen);
ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);

可以发送和接受fd
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);

实际例子 – 面向有连接 tcp

与服务器通信的客户端从系统的 uptime 命令获得输出
server

gethostname => host
getaddrinfo(host,“sername”) => addrinfo
socket(addrinfo->ai_addr->sa_family)->bind(addrinfo->ai_addr)->listen => sockfd
set_cloexec(sockfd)
accept(sockfd,NULL,NULL) => clfd 多个连接就会有多个
函数 accept 所返回的文件描述符是套接字描述符,该描述符连接到调用 connect 的客户端
这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族
传给 accept 的原始套接字没有关联到这个连接,而是继续保持可用状态并接收其他连接请求
set_cloexec(clfd)
popen(“cmd”,“r”) => fp
fget(buf,BUFSIZE,fp) -> send(clfd,buf,strle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值