网络通信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

相关文章

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型