专栏首页陶士涵的菜地[linux] C语言Linux系统编程-TCP通信的11种状态

[linux] C语言Linux系统编程-TCP通信的11种状态

三次握手 由client主动发出SYN请求, 此时client处于SYN_SENT状态(第一次握手) 当server收到之后会由LISTEN转变为SYN_REVD状态, 并回复client, client收到应答后处于ESTABLISHED状态, 这个状态就表示client已经准备好通信了(第二次握手) client收到二次握手应答后回复server, server收到应答之后也处于ESTABLISHED, 表示握手成功, 可以通信了(第三次握手)

数据传输 然后client和server都处于通信状态, 不会改变

四次挥手 client主动发送FIN请求关闭, 此时client处于FIN_WAIT_1状态(短暂)(第一次挥手) server收到之后处于CLOSE_WAIT状态(半关闭状态), 并做出应答(第二次挥手) client收到之后处于FIN_WAIT_2状态, 等待server发送关闭请求. server会紧接着发送FIN断开请求, 并处于LAST_ACK(第三次挥手) client收到之后并应答, 此时处于TIME_WAIT状态, 这是主动断开的一端的最后一个状态, 意思是会等待一定的时间(2MSL-1min), 等待之后会变成CLOSED状态(第四次挥手)

TCP的11种状态

CLOSED最初状态 1.建立连接三次握手 client server (1)SYN_SENT ========> (2)LISTEN (4)ESTABLISHED <======== (3)SYN_RCVD (5) =========> (6)ESTABLISHED 2.数据传输阶段 3.断开连接四次挥手 (1)FIN_WAIT_1 =========> (2)CLOSE_WAIT (4)FIN_WAIT_2 <========== (3) (6)TIME_WAIT <========== (5)LAST_ACK (7) ==========>

使用netstat命令查看各种状态:

1.

2.

3.

4.

服务端监听本机1234端口,客户端进行连接,TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟,自动关掉

参照代码:

client.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(){
    //创建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    sleep(20);
    //向服务器(特定的IP和端口)发起请求
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
    serv_addr.sin_family = AF_INET;  //使用IPv4地址
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
    serv_addr.sin_port = htons(1234);  //端口
    connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    sleep(20);
    //读取服务器传回的数据
    char buffer[40];
    read(sock, buffer, sizeof(buffer)-1);

    printf("Message form server: %s\n", buffer);
    //sleep(60);
    //关闭套接字
    close(sock);
    sleep(60);
    return 0;
}

server.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(){
    //创建套接字
    int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //将套接字和IP、端口绑定
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
    serv_addr.sin_family = AF_INET;  //使用IPv4地址
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);;  //具体的IP地址
    serv_addr.sin_port = htons(1234);  //端口
    bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    //进入监听状态,等待用户发起请求
    listen(serv_sock, 20);
    sleep(20);
    //接收客户端请求
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size = sizeof(clnt_addr);
    int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
    sleep(20);
    //向客户端发送数据
    char str[] = "Hello World!";
    write(clnt_sock, str, sizeof(str));
    sleep(20);
    //关闭套接字
    close(clnt_sock);
    sleep(20);
    close(serv_sock);
    sleep(20);
"5.c" 36L, 1183C                                                                                    1,1           Top
    close(serv_sock);
    sleep(20);
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux] C语言Linux系统编程-socket开发

    4.将内存中字节的编号称为地址(Address)或指针(Pointer),一般认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地...

    陶士涵
  • [linux] C语言Linux系统编程-socket回声客户端

    1.所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。

    陶士涵
  • [linux] C语言Linux系统编程-socket开发响应HTTP协议

    陶士涵
  • JavaWeb(四)EL表达式

    前言   前面详细的说明了什么是JSP和它的一些元素,这篇给大家介绍一下的是EL表达式。 用EL表达式,能更好的使用JSP中的各种内置对象和作用域。   楼主...

    用户1195962
  • 运维天地-服务器06-X86-PCServer网口信息获取

    大话IT架构
  • 《Hadoop安装教程》---大数据系列

    Loading mirror speeds from cached hostfile

    用户3467126
  • 源码分析Dubbo负载算法

    Dubbo支持在服务调用方对服务提供者采用负载均衡算法,LoadBalance接口定义如下:

    丁威
  • windows平台下编辑的内容传到linux平台出现中文乱码的解决办法

    现象说明:在windows下编辑的内容,上传到linux平台下出现中文乱码。如下: 在windows平台编写haha.txt文件,内容如下: ? 上传到linu...

    洗尽了浮华
  • 基于ThinkPHP的2个CMS后台GetShell利用

    0x00 前言 ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,由于其简单易用,很多cms都基于该框架改写。然而 Thinkphp在缓存使...

    FB客服
  • try语句...

    #include<stdio.h> #include<iostream> using namespace std; int main( ) { try { ...

    Gxjun

扫码关注云+社区

领取腾讯云代金券