Linux 创建TCP连接流程

2023-05-16

文章目录

      • Linux创建TCP的步骤
        • 服务端
        • 客户端
        • TCP建立流程
        • 示例代码

Linux创建TCP的步骤

TCP编程需要客户端和服务器两套编码,其创建TCP的流程也是不完全一致的

服务端

  1. 使用socket函数创建一个套接字
  2. 使用setsockopt函数设置套接字的属性
  3. 使用bind函数绑定IP地址、端口信息到套接字上
  4. 使用listen函数监听指定端口
  5. 使用accept函数接收客户端的连接请求
  6. 使用send/recv和read/write函数进行数据的收发
  7. 使用close函数关闭网络连接和监听

客户端

  1. 使用socket函数创建套接字
  2. 使用setsockopt函数设置套接字属性
  3. 使用bind函数绑定IP地址和端口信息
  4. 设置需要连接的IP地址和端口
  5. 使用connect函数请求建立连接
  6. 使用send/recv和read/write函数进行数据的收发
  7. 使用close函数关闭网路连接

TCP建立流程

在这里插入图片描述

示例代码

服务器

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <time.h>
#define MAXSIZE 128

char news[MAXSIZE];
int res;			//用以接收函数返回值

void* pthread_chat(void * arg)		//创建线程用以接收数据
{
    int confd = *(int *)arg;
    while(1)
    {
        res  = recv(confd, news, sizeof(news), 0);
        if(res <= 0)
        {
        perror("recv");
        break;
        }
        printf("The news is: %s\n",news);
        memset(news,0,MAXSIZE);
        send(confd,"OK",2,0);
    }

    printf("One client over\n");
    close(confd);
}

char *Time()					//获取当前时间
{
	time_t timer;
	struct tm *tblock;
	timer = time(NULL);
	tblock = localtime(&timer);
	return asctime(tblock);
}

void save(char *s)				//储存日志文件
{
    int fd;
    fd = open("journal",O_RDWR|O_APPEND|O_CREAT);

    if(fd < 0)
        perror("open");
    else
    {
        char *buf = Time();
        strcat(buf,s);
                
        write(fd,buf,MAXSIZE);
        lseek(fd,0,SEEK_END);
        
        if(res < 0)
            perror("write");
    }
}

int main()
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in saddr, caddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    res = bind(sockfd,(struct sockaddr*)&saddr, sizeof(saddr));
    if(res < 0)
        perror("bind");

    listen(sockfd, 5);			//监听端口

    while(1)
    {
        int len = sizeof(caddr);
        int confd = accept(sockfd,(struct sockaddr*)&caddr, &len);
        if(confd < 0)
        {
            perror("accept");
            continue;
        }else
        {
            save(inet_ntoa(caddr.sin_addr));
        }

        printf("Accept confdis:%d, ip=%s\n",confd,inet_ntoa(caddr.sin_addr));

        pthread_t tid;
        pthread_create(&tid, NULL, pthread_chat, &confd);
    }
}

客户端

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  
#define MAXSIZE 128

char news[MAXSIZE];
int res;					//用来接收函数返回值
int main()
{
    printf("------Welcome join the chat room-----\n");
    printf("If you want to quit,please input --bye--\n");
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
      
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6666);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  
    int confd = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(confd < 0)
        perror("connect");
    
    while(1)
    {
        printf("Please input the news\n");
        fgets(news,MAXSIZE,stdin);
          
        if(strncmp(news,"bye",3) == 0)
        {
            break;
        }

        send(sockfd, news, strlen(news), 0);
        memset(news,0,MAXSIZE);
        recv(sockfd, news, sizeof(news), 0);
          printf("The serve's news is: %s\n",news);
    }

    close(sockfd);
    exit(0);
}

请注意,服务端由于使用了多线程开发,需要在编译时添加-lpthread选项

程序运行效果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 创建TCP连接流程 的相关文章

随机推荐

  • 前端优化建议:合理利用JavaScript的条件运算符

    在最近的项目中要使用到一个格式化文件大小的算法 xff0c 于是不假思索写了如下代码 function formatSize size if size lt 1024 return size 43 34 B 34 else if size
  • 了解python之面向对象

    了解python之面向对象 面向对象概念 xff1a 面向对象编程 xff08 Object Oriented Programming xff0c 简称OOP xff09 是一种程序涉及思想 OOP把对象作为程序的基本单元 xff0c 一个
  • 了解python之进程与线程

    了解python之进程与线程 本文虽然叫作 了解python进程与线程 xff0c 但还是有点难度的 可以先查阅另外一篇文字 xff0c 快速入门 Python快速入门多线程与多进程 1 进程 进程 xff08 Process xff0c
  • Python快速入门多线程与多进程

    Python快速入门多线程与多进程 多线程 多线程的含义 进程我们可以理解为是一个可以独立运行的程序单位 xff0c 比如打开一个浏览器 xff0c 这就开启了一个浏览器进程 xff1b 打开一个文本编辑器 xff0c 这就开启了一个文本编
  • C++中strcmp的头文件问题

    C 43 43 中strcmp的头文件问题 今天在写程序时遇到的一个问题 include lt stdio h gt include lt string gt using std string int main char str STEL
  • strlen()函数详解

    头文件 xff1a include lt string h gt strlen 函数用来计算字符串的长度 xff0c 其原型为 xff1a unsigned int strlen char s strlen 用来计算指定的字符串s 的长度
  • 阿里云物联网平台基本设置-物模型

    陈拓 2019 12 14 2020 01 15 1 概述 如何让设备连接上云 xff1f 参考如下路径 本文以一个温度传感器为例 xff0c 演示创建产品 定义物模型 创建设备 虚拟设备调试 xff0c 这几部分 2 阿里云开通 2 1
  • Make与CMake

    1 Make与CMake 首先先来了解一下gcc xff0c gcc是GNU Compiler Collection 就是GNU编译器套件 xff0c 也可以简单认为是编译器 xff0c 它可以编译很多种编程语言 包括C C 43 43 O
  • C++学习(23)

    1 分析下述代码运行 xff1a include lt iostream gt using namespacestd int main int a 10 61 0 1 2 3 4 5 6 7 8 9 int p 61 a cout lt l
  • 史上最全最丰富的“最长公共子序列”、“最长公共子串”问题的解法与思路

    花了一天时间把一直以来的 最大子序列 最大递增子序列 最大公共子序列 最长公共子串 等问题总结了一下 其中参考了若干博文 xff0c 都备注引用 首先子序列是指一个一个序列中 xff0c 由若个数 xff08 字母 xff09 组成 xff
  • TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

    TCP协议拥塞控制算法 xff08 Reno HSTCP BIC Vegas Westwood xff09 一 TCP拥塞控制的研究框架 二 现有TCP拥塞控制的算法 xff08 Reno HSTCP Vegas Westwood xff0
  • C# Convert类

    Convert类常用的类型转换方法 方法说明Convert ToInt32 转换为整型 int Convert ToChar 转换为字符型 char Convert ToString 转换为字符串型 string Convert ToDat
  • try catch里面try catch嵌套

    try catch里面try catch嵌套 点击打开链接 try 与catch的作用 首先要清楚 xff0c 如果没有try的话 xff0c 出现异常会导致程序崩溃 而try则可以保证程序的正常运行下去 xff0c 比如说 xff1a t
  • mysql 中使用 where 1=1和 1=1 的作用

    Mysql中where 1 61 1 和count 0 使用小技巧 mysql中使用 where 1 61 1和 1 61 1 的作用
  • 面试题1:OS或者编译器怎么识别是全局变量还是局部变量

    OS或者编译器怎么识别是全局变量还是局部变量 操作系统内根本不关心你是什么变量 xff0c 它只管代理运行程序 xff0c 也就是进程 xff0c 负责这些进程之间的调度 xff0c 不过如果要说操作系统本身也是进程 xff0c 那倒可以理
  • 面试题4:数组、指针、引用的联系区别

    数组和指针 xff1f xff1f xff1f 从两个方面来看 xff0c 一是作为一个语言 xff0c 数组是必须要支持的一种数组类型 xff0c 原因很简单 xff0c 数组是线性表的直接体现 而从编译器设计者的角度来看 xff0c 如
  • c++ 容器类 概括性介绍

    C 43 43 中的容器类包括 顺序存储结构 和 关联存储结构 xff0c 前者包括vector xff0c list xff0c deque等 xff1b 后者包括set xff0c map xff0c multiset xff0c mu
  • 海康摄像头使用RTSP

    1 协议格式 海康威视IP摄像头rtsp协议地址如下 xff1a rtsp username passwd 64 ip port codec channel subtype av stream 主码流 xff1a rtsp admin 12
  • 树莓派串口连接ESP8266

    陈拓 chentuo 64 ms xab ac cn 2020 03 12 2020 03 12 1 概述 ESP8266是物联网行业广泛使用的WiFi模块 xff0c 小巧 功能强大 xff0c 而且价格低廉 通常用电脑进行ESP8266
  • Linux 创建TCP连接流程

    文章目录 Linux创建TCP的步骤服务端客户端TCP建立流程示例代码 Linux创建TCP的步骤 TCP编程需要客户端和服务器两套编码 xff0c 其创建TCP的流程也是不完全一致的 服务端 使用socket函数创建一个套接字使用sets