当前位置: 首页 > news >正文

socket系统调用的参数涵义

在 Linux 中,socket() 系统调用用于创建一个新的网络套接字(socket),它是网络通信的基础。其函数原型如下:

c

复制

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

参数详解

1. domain(协议族/地址族)

指定套接字使用的协议族(Address Family),决定了通信的地址类型和协议类型。常见选项:

宏定义说明
IPv4AF_INET使用 IPv4 地址(如 192.168.1.1)。
IPv6AF_INET6使用 IPv6 地址(如 2001:db8::1)。
本地通信AF_UNIX/AF_LOCAL用于本地进程间通信(IPC),基于文件路径(如 /tmp/mysocket)。
原始协议AF_PACKET允许直接访问网络层数据包(如构造自定义协议头)。

示例

c

复制

int sockfd = socket(AF_INET, SOCK_STREAM, 0);  // 创建 IPv4 TCP 套接字

2. type(套接字类型)

指定套接字的通信语义(数据传输方式)。常见类型:

宏定义说明
流式套接字SOCK_STREAM面向连接、可靠的双向字节流(如 TCP)。
数据报套接字SOCK_DGRAM无连接、不可靠的固定长度报文(如 UDP)。
原始套接字SOCK_RAW直接访问网络层协议(如 ICMP、自定义 IP 包)。
顺序包套接字SOCK_SEQPACKET类似 SOCK_STREAM,但保留报文边界(如 SCTP)。

示例

c

复制

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);  // 创建 UDP 套接字

3. protocol(具体协议)

指定套接字使用的具体协议,通常设为 0(由内核根据 domain 和 type 自动选择)。常见选项:

协议适用场景
TCPIPPROTO_TCP与 SOCK_STREAM 配合使用(AF_INET + SOCK_STREAM 默认选 TCP)。
UDPIPPROTO_UDP与 SOCK_DGRAM 配合使用(AF_INET + SOCK_DGRAM 默认选 UDP)。
ICMPIPPROTO_ICMP用于 Ping 或 Traceroute(需配合 SOCK_RAW)。
自定义其他协议号如 IPPROTO_SCTP(SCTP 协议)。

示例

c

复制

int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);  // 创建 ICMP 原始套接字

常见组合示例

用途domaintypeprotocol
TCP 通信AF_INETSOCK_STREAM0(默认 TCP)
UDP 通信AF_INETSOCK_DGRAM0(默认 UDP)
本地进程通信AF_UNIXSOCK_STREAM0
抓取原始包AF_PACKETSOCK_RAWhtons(ETH_P_ALL)

返回值

  • 成功:返回套接字文件描述符(sockfd),用于后续操作(如 bindconnect)。

  • 失败:返回 -1,并设置 errno(如 EACCES 权限不足、EAFNOSUPPORT 不支持的协议族)。


完整示例(TCP 客户端)

c

复制

#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket creation failed");
        return -1;
    }
    printf("Socket created successfully.\n");
    close(sockfd);
    return 0;
}

注意事项

  1. 权限要求:创建原始套接字(SOCK_RAW)需要 CAP_NET_RAW 权限(通常需 root 用户)。

  2. 协议匹配domaintype 和 protocol 必须有效组合(如 AF_INET + SOCK_STREAM 只能配 TCP)。

  3. 资源释放:套接字使用后应调用 close() 关闭,避免文件描述符泄漏。

通过合理配置这三个参数,可以创建适应不同网络场景的套接字,为后续的 bindconnectsend/recv 等操作奠定基础。

相关文章:

  • 卡尔曼滤波入门(二)
  • Python之文件操作详解
  • Python FastApi(7):请求体
  • 在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装
  • 私有化部署dify + DeepSeek-R1-Distill-Qwen-32B + bge-m3
  • Razer macOS v0.4.10快速安装
  • 【21期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股阶段主力动向数据及接口API说明文档
  • 【Linux】System V信号量与IPC资源管理简易讲解
  • Dubbo 通信流程 - 服务的调用
  • TCP可靠传输与慢启动机制
  • 项目上传github——SSH连接配置文档
  • 无参数读文件RCE
  • STRUCTBERT:将语言结构融入预训练以提升深度语言理解
  • AWS Aurora存算分离架构
  • Java可变参数:灵活的函数调用方式
  • 前端Material-UI面试题及参考答案
  • 洛谷题单1-P1001 A+B Problem-python-流程图重构
  • 初识 spring ai 之rag、mcp、tools calling使用
  • 存储效能驱动业务价值:星飞全闪关键业务场景性能实测报告
  • 解释 Webpack 中的模块打包机制,如何配置 Webpack 进行项目构建?
  • 个人可以做网站导航的网站吗/哪有网页设计公司
  • 网站企业备案和个人备案的区别/品牌网站建设方案
  • seo网站建设接单/正规seo多少钱
  • 高端家具东莞网站建设技术支持/seo网站优化服务商
  • 做网站行情/搜索引擎排名原理
  • 小工程承包网app/seo培训