基于TCP的全双工网络编程实践

2024-01-15 09:44

本文主要是介绍基于TCP的全双工网络编程实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先我们先了解一下什么是全双工通信?

全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信相当于是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

TCP服务端代码:

#include <stdio.h>             
#include <stdlib.h>           
#include <string.h>
#include <arpa/inet.h>             
#include <netdb.h>              
#include <netinet/in.h>       
#include <stdint.h>                       
#include <sys/socket.h>     
#include <sys/types.h>     
#include <unistd.h>      #define PORT 10000  void error()
{perror("Socket Creation Failed");exit(EXIT_FAILURE);
}int main()
{uint32_t sockfd,conn; char recvbuff[1024],sendbuff[1024]; struct sockaddr_in server_addr,client_addr;  socklen_t ClientLen; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){error();  }bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);printf("Server is running...\n");int on=1;if((setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0){perror("setsockopt failed");exit(EXIT_FAILURE);}if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){error(); }listen(sockfd, 5);printf("Server is listening...\n");conn = accept(sockfd, (struct sockaddr *)NULL, NULL);printf("Server is connected...\n");pid_t pid;pid = fork();if (pid == 0)  //子进程负责接收数据{while (1){bzero(&recvbuff, sizeof(recvbuff));recv(conn, recvbuff, sizeof(recvbuff), 0);printf("\nCLIENT : %s\n", recvbuff);sleep(5);}}else  //父进程负责发送发送数据{while (1){bzero(&sendbuff, sizeof(sendbuff));printf("\nType message here: ");fgets(sendbuff, 1024, stdin);send(conn, sendbuff, strlen(sendbuff) + 1, 0);printf("\nMessage Sent!\n");sleep(5);}}close(sockfd);printf("Server is offline...\n");return 0;
}

TCP服务端运行状态:

TCP客户端代码:

#include <stdio.h>             
#include <stdlib.h>          
#include <string.h> 
#include <arpa/inet.h>             
#include <netdb.h>               
#include <netinet/in.h>          
#include <stdint.h>                   
#include <sys/socket.h>     
#include <sys/types.h>     
#include <unistd.h>   #define PORT 10000  void error()
{perror("Socket Creation Failed");exit(EXIT_FAILURE);
}int main()
{uint32_t sockfd; char sendbuff[1024],recvbuff[1024]; struct sockaddr_in server_addr; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){error();}bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);printf("Client is running...\n");connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));printf("Client is connected...\n");pid_t pid;pid = fork();if (pid == 0)  //子进程{while (1){bzero(&sendbuff, sizeof(sendbuff));printf("\nType message here: ");fgets(sendbuff, 1024, stdin);send(sockfd, sendbuff, strlen(sendbuff) + 1, 0);printf("\nMessage sent!\n");sleep(5);}}else  //父进程{while (1){bzero(&recvbuff, sizeof(recvbuff));recv(sockfd, recvbuff, sizeof(recvbuff), 0);printf("\nSERVER: %s\n", recvbuff);sleep(5);}}close(sockfd);printf("Client is offline...\n");return 0;
}

TCP客户端运行状态:

有时候我们会遇到这样的问题,当你第二次第三次......运行程序的时候,报如下的问题:

Socket Creation Failed: Address already in use

解决方法:

    int on=1;
    if((setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
    {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

【欢迎关注编码小哥,学习更多实用的编程方法】

这篇关于基于TCP的全双工网络编程实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal