You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

套接字编程中为何使用指针传递套接字地址?

套接字编程中为何使用指针传递套接字地址?

嘿,这个问题问得特别到位!很多刚摸套接字编程的小伙伴都会被这堆指针搞晕,我来给你拆解清楚~

  • 函数需要返回多个结果:你看accept()函数本身的返回值是新创建的套接字描述符,但我们还需要获取客户端的地址信息啊!C语言里函数只能有一个返回值,那怎么把客户端的地址和地址长度这两个额外信息传回来?指针就是解决办法——把变量的内存地址传给函数,函数在内部直接修改这个地址指向的内存空间,这样调用方就能拿到更新后的地址数据了。要是不用指针,传个结构体副本进去,函数改的只是自己栈里的临时副本,调用方根本拿不到有用的客户端地址,这不就白忙活了?

  • 适配多种地址类型的“多态”设计:套接字编程里有好几种地址结构体,比如IPv4用struct sockaddr_in,IPv6用struct sockaddr_in6,本地进程间通信的套接字用struct sockaddr_un。这些结构体的大小和字段都不一样,但都能强制转换成通用的struct sockaddr*类型。用指针的话,同一个accept()(还有bind()、connect()这些函数)就能处理所有类型的地址结构体,不用给每种地址都写一个单独的函数,这可是C语言实现灵活适配的小技巧!要是直接传结构体值,函数参数就得固定成某一种结构体类型,灵活性直接归零。

  • 节省内存提升效率:如果直接传整个结构体,每次调用函数都要拷贝一份结构体数据,要是结构体比较大,这就会额外消耗内存和CPU时间。用指针的话,只需要传一个内存地址(通常是4或8字节,取决于系统是32位还是64位),开销小很多,尤其是在频繁调用套接字函数的场景下,这点效率提升还是很实在的。

举个简单的例子你就懂了:

struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
int new_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &addr_len);

调用完accept()后,client_addr里就存着客户端的IP和端口信息了——这就是指针帮我们把函数内部的结果带出来的功劳!

备注:内容来源于stack exchange,提问作者Jassy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:43:11