赞
踩
来写一个udp的代码
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
linux下一切皆文件,socket接口也不例外。其返回值本质上就是一个fd文件描述符,这样我们对网络的发送/接收操作,就转换成了对文件的写入/读取操作了
在这里面有一个比较重要的结构sockaddr
需要说明一番
socket是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4/IPv6。同时,这个接口还可以用于系统内部的通信。这就实现了用一个接口来干两件事。
为此,就必须要在传值中进行一些修改。该接口新增了一个sockaddr
,用来接收目标信息。这个值的参数可以是sockaddr_in/scokaddr_un/sockadd_in6
之中的任意一个(需要强转指针)
sockaddr
本身不存放任何信息。
这个参数可接收的结构体中,固定前16位就是用于标识符的。传到处理函数中,就会判断前16位中的标识符的类型,以确定传入参数的类型,再执行不同的实现
scokaddr_un
,前16位是AF_UNIX
,那么当前使用的就是本地通信sockaddr_in
是ipv4通信,sockaddr_in6
是ipv6通信你可能会有疑惑,既然sockaddr
不存放信息,那为何不把这个参数设置为一个void*
的指针?反正最后都是进了函数之后判断参数类型,void*
指针也能达成目标呀
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。