网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)(转载)

本文主要是介绍网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)(转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:https://blog.csdn.net/wenfei11471/article/details/79478105

网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)

wenfei11471 2018-03-07 22:38:48

965

收藏 4

分类专栏: Linux C 语言 文章标签: TCP Linux 网络编程

版权

Linux C 语言 专栏收录该内容

31 篇文章 0 订阅

订阅专栏

  • TCP基础模型
  1. 服务器流程
    1. step 1:创建 socke() 套接字接口并判断

listenfd = socket(AF_INET, SOCK_STREAM, 0);

if (listenfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:绑定 IP 和 Port 并判断

ret = bind(listenfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("bind failed");return -1;}

  1. step 4:监听连接并判断

ret = listen(listenfd, 5);

if (ret == -1)

{perror("listen failed");return -1;}

  1. step 5:接受连接请求并判断

connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);

if (connfd == -1)

{perror("accept failed");return -1;}

printf("connect sucessfully: client IP: %s, Port: %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));

  1. step 6:接收数据并判断

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv failed");return -1;}

printf("recv from client: %s\nrecv %d bytes\n", buf, ret);

  1. step 7:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send failed");return -1;}

printf("send successfully!\n");

  1. step 8:关闭连接

close(connfd);

  1. step 9:检查头文件和变量是否定义

客户端流程

  1. step 1:创建 socke() 套接字接口并判断

connfd = socket(AF_INET, SOCK_STREAM, 0);

if (connfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置服务器 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:发送连接请求并判断

ret = connect(connfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("connect faile");return -1;}

printf("connect sucessfully!\n");

  1. step 4:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send faile");return -1;}

printf("send successfully!");

  1. step 5:接收数据

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv faile");return -1;}

printf("%s\n", buf);

  1. step 6:关闭连接

close(connfd);

  1. step 7:检查头文件和变量是否定义
  • TCP 循环服务器模型
  1. 服务器流程
    1. step 1:创建 socke() 套接字接口并判断

listenfd = socket(AF_INET, SOCK_STREAM, 0);

if (listenfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:绑定 IP 和 Port 并判断

ret = bind(listenfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("bind failed");return -1;}

  1. step 4:监听连接并判断

ret = listen(listenfd, 5);

if (ret == -1)

{perror("listen failed");return -1;}

  1. step 5:设置循环连接

while(1)

  1. step 6:接受连接请求并判断

connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);

if (connfd == -1)

{perror("accept failed");return -1;}

printf("connect sucessfully: client IP: %s, Port: %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));

  1. step 7:循环接收数据,直达条件满足退出

while(1)

  1. step 8:接收数据并判断

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv failed");return -1;}

  1. step 9:设置跳出循环的条件

if (!strncmp("quit", buf, 4))

break;

printf("recv from client: %s\nrecv %d bytes\n", buf, ret);

  1. step 10:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send failed");return -1;}

printf("send successfully!\n");

  1. step 11:关闭连接

close(connfd);

  1. step 12:检查头文件和变量是否定义

客户端流程

  1. step 1:创建 socke() 套接字接口并判断

connfd = socket(AF_INET, SOCK_STREAM, 0);

if (connfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置服务器 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:发送连接请求并判断

ret = connect(connfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("connect faile");return -1;}

printf("connect sucessfully!\n");

  1. step 4:设置数据循环,并获取标准输入的数据

while (1)

{fgets(buf, sizeof(buf), stdin);

buf[strlen(buf)-1] = '\0';

...}

  1. step 5:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send faile");return -1;}

printf("send successfully!");

  1. step 6:设置退出条件

if (!strncmp("quit", buf, 4))

break;

  1. step 7:接收数据

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv faile");return -1;}

printf("%s\n", buf);

  1. step 8:关闭连接

close(connfd);

  1. step 9:检查头文件和变量是否定义
  • TCP 并发服务器模型
  1. 服务器流程
    1. step 1:创建 socke() 套接字接口并判断

listenfd = socket(AF_INET, SOCK_STREAM, 0);

if (listenfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:绑定 IP 和 Port 并判断

ret = bind(listenfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("bind failed");return -1;}

  1. step 4:监听连接并判断

ret = listen(listenfd, 5);

if (ret == -1)

{perror("listen failed");return -1;}

  1. step 5:设置信号处理防止僵尸进程

signal(SIGCHLD, SIG_IGN);

  1. step 6:设置循环建立连接

while(1)

  1. step 7:接受连接请求并判断

connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);

if (connfd == -1)

{perror("accept failed");return -1;}

printf("connect sucessfully: client IP: %s, Port: %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));

  1. step 8:创建子进程并判断

pid = fork();

if (pid == -1)

{perror("fork create");return -1}

  1. step 9:设置父进程关闭连接并重新建立链接

if (pid > 0)

{close(connfd);continue;}

  1. step 10:子进程关闭监听,并循环接收数据

close(listenfd);

while(1)

  1. step 11:接收数据并判断

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv failed");return -1;}

  1. step 12:设置跳出循环的条件

if (!strncmp("quit", buf, 4))

break;

printf("recv from client: %s\nrecv %d bytes\n", buf, ret);

  1. step 10:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send failed");return -1;}

printf("send successfully!\n");

  1. step 11:关闭连接同时退出进程

close(connfd);

exit(0);

  1. step 12:检查头文件和变量是否定义

客户端流程

  1. step 1:创建 socke() 套接字接口并判断

connfd = socket(AF_INET, SOCK_STREAM, 0);

if (connfd == -1)

{perror("socket failed");return -1;}

  1. step 2:设置服务器 IP 和 Port

memset (&seraddr, 0, sizeof(seraddr));

seraddr.sin_family = AF_INET;

seraddr.sin_port = htons(8888);

seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  1. step 3:发送连接请求并判断

ret = connect(connfd, (struct sockaddr *)&seraddr, sizeof(seraddr));

if (ret == -1)

{perror("connect faile");return -1;}

printf("connect sucessfully!\n");

  1. step 4:设置数据循环,并获取标准输入的数据

while (1)

{fgets(buf, sizeof(buf), stdin);

buf[strlen(buf)-1] = '\0';

...}

  1. step 5:发送数据并判断

ret = send(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("send faile");return -1;}

printf("send successfully!");

  1. step 6:设置退出条件

if (!strncmp("quit", buf, 4))

break;

  1. step 7:接收数据

ret = recv(connfd, buf, sizeof(buf), 0);

if (ret == -1)

{perror("recv faile");return -1;}

printf("%s\n", buf);

  1. step 8:关闭连接

close(connfd);

  1. step 9:检查头文件和变量是否定义

这篇关于网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)(转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506915

相关文章

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解