linux socket API / socket
一、函数原型
#include
int socket (int __domain, int __type, int __protocol)
功能:实现一个通信端点,通信双方是进程(同机进程和不同机进程)。该函数相当于文件操作符中的 open 操作,socket 的相关操作都是通过需要使用该描述符实现。
二、参数详解
1、__domain
(1)指定协议族,决定了可以处理哪个协议层及其以上的通信数据可以处理。
(2)常用的如下:
AF_INET( = PF_INET):使用 IPv4 协议(Internet Protocol Version 4),处理 IP 层及其上的通信数据。
AF_INET6( = PF_INET):使用 IPv6 协议(Internet Protocol Version 6),处理 IP 层即其上的通信数据。
AF_PACKET( = PF_PACKET):处理数据链路层及其以上的数据。
AF_UNIX( = AF_LOCAL = PF_UNIX = PF_LOCAL):处理本机不同进程间的通信数据。
(3)协议族亦用于决定 socket 的地址类型,例如 AF_INET 采用的是 ipv4(32bit) 和端口号(16bit)组合,而 AF_UNIX 采用的是以绝对路径名作为地址。
2、__type
(1)指定 socket 类型,实际上指定的是内核为我们提供的服务的抽象。
(2)常用的如下:
SOCK_STREAM:流式 socket 。
SOCK_DGRAM:数据报 socket 。
SOCK_RAW :原始 socket 。
3、__protocol
(1)指定传输协议(TCP / UDP),系统为每一个协议族和类型提供了默认的传输协议,当该值为 0 时,使用其默认的协议。
(2)有的小伙伴可能将该协议和上面的“__domain”指定的协议族混淆,实际上二者是包含和被包含的关系。
“__domain”指定的是该sokcet可以处理哪些协议层及其以上的数据,例如当“__domain”指定了 AF_INET ,则代码该socket 可以处理网络层及其以上的数据,那网络层上的协议有哪些呢?有 TCP 和 UDP,所以“__protocol”的就可以写明 TCP 和 UDP 了。所以,“__domain”称之为“协议族”,“__protocol”称之为“协议”。
(3)综上所述,对于不同的“__domain”,其能指派的“__protocol”是不同的。
对于 AF_INET 来说,其能指派的协议有 tcp 和 udp。但是对于 AF_PACKET 其能指派的协议有 tcp、udp、icmp 等。
三、返回值
成功则返回非负整数,失败则返回0,并置 errno 。
四、应用示例
1、tcp/ip 通信的demo 。
2、udp/ip 通信的demo 。
3、socket ipc demo 。
(SAW:Game Over!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
