socket相关API(Linux网络编程基础API)

创建socket

使用socket函数创建一个套接字,这个套接字将作为通信的端点,并返回一个文件描述符

文件描述符是进程中当前未使用的最小编号的整数。详细来说,当一个进程创建一个新的文件描述符时,操作系统会分配一个从0开始的最小可用的整数值。这个文件描述符用于标识进程中打开的文件或通信端点,如套接字。

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

参数:

domain:指定通信时使用的协议族。这些协议族定义在<sys/socket.h>头文件中。

常用的协议族有AF_UNIX(AF_LOCAL)、 AF_INET、AF_INET6。

Name                Purpose                          Man page
AF_UNIX, AF_LOCAL   Local communication              unix(7)
AF_INET             IPv4 Internet protocols          ip(7)
AF_INET6            IPv6 Internet protocols          ipv6(7)
AF_IPX              IPX - Novell protocols
AF_NETLINK          Kernel user interface device     netlink(7)
AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
AF_AX25             Amateur radio AX.25 protocol
AF_ATMPVC           Access to raw ATM PVCs
AF_APPLETALK        AppleTalk                        ddp(7)
AF_PACKET           Low level packet interface       packet(7)
AF_ALG              Interface to kernel crypto API

type:指定服务类型,该类型定义了通信的语义

通信语义决定了套接字如何处理数据传输和通信,以满足各种网络应用的需求。

常用的服务类型有SOCK_STREAM(常用于TCP)、SOCK_DGRAM(常用于UDP)。

SOCK_STREAM     Provides sequenced, reliable, two-way, connection-based byte streams.  An out-of-band data transmission mechanism may be supported.

SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages of a fixed maximum length).

SOCK_SEQPACKET  Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer is required to read an entire packet with each input system call.

SOCK_RAW        Provides raw network protocol access.

SOCK_RDM        Provides a reliable datagram layer that does not guarantee ordering.

SOCK_PACKET     Obsolete and should not be used in new programs; see packet(7).

protocol:用于指定与套接字一起使用的具体协议。通常,在某个协议族内,只有一个协议支持某种套接字类型,此时可以将protocol设置为 0。若存在多个协议可以选择,则必须明确指定所需的协议。

返回值:

成功:函数返回一个新的套接字的文件描述符。

出错:返回-1,errno被适当设置。

命名socket

当通过socket函数创建一个套接字时,我们给他指定了地址族。创建完成后,这个套接字存在于一个命名空间(地址族)中,但并未指定使用该地址族中的哪个具体socket地址。

命名空间(地址族)用于定义套接字使用的地址类型,每个地址族定义了一组地址结构和相关的协议规则。常见的地址族包括:AF_UNIX(AF_LOCAL)、 AF_INET、AF_INET6。

bind函数将指定的socket地址addr分配给由文件描述符sockfd指向的套接字。这个bind操作也被称为为套接字命名

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

在服务器程序中,通常要命名socket,使得客户端能够通过这个地址连接到服务器。

客户端通常不需要显式命名其套接字,而是采用操作系统自动分配的临时地址。

参数:

sockfd:套接字文件描述符,之前由socket函数创建。

addr:指向sockaddr结构体的指针,包含要绑定的地址和端口信息。

传递给addr参数的实际结构将取决于地址族。sockaddr结构定义如下:

struct sockaddr {
    sa_family_t sa_family;
    char        sa_data[14];
};

这个结构的唯一目的是将传递的结构指针addr进行类型转换,以避免编译器警告。 

addrlen:指定了指向addr的地址结构的大小(以字节为单位)。

返回值:

成功:返回值为零。

出错:返回-1,errno被适当设置。两种常见的错误是:EACCES(地址受保护,用户不是超级用户)、EADDRINUSE(给定的地址已经在使用中)。

监听socket

将一个套接字标记为被动套接字,准备接受来自客户端的连接请求。

int listen(int sockfd, int backlog);

参数:

sockfd:套接字文件描述符,指向一个SOCK_STREAM或SOCK_SEQPACKET的套接字。

backlog:定义了sockfd的待处理连接队列的最大长度。如果在队列已满时到达了连接请求,客户端可能会收到ECONNREFUSED错误,或者如果底层协议支持重传,请求可能会被忽略,从而在之后的重试中成功连接。

返回值:

成功:返回值为零。

出错:返回-1,errno被适当设置。

接受连接

从listen监听队列中接受一个连接。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:

sockfd:执行过listen系统调用的监听socket文件描述符。

addr:指向sockaddr结构体的指针,用于存储被接受连接方的远端socket地址。

addrlen:一个指向socklen_t类型的变量的指针,传入时指示addr缓冲区的大小,返回时更新为实际地址长度。

返回值:

成功:返回一个新的文件描述符,代表已建立的连接。服务器可以通过读写该socket来与被接受连接对应的客户端通信。

出错:返回-1,errno被适当设置。

发起连接

用于建立与指定套接字的连接。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:

sockfd:套接字文件描述符,由socket函数创建。

addr:指向sockaddr结构体的指针,该结构体包含要连接的地址信息。如果套接字sockfd的类型是SOCK_DGRAM,则addr是默认用于发送数据报的地址,并且是接收数据报的唯一地址。如果套接字的类型是SOCK_STREAM或SOCK_SEQPACKET,此调用尝试连接到绑定到addr指定地址的套接字。

addrlen:指定了指向addr的地址结构的大小(以字节为单位)。

返回值:

成功:返回值为零。一旦成功建立连接,sockfd就唯一标识了这个连接,客户端可以通过读写sockfd和服务器通信。

出错:返回-1,errno被适当设置。两种常见的错误是:ECONNREFUSED(目标主机拒绝了连接请求)、ETIMEDOUT(连接超时)。

关闭连接

close系统调用会将文件描述符的引用计数减少1。当引用计数为0时,文件描述符所代表的文件或套接字才会被真正关闭。这意味着在调用close后,如果有其他进程或线程仍持有该文件描述符的引用,连接可能会继续存在,直到所有引用都被关闭。

int close(int fd);

参数:

fd:要关闭的文件描述符。

返回值:

成功:返回值为零。

出错:返回-1,errno被适当设置。

推荐一下

0voice · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值