socket编程相关api整理

socket编程相关api整理

本文部分参考了socket函数介绍这篇文章

服务端

首先是服务端最核心的函数

  • int socket(int domain, int type, int protocol);
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);

这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。

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

    服务端套接字绑定自己的IP地址与端口号,客户端那边可以不写,内核会给它分配一个临时的端口。绑定成功,返回0,失败返回-1.其中sockaddr结构体如下。包含了端口,地址,地址族等信息

struct sockaddr_in {
    __uint8_t   sin_len;
    sa_family_t sin_family;
    in_port_t   sin_port;
    struct  in_addr sin_addr;
    char        sin_zero[8];
};
  • int listen(int sockfd, int backlog);

    listen函数用法:函数应该在调用socket和bind这两个函数之后,accept函数之前调用。成功返回0;失败返回-1。
    参数:
    sockfd:套接字,成功返回后进入监听模式,当有新连接并accept后会再建立一个套接字保存新的连接;
    backlog:
      1) 当TCP接收一个连接后(三次握手通过)会将此连接存在连接请求队列里面,并对队列个数+1,而backlog为此队列允许的最大个数,超过此值,则直接将新的连接删除,即不在接收新的连接。将这些处于请求队列里面的连接暂记为后备连接,这些都在底层自动完成,底层将连接添加到队列后等待上层来处理(一般是调用accept函数接收连接);
      2) 当上层调用accept函数接收一个连接(处于请求队列里面的后备连接),队列个数会-1;
      3) 那么这样一个加一个减,只要底层提交的速度小于上层接收的速度(一般是这样),很明显backlog就不能限制连接的个数,只能限制后备连接的个数。那为啥要用这个backlog呢?主要用于并发处理,当上层没来的及接收时,底层可以提交多个连接;
      4) backlog的取值范围 ,一般为0-5。

  • int accept(int sockfd, struct sockaddr* addr, socklen_t* len)

    accept默认会阻塞进程,直到有一个客户连接建立后返回,它返回的是一个新可用的套接字,这个套接字是连接套接字。此时我们需要区分两种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,一个套接字会从主动连接的套接字变身为一个监听套接字;而accept返回是一个连接套接字,它代表着一个网络已经存在的点点连接。自然要问的是:为什么要有两种套接字?原因很简单,如果使用一个描述字的话,那么它的功能太多,使得使用很不直观,同时在内核确实产生了一个这样的新的描述字。
    参数
    sockfd:上一条的listen socket
    addr:这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。
    len:见上文

    客户端

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

    connect函数的功能是完成一个有连接协议的连接过程,对于TCP来说就是那个三路握手过程,连接成功,返回0,连接失败,返回-1。
    参数:
    sockfd:客户端自己创建的sock
    addr:服务端地址族、服务端IP地址、服务端端口号
    addrlen:服务端地址字节长度

recv&send

  • int send( SOCKET s,char *buf,int len,int flags );

    不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值