套接字

1.socket函数原型

 socket(建立一个socket文件描述符)
  • 所需头文件
    #include <sys/types.h>
    #include <sys/socket.h>

  • 函数说明:建立一个socket文件描述符

  • 函数原型

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

  • 函数传入值:domain

type:协议类型

AF_INET:IPv4协议

AF_INET6:IPv6协议

AF_LOCAL:Unix域协议

AF_ROUTE:路由套接口

AF_KEY:密钥套接口

protocol

SOCKET_STREAM:双向可靠数据流,对应TCP

SOCKET_DGRAM:双向不可靠数据报,对应UDP

SOCKET_RAW:提供传输层以下的协议,可以访问内部网络接口,例如接收和发送ICMP报文

type为SOCKET_RAW时需要设置此值说明协议类型,其他类型设置为0即可

  • 函数返回值

成功:socket文件描述符

失败:-1,失败原因存于error中

2.bind函数原型

bind(将一个本地协议地址与socket文件描述符联系起来)
  • 所需头文件

#include <sys/types.h>

#include <sys/socket.h>

  • 函数说明:将一个协议地址与socket文件描述符联系起来

  • 函数原型:
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

  • 函数传入值:sockfd

socket文件描述符

addr : my_addr指向sockaddr结构,该结构中包含IP地址和端口等信息

addrlen : sockaddr结构的大小,可设置为sizeof(struct sockaddr)

  • 函数返回值

成功:0

失败:-1,失败原因存于error中

利用bind函数绑定地址时,可以指定IP地址和端口号,也可以指定其中之一,甚至一个也不指定。可以使用通配地址INADDR_ANY(为宏定,义其值等于0),它通知内核选择IP地址。

3.listen函数原型

listen (等待连接)
  • 所需头文件

#include <sys/types.h>

#include <sys/socket.h>

  • 函数说明:等待连接

  • 函数原型
    int listen(int sockfd, int backlog)

  • 函数传入值:sockfd

监听socket文件描述符

backlog:套接字排队的最大连接个数

函数返回值

成功:0

失败:-1,失败原因存于error中

特别说明

对于监听socket文件描述符sockfd,内核要维护两个队列,分别为未完成连接队列和已完成连接队列,这两个队列之和不超过backlog

4.connect函数原型

connect(建立socket连接)
  • 所需头文件

#include <sys/types.h>

#include <sys/socket.h>

  • 函数说明:建立socket连接

  • 函数原型

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

  • 函数传入值:sockfd

socket文件描述符

serv_addr : 连接的网络地址和端口

addrlen : sockaddr结构的大小,可设置为sizeof(struct sockaddr)

  • 函数返回值

成功:0

失败:-1,失败原因存于error中

附加说明

函数connect激发TCP的三路握手过程,出错返回有以下几种情况:

① 如果客户没有收到SYN分节的响应(总共75秒,这之间可能重发了若干次SYN),则返回ETIMEDOUT

② 如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连,函数返回错误ECONNREFUSED

③ 如果客户发出的SYN在中间路由器上引发一个目的地不可达的ICMP错误,内核返回EHOSTUNREACH或ENETUNREACH错误(即ICMP错误)给进程

5.accept函数原型

accept(接受socket连接)
  • 所需头文件

#include <sys/types.h>

#include <sys/socket.h>

  • 函数说明 : 接受socket连接,返回一个新的socket文件描述符,原socket文件描述符仍为listen函数所用,而新的socket文件描述符用来处理连接的读写操作

  • 函数原型

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

  • 函数传入参数

sockfd: socket文件描述符

addrlen:addr的大小,可设置为sizeof(struct sockaddr)

  • 函数传出参数

addr:填入远程主机的地址数据

  • 函数返回值

成功:实际读取字节数

失败:-1,错误代码存放在error中

附加说明

① accept函数由TCP服务器调用,为阻塞函数,从已完成连接的队列中返回一个连接;如果该对列为空,则进程进入阻塞等待

② 函数返回的套接字为已连接套接字,而监听套接字仍为listen函数所用

6.close函数原型

close (关闭连接的socket文件描述符)
  • 所需头文件

#include <unistd.h>

  • 函数说明 : 关闭连接的socket文件描述符

  • 函数原型

int close(int sockfd)

  • 函数传入值

sockfd:socket文件描述符

  • 函数返回值

成功:0

失败:-1,失败原因存于error中

附加说明

① close函数默认功能是将套接字置为“已关闭”标记,并立即返回给进程,这个套接字不能再为该进程所用

② 正常情况下,close将引发四个分节终止序列,但在终止前将发送已排队的数据

③ 如果套接字描述符访问计数在调用close后大于0(多个进程共享同一个套接字的情况下),则不会引发TCP终止序列(即不会发送FIN分节)

7.shutdown函数原型

shutdown(终止socket通信)
  • 所需头文件

#include <sys/socket.h>

  • 函数说明 : 终止socket通信

  • 函数原型

int shutdown(int s, int how)

  • 函数传入值 : s

socket文件描述符

how

0(SHUT_RD):关闭socket连接的读这一半,不再接收套接字中的数据且现留在收缓冲区的数据作废

1(SHUT_WR):关闭socket连接的写这一半(半关闭),但留在套接字发送缓冲区中的数据都会被发送,后跟TCP连接终止序列,不管访问计数是否大于0,此后将不能再执行对套接字的任何写操作

2(SHUT_RDWR):socket连接的读、写都关闭

  • 函数返回值

成功:0

失败:-1,失败原因存于error中

8.read函数原型

    read(从打开的socket文件流中读取数据)
  • 所需头文件
    #include <unistd.h>

  • 函数说明 : 从打开的socket文件流中读取数据,这里仅说明此函数应用于socket的情况

  • 函数原型

ssize_t read(int fd, void *buf ,size_t count)

  • 函数传入参数

fd: socket文件描述符

count:最大读取字节数

  • 函数传出参数

buf:读取数据的首地址

  • 函数返回值

成功:实际读取字节数

失败:-1,错误代码存放在error中

附加说明

调用函数read从socket文件流中读取数据时,有如下几种情况:

① 套接字接收缓冲区接收数据,返回接收到的字节数

② TCP协议收到FIN数据,返回0

③ TCP协议收到RST数据,返回-1,同时errno设置为ECONNRESET

④ 进程阻塞过程中接收到信号,返回-1,同时errno设置为EINTR

9.write函数原型

   write(向socket文件流中写入数据)
  • 所需头文件

#include <unistd.h>

  • 函数说明 : 向socket文件流中写入数据,这里仅说明此函数应用于socket的情况

  • 函数原型

ssize_t write (int fd,const void *buf,size_t count)

  • 函数传入参数

fd: socket文件描述符

buf:写入数据的首地址

count:最大写入字节数

  • 函数返回值

成功:实际写入的字节数

失败:-1,错误代码存放在error中

附加说明

调用函数write向socket文件流写数据时,有如下几种情况:

① 套接字发送缓冲区有足够空间,返回发送的字节数

③ TCP协议收到RST数据,返回-1,同时errno设置为ECONNRESET

④ 进程阻塞过程中接收到信号,返回-1,同时errno设置为EINTR

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值