Linux系统创建TCP连接流程介绍

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

Linux创建TCP的步骤

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

服务端

使用socket函数创建一个套接字

使用setsockopt函数设置套接字的属性

使用bind函数绑定IP地址、端口信息到套接字上使用listen函数监听指定端口

使用accept函数接收客户端的连接请求

使用send/recv和read/write函数进行数据的收发

使用close函数关闭网络连接和监听

客户端

使用socket函数创建套接字使用setsockopt函数设置套接字属性

使用bind函数绑定IP地址和端口信息

设置需要连接的IP地址和端口使用connect函数请求建立连接

使用send/recv和read/write函数进行数据的收发

使用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选项

程序运行效果如下:

到此这篇关于Linux系统创建TCP连接流程介绍的文章就介绍到这了,更多相关Linux创建TCP连接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • linux上TCP connection timeout问题解决办法

     linux上TCP connection timeout问题解决办法 最近在产线上经常出现connection timeout的问题,先看看Java 中关于connection timeout 的异常如何产生 JAVA中的timeout java.net.SocketTimeoutException: connect timed out 客户端异常:connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method

  • 如何测试Linux下tcp最大连接数限制详解

    前言 关于TCP服务器最大并发连接数有一种误解就是"因为端口号上限为65535,所以TCP服务器理论上的可承载的最大并发连接数也是65535". 先说结论:对于TCP服务端进程来说,他可以同时连接的客户端数量并不受限于可用端口号.并发连接数受限于linux可打开文件数,这个数是可以配置的,可以非常大,所以实际上受限于系统性能. 现在做服务器开发不加上高并发根本没脸出门,所以为了以后吹水被别人怼"天天提高并发,你自己实现的最高并发是多少"的时候能义正言辞的怼回去,趁着

  • linux下2个检查tcp连接的命令

    1 检测web服务器的链接数量及状态: netstat -ant|awk '{print $5 "\t" $6}'|grep "::ffff:"|sed -e 's/::ffff://' -e 's/:[0-9]*//' |sort|uniq -c| sort -rn|head -10 结果: 122 125.162.71.199 TIME_WAIT 99 79.119.125.43 TIME_WAIT 81 125.167.243.77 TIME_WAIT 75

  • Linux系统创建TCP连接流程介绍

    目录 Linux创建TCP的步骤 服务端 客户端 TCP建立流程 示例代码 Linux创建TCP的步骤 TCP编程需要客户端和服务器两套编码,其创建TCP的流程也是不完全一致的 服务端 使用socket函数创建一个套接字 使用setsockopt函数设置套接字的属性 使用bind函数绑定IP地址.端口信息到套接字上使用listen函数监听指定端口 使用accept函数接收客户端的连接请求 使用send/recv和read/write函数进行数据的收发 使用close函数关闭网络连接和监听 客户端

  • Linux系统下netstat命令详细介绍

    目录 一.介绍 二.输出信息描述 三.netstat常见参数 四.netstat网络状态详解 Linux的相关keepalive参数 五.常用netstat相关命令 一.介绍 Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息. Netstat用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况. 二.输出信息描述 执行netstat后输出如下: [root@sy-s

  • linux系统下用户管理相关介绍

    目录 一.用户及用户组存在的意义 1)用户存在的意义 2)用户组存在的意义 二.用户及用户组在系统中存在的方式 三.用户涉及到的系统配置文件 /etc/shadow        用户认证信息文件 四.用户相关操作 1)用户和用户组建立及删除 2)用户和用户组的信息管理 五.用户权力下放 六.文件权限查看和读取 一.用户及用户组存在的意义 1)用户存在的意义 系统的资源是有限的,如何合理分配系统资源? 1.身份 account 2.授权 author 3.认证 auth 以上3个 'a' 称为3

  • linux系统下vim插件安装介绍

    目录 安装vim插件管理器 添加插件演示 删除插件: 安装vim插件管理器 第一次使用插件推荐安装插件管理器,它可以简化我们安装插件的步骤. 1.下载 plug.vim 文件,根据操作系统不同,放置在以下autoload目录中: Linux: ~/.vim/autoload Windows: ~\vimfiles\autoload\plug.vim plug.vim地址:https://raw.githubusercontent.com/junegunn/vim-plug/master/plug

  • Windows和Linux系统下perl连接SQL Server数据库的方法

    本文将提供一些perl连接Microsoft SQL Server数据库的实例.perl脚本运行在Windows和Linux平台. Windows平台 如果在Windows平台下运行perl脚本,建议使用依赖DBI的两个模块包,提供标准的数据库接口模块. DBD::ODBC DBD::ADO 使用DBD::ODBC 如果选用DBD::ODBC,下面的实例代码将展示如何连接到SQL Server数据库: 复制代码 代码如下: use DBI;   # DBD::ODBC   my $dsn = '

  • Linux系统下实现远程连接MySQL数据库的方法教程

    前言 最近在工作中遇到了这个需求,估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统.下面来看看详细的介绍: 步骤 1.在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privileges on *.* to 'root'@'%' identified by 'password'; flush privileges; 第一个*是数据库,可以改成允许访问的数据库名称 第二个 是数据库的表名称,代表允许访问任意的表 r

  • CentOS Linux系统搭建Android开发环境详细介绍

    CentOS Linux系统搭建Android开发环境详细介绍 很多人都是在Windows下进行Android开发,但是对于Linux,Android开发环境方面的资料比较少,今天在网上找到了一位网友分享的在CentOS Linux系统中搭建Android开发环境的过程.下面就是其介绍的配置的详细步骤原文: 由于我最近每天使用的是CentOS 5.5,所以选择CentOS5.5作为我的开发环境. 主要包括以下步骤: 1.JDK安装 2.Eclipse安装 3.ADT安装 4.Android SD

  • linux系统下创建lvm挂载到指定目录的操作步骤

    1 .背景 在企业中有时我们为方便安装软件.数据的管理,需要把安装软件.数据放到固定目录下,磁盘满了方便扩展,这里假如需要一个/data目录存放数据,并单独进行挂载. 2.操作步骤 2.1  划分磁盘 2.2 创建PV [root@centos-6 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created 扫描系统PV可以使用pvscan查看新建的PV [root@centos-6 ~]# pvsca

  • Linux系统中创建SSH服务器别名的两种方法

    前言 如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间.你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名.主机名.SSH 端口号和 IP 地址等.此外,它避免了在 SSH 到 Linux 服务器时重复输入相同的用户名.主机名.IP 地址.端口号. 在 Linux 中创建 SSH 别名 在我知道这个技巧之前,我通常使用以下任意一种方式通过 SSH 连接到远程系统. 使用 IP 地址: $ ssh 192.168.225.22 或使用

  • Unix/Linux系统下的nobody用户与nologin详细介绍

    Unix/Linux系统下的nobody用户是什么? 1.Windows系统在安装后会自动建立一些用户帐户,在Linux系统中同样有一些用户帐户是在 系统安装后就有的,就像Windows系统中的内置帐户一样. 2.它们是用来完成特定任务的,比如nobody和ftp等,我们访问LinuxSir.Org的网页程序时,官网的服务器就是让客户以'nobody'身份登录的(相当于Windows系统中的匿名帐户); 我们匿名访问ftp时,会用到用户ftp或nobody. 3.首先,nobody是一个普通用户

随机推荐