socket函数

本文详细介绍了用于执行网络I/O操作的socket函数,包括其参数意义、返回值及如何通过不同的参数组合来创建不同类型的套接字。

为了执行网络I/0,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型(使用IPv4TCP、使用IPv6UDPUnix域字节流协议等)。

#include <sys/socket.h>

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

返回值:若成功则返回非负描述符,否则返回-1

其中family参数指明协议族,它是图1中所示的某个常值。该参数也往往被称为协议域。type参数指明套接字类型,它是图2中所示的某个常值。protocol参数应设为图3所示的某个协议类型常值,或者设为0,以选择所给定familytype组合的系统默认值。

并非所有套接字familytype的组合都是有效的,图4给出了一些有效的组合和对应的真正的协议。其中标为“是”的项也是有效的,但还没有找到便捷的缩略词。而空白项则是无效组合。

family

说明

AF_INET

AF_INET6

AF_LOCAL

AF_ROUTE

AF_KEY

IPv4协议

IPv6协议

Unix域协议

路由套接字

秘钥套接字

1 socket函数的family常值

type

说明

SOCK_STREAM

SOCK_DGRAM

SOCK_SEQPACKET

SOCK_RAW

字节流套接字

数据报套接字

有序分组套接字

原始套接字

2 socket函数的type常值

protocol

说明

IPPROTO_TCP

IPPROTO_UDP

IPPROTO_SCTP

TCP传输协议

UDP传输协议

SCTP传输协议

3 socket函数AF_INETAF_INET6protocol常值

4 socket函数中familytype参数的组合

socket函数在成功时返回一个小的非负整数值,它与文件描述符类似,我们把它称为套接字描述符(socket descriptor)。为了得到这个套接字描述符,我们只是指定了协议族(IPv4IPv6Unix)和套接字类型(字节流、数据报或原始套接字)。我们并没有指定本地协议地址和远程协议地址。

在C语言中,`socket` 函数是用于创建网络通信连接中的套接字(socket)的关键函数。该函数原型定义在头文件 `<sys/socket.h>`(对于 POSIX 兼容系统如 Linux)或 `<winsock2.h>`(对于 Windows)中。要在 Windows 上使用 `socket` 函数,还需要初始化 Winsock 库。 `socket` 函数的基本原型如下: ```c int socket(int domain, int type, int protocol); ``` 其中,参数 `domain` 指定通信域,通常使用 `AF_INET` 表示 IPv4 地址族;`type` 指定套接字类型,常用的有 `SOCK_STREAM`(面向连接的 TCP 套接字)和 `SOCK_DGRAM`(无连接的 UDP 套接字);`protocol` 通常设置为 0,表示使用默认协议。 以下是个简单的示例,展示如何使用 `socket` 函数创建个 TCP 套接字并绑定到本地端口 4017: ```c #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> int main() { int socketfd; struct sockaddr_in socket_addr; // 创建个 TCP 套接字 socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("Socket creation failed"); return 1; } // 初始化地址结构 memset(&socket_addr, 0, sizeof(socket_addr)); socket_addr.sin_family = AF_INET; socket_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有网络接口 socket_addr.sin_port = htons(4017); // 设置端口号 // 绑定套接字到指定的地址和端口 if (bind(socketfd, (struct sockaddr *)&socket_addr, sizeof(socket_addr)) == -1) { perror("Bind failed"); return 1; } // 监听连接请求 if (listen(socketfd, 5) == -1) { perror("Listen failed"); return 1; } printf("Server is listening on port 4017...\n"); // 接受客户端连接 int client_fd = accept(socketfd, NULL, NULL); if (client_fd == -1) { perror("Accept failed"); return 1; } printf("Client connected.\n"); // 关闭套接字 close(client_fd); close(socketfd); return 0; } ``` 在这个示例中,首先调用 `socket` 函数创建了个 TCP 套接字,然后通过 `bind` 函数将套接字绑定到本地地址和端口 4017。接着调用 `listen` 函数开始监听连接请求,最后通过 `accept` 函数接受客户端连接[^3]。 ### 相关问题 1. 如何在 Windows 上使用 socket 函数? 2. 如何处理多个客户端连接? 3. 如何发送和接收数据? 4. 如何关闭套接字? 5. 如何处理错误和异常情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值