socket通信函数解析

目录

1.socket

2.bind

3.listen

4.connect

5.send

6.recv

7.select

8.setsockopt

9.closesocket

10.总结辨析

10.1 listen\connect\accept与三次握手的关系


1.socket

/*
参数介绍:
domain:协议域,(常见的协议组用AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE)协议族决定了socket的地址类型,在通信中必须采用相应的地址;
type:socket的类型,(流格式套接字(SOCK_STREAM)、数据报格式套接字(SOCK_DGRAM));
protocol:协议,常见的协议有IPPROTO_TCP、IPPTOTO_UDP、 IPPROTO_SCTP、IPPROTO_TIPC他们分别对应这TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。当protocol为0时,会自动选择type类型对应的默认协议;

返回值:

返回一个文件描述符,SOCKET类型本身也是定义为int的,既然是文件描述符,那么在系统中都当作是文件来对待的。0、1、2分别表示标准输入、标准输出、标准错误。所以其他打开的文件描述符都会大于2, 错误时就返回 -1。这里INVALID_SOCKET 也被定义为 -1。
*/
int socket(int domain, int type, int protocol)

2.bind

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

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数;
第三个参数;

返回值:

3.listen

int listen(int sockfd, int backlog)

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数socket可以排队的最大连接数;

返回值:

4.accept

4.connect

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

参数介绍:
第一个参数socket函数返回的文件描述符,唯一标识一个socket;
第二个参数;
第三个参数;

返回值:

5.send

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

参数介绍:
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程序要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。
返回值:
send的返回值>0时,表示实际发送了多少字节。注意:只是copy到系统缓存里,系统决定什么时候会发送这些数据。
send的返回值==0时,这个在send空串时会发生,是正常的。
send的返回值<0时(只会等于-1吧),需要检查errno,当errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN时,连接正常,可以稍后再试。其他的就是连接异常了。

6.recv

int recv(SOCKET s, char FAR *buf, int len, int flags);

参数介绍:
第一个参数指定接收端套接字描述符;
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
第三个参数指明buf的长度;
第四个参数一般置0。
返回值:
recv的返回值>0时,表示实际接受到多少字节。
recv的返回值==0时,表示连接断开,也就是收到了FIN或者RST。
recv的返回值<0时,检查errno,和send类似。

7.select

int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)

参数介绍:
第一个参数监视对象文件描述符数量;
第二个参数将所有关注“是否存在待读取数据”的文件描述符注册到fd_set变量,并传递其地址值;
第三个参数将所有关注“是否可传输无阻塞数据”的文件描述符注册到fd_set变量,并传递其地址值;

第四个参数将所有关注“是否发生异常”的文件描述符注册到fd_set变量,并传递其地址值;

第五个参数调用select后,为防止陷入无限阻塞状态,传递超时信息;

返回值:错误返回-1,超时返回0。当关注的事件返回时,返回大于0的值,该值是发生事件的文件描述符数。

8.setsockopt

int PASCAL FAR setsockopt(SOCKET s,
                          int level,
                          int optname,
                          const char FAR *optval,
                          int optlen);

参数介绍:
第一个参数是标识一个套接字的描述符。
第二个参数是选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。
第三个参数是需设置的选项。
第四个参数是指针,指向存放选项值的缓冲区。
第五个参数是optval缓冲区长度。

9.closesocket

10.总结辨析

10.1 listen\connect\accept与三次握手的关系

服务器调用listen进行监听
客户端调用connect来发送syn报文(connect()函数在第二次握手syn ack后返回)
服务器协议栈负责三次握手的交互过程。连接建立后,往listen队列中添加一个成功的连接,直到队列的最大长度。
服务器侧,accept()函数负责查看listen队列里面有没有成功连接,如果有则从队列中取出,没有则阻塞(直到获得一个成功连接返回)。它每取出一个成功连接,listen队列中的连接个数就少一个,就会生成一个对应的accept fd,用于唯一标识该连接成功的客户端。(accept()函数在三次握手完成后返回)

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值