网络socket编程流程

前言:之前写了客户端的博客,在写服务器端博客之前,先一起了解一下tcp传输客户端服务器端通信流程
在这里插入图片描述
1.先调用socket函数初始化,创建服务器端的文件描述符
在网络编程中所需要进行的第一件事情就是创建一个socket,无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket文件描述符,类似于文件描述符。socket是一个结构体,被创建在内核中。

   sockfd=socket(AF_INET,SOCK_STREAM,0);   //AF_INT:ipv4, SOCK_STREAM:tcp协议

2.调用bind函数
把一个本地协议地址和套接口绑定,比如把本机的2222端口绑定到套接口。注意:为什么在上图中客户端不需要调用bind函数?这是因为如果没有调用bind函数绑定一个端口的话,当调用connect函数时,内核会为该套接口临时选定一个端口,因此可以不用绑定。而服务器之所以需要绑定的原因就是,所以客户端都需要知道服务器使用的哪个端口,所以需要提前绑定。

bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))

3、调用listen函数
当socket创建后,它通常被默认为是主动套接口,也就是说是默认为要马上调用connect函数的,而作为服务器是需要被动接受的,所以需要调用linsten函数将主动套接口转换成被动套接口。调用linsten函数后,内核将从该套接口接收连接请求。

  /**
     * 3:调用listen函数监听(指定port监听)
     * 通知操作系统区接受来自客户端链接请求
     * 第二个参数:指定队列长度
     */

    if(listen(sockfd,10) < 0)
    {
        perror("listen error");
    }

4.调用accept函数
此函数返回已经握手完成的连接的套接口。注意:此处的套接口不同于服务器开始创建的监听套接口,此套接口是已经完成连接的套接口,监听套接口只是用来监听。

accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);

5.客户端connect函数
客户端创建了socket后,需要和服务器端建立连接,此时使用connect函数和服务器端进行连接。

connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))

三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

6.write.read函数
调用IO函数(read/write)和连接的客户端进行双向通信。

 write(sockfd,buf,sizeof(buf))    
        read(sockfd,buf,sizeof(buf))

7.close函数
数据传输完成后,需要关闭套接口

close(sockfd)

从网上找到一张图片会用到的套接口常用函数:
在这里插入图片描述
后序:基于这篇博客,我会写出温度上报服务器端的博客,只有很熟悉socket思路之后才能更好的写代码,完成项目。很多函数用着用着就熟练了,最开始使用的时候很不习惯。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值