Socket函数参数说明转

本文详细介绍Winsock编程中关键函数的功能及使用方法,包括WSAStartup、socket、inet_addr等,并解释了这些函数如何帮助实现网络通信。
Socket函数参数说明

1、WSAStartup函数
用于初始化Winsock
[声明]
int WSAStarup(WORD wVersionRequested,LPWSADATA lpWSAData);
[参数]
wVersionRequested - 要求使用Winsock的最低版本号
lpWSAData - Winsock的详细资料
[返回值]
当函数成功调用时返回0
失败时返回非0的值
2、socket函数
用于生成socket(soket Descrīptor)
[声明]
SOCKET socket(int af,int type,int protocol);
[参数]
af - 地址家族(通常使用:AF_INET)
type - socket的种类
SOCK_STREAM : 用于TCP协议
SOCK_DGRAM : 用于UDP协议
protocol - 所使用的协议
[返回值]
当函数成功调用时返回一个新的SOCKET(Socket Descrīptor)
失败时返回INVALID_SOCKET.
3、inet_addr函数
把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法
[声明]
unsigned long inet_addr ( const char FAR *cp );
[参数]
cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针
[返回值]
当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)
失败时返回INADDR_NONE.
4、gethostbyname函数
可以从主机名获取主机资料.
[声明]
struct hostent FAR * gethostbyname ( const char FAR *name );
[参数]
name - 指向主机名字符串的指针
[返回值]
当函数成功调用时返回主机信息
失败时返回NULL(空值)
5、Bind函数
指定本地IP地址所使用的端口号时候使用
[声明]
int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
6、connect函数
用于与服务器建立连接,发出连接请求,必须在参数中指定服务器的IP地址和端口号
[声明]
int connect (SOCKET s , const struct sockaddr FAR *name , int namelen );
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
name - 指向服务器地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
7、select函数
可以用于调查一个或多个SOCKET的状态.
[声明]
int select ( int nfds , fd_set FAR *readfds , fd_set FAR *writefds , fd_set FAR *exceptfds , const struct timeval FAR *timeout );
[参数]
nfds - 在WINDOWS SOCKET API 中该参数可以忽略,通常赋予NILL值
readfds - 由于接受的SOCKET设备的指针
writefds - 用于发送数据的SOCKET设备的指针
exceptfds - 检查错误的状态
timeout - 超时设定
[返回值]
返回大于0的值时,表示与条件相符的SOCKET数
返回0表示超时
失败时返回SOCKET_ERROR
8、recv函数
利用Socket进行接受数据.
[声明]
int recv ( SOCKET s , char FAR *buf , int len , int flags );
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_PEEK 或 MSG_OOB)
[返回值]
成功时返回收到的字节数.
如果连接被中断则返回0
失败时返回 SOCKET_ERROR
9、sendto函数
利用Socket进行发送数据.
[声明]
int sendto ( SOCKET s , const char FAR *buf , int len , int flags , const struct sockaddr FAR *to , int token );
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
buf - 接受数据的缓冲区(数组)的指针
len - 缓冲区的大小
flag - 调用方式(MSG_DONTROUTE , MSG_OOB)
to - 指向发送方SOCKET地址的指针
token - 发送方SOCKET地址的大小
[返回值]
成功时返回已经发送的字节数.
失败时返回SOCKET_ERROR

`socket()` 函数是 Unix/Linux 系统中用于创建一个通信端点(即套接字)的系统调用,它是网络编程和进程间通信的基础。其原型如下: ```c #include <sys/socket.h> int socket(int domain, int type, int protocol); ``` 该函数返回一个 **文件描述符**(file descriptor),用于后续的 `bind()`, `connect()`, `send()`, `recv()` 等操作。如果失败则返回 -1,并设置 `errno` 错误码。 --- ### 参数详解 #### 1. `int domain` —— 协议族(Protocol Family) 指定通信的地址空间或协议家族,决定了套接字的寻址方式和适用范围。 常见取值包括: | 值 | 含义 | 用途 | |-----|------|-------| | `AF_INET` | IPv4 Internet 协议 | TCP/UDP 通信(最常用) | | `AF_INET6` | IPv6 Internet 协议 | 支持 IPv6 的网络通信 | | `AF_UNIX` / `AF_LOCAL` | 本地通信(Unix 域套接字) | 同一主机上的进程间通信(IPC) | | `AF_NETLINK` | Netlink 套接字 | 内核与用户空间通信 | | `AF_PACKET` | 数据链路层访问 | 抓包工具如 tcpdump、Wireshark 使用 | | `AF_BLUETOOTH` | 蓝牙协议栈 | 蓝牙设备通信 | > ⚠️ 注意:`PF_XXX` 是“协议族”(Protocol Family),而 `AF_XXX` 是“地址族”(Address Family)。两者通常成对出现,例如 `PF_INET` 和 `AF_INET` 在实际使用中可以互换,但推荐使用 `AF_XXX` 作为 `socket()` 的参数。 --- #### 2. `int type` —— 套接字类型(Socket Type) 定义数据传输的方式和服务质量。 | 类型 | 含义 | 特性 | |-------|--------|--------| | `SOCK_STREAM` | 流式套接字 | 面向连接、可靠传输(TCP、Unix 流) | | `SOCK_DGRAM` | 数据报套接字 | 无连接、不可靠、固定大小消息(UDP、Unix 数据报) | | `SOCK_RAW` | 原始套接字 | 可直接访问底层协议(如 IP、ICMP),常用于 ping、traceroute | | `SOCK_SEQPACKET` | 有序分组套接字 | 类似 SOCK_STREAM,但保留消息边界,基于连接的可靠传输 | | `SOCK_RDM` | 可靠数据报套接字 | 不保证顺序,但不丢失数据(较少使用) | > 示例: > - TCP 使用 `SOCK_STREAM` > - UDP 使用 `SOCK_DGRAM` > - Netlink 使用 `SOCK_RAW` 或 `SOCK_DGRAM`(取决于子协议) --- #### 3. `int protocol` —— 具体协议(Protocol Number) 指定在 `domain` 和 `type` 下使用的具体协议编号。通常设为 0 表示自动选择默认协议。 | domain | type | protocol 可选值 | 默认值 | |--------------|------------------|-------------------------------------|--------| | `AF_INET` | `SOCK_STREAM` | `IPPROTO_TCP` (6) | 0 → 自动选 TCP | | `AF_INET` | `SOCK_DGRAM` | `IPPROTO_UDP` (17) | 0 → 自动选 UDP | | `AF_INET` | `SOCK_RAW` | `IPPROTO_ICMP`, `IPPROTO_RAW` 等 | 必须指定 | | `AF_NETLINK` | `SOCK_RAW` | `NETLINK_ROUTE`, `NETLINK_GENERIC` 等 | 必须指定具体子协议 | | `AF_PACKET` | `SOCK_RAW` | `htons(ETH_P_ALL)` 等 | 必须指定以太网类型 | > ✅ 大多数情况下,当 `domain` 和 `type` 已经唯一确定协议时,`protocol` 设为 **0** 即可。 > ❌ 若三者组合无效,则 `socket()` 失败。 --- ### 返回值说明 - 成功:返回一个非负整数——**套接字文件描述符**(如 3, 4, 5...) - 失败:返回 `-1`,并设置 `errno`,常见错误有: - `EAFNOSUPPORT`:不支持的地址族 - `EPERM`:权限不足(如创建原始套接字需 root) - `EINVAL`:参数无效 - `ENOMEM`:内存不足 --- ### 使用示例代码 #### 示例 1:创建 TCP 套接字(IPv4) ```c int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("socket"); exit(EXIT_FAILURE); } ``` #### 示例 2:创建 UDP 套接字 ```c int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { perror("socket"); exit(EXIT_FAILURE); } ``` #### 示例 3:创建原始套接字发送 ICMP 包(需要 root) ```c int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sock == -1) { perror("socket"); exit(EXIT_FAILURE); } ``` #### 示例 4:创建 Netlink 套接字用于路由信息获取 ```c int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sock == -1) { perror("socket"); exit(EXIT_FAILURE); } ``` --- ### 补充说明 - 套接字一旦创建,默认是**阻塞模式**,可通过 `fcntl()` 设置为非阻塞。 - 创建后的套接字必须通过 `close()` 关闭,否则会泄漏资源。 - 不同 `domain` 的套接字用途差异大,不能混用(如 AF_INET 和 AF_UNIX 无法通信)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值