一、函数原型
#include <sys/socket.h>
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!)
本文详细解析了Socket函数的原理与使用,包括函数原型、参数详解、返回值及应用场景。重点介绍了如何通过Socket函数创建通信端点,实现进程间通信,涵盖TCP/IP与UDP/IP通信实例。
2014

被折叠的 条评论
为什么被折叠?



